Флаг переноски - Carry flag

В компьютерных процессорах флаг переноса (обычно указываются как флаг C ) является единственным бит в системе регистра состояния / флаге регистра используется для указания , когда арифметический перенос или заемы был сформирован из наиболее значимых арифметико - логического устройства (АЛУ) бит позиция. Флаг переноса позволяет номера больше , чем быть добавлено / вычтен путем проведения (добавление) двоичное числа от частичного сложения / вычитания с одной шириной ALU наименее значимого битовой позиции более значительного слова. Он также используется для расширения битовых сдвигов и вращения аналогичным образом на многих процессорах (иногда это делается с помощью специального флага X ). Для операций вычитания используются два (противоположных) соглашения, поскольку большинство машин устанавливают флаг переноса при заимствовании, в то время как некоторые машины (такие как 6502 и PIC ) вместо этого сбрасывают флаг переноса при заимствовании (и наоборот).

Использует

Флаг переноса зависит от результата большинства арифметических (и обычно нескольких побитовых) инструкций, а также используется в качестве входных данных для многих из них. Некоторые из этих инструкций имеют две формы, которые либо читают, либо игнорируют перенос. В языках ассемблера эти инструкции представлены мнемониками, такими как ADD/SUB, ADC/SBC( ADD/SUBвключая перенос), SHL/SHR( сдвиг битов ), ROL/ROR(вращение битов), RCR/RCL(вращение посредством переноса) и т. Д. Использование флага переноса таким образом позволяет выполнять операции сложения, вычитания, сдвига и поворота из нескольких слов .

Например, если сложить 255 и 255, используя 8-битные регистры. Результат должен быть 510, что является 9-битным значением 111111110в двоичном формате. 8 младших значащих битов, которые всегда хранятся в регистре, будут 11111110двоичными (254 десятичных), но поскольку есть перенос бита 7 (восемь бит), перенос устанавливается, указывая, что результат требует 9 бит. Действительный 9-битный результат - это соединение флага переноса с результатом.

Для x86 ALU размером 8 бит, 8-битной интерпретации дополнения до двух, операция сложения 11111111+ 11111111приводит к 111111110, Carry_Flagset, Sign_Flagset и Overflow_Flagclear.

Если 11111111представляет собой дополненное до двух целое число со знаком -1 ( ADD al,-1), тогда интерпретация результата будет -2, потому что Overflow_Flagон ясен и Carry_Flagигнорируется. Знак результата отрицательный, т.к. Sign_Flagустановлен. 11111110является дополнением до двух целого числа со знаком −2.

Если 11111111представляет собой беззнаковое целое двоичное число 255 ( ADD al,255), тогда интерпретация результата будет 254, что неверно, потому что старший бит результата перешел в число Carry_Flag, которое, следовательно, не может быть проигнорировано. Символы Overflow_Flagи Sign_Flagсимволы игнорируются.

Другим примером может быть 8-битный регистр с битовой комбинацией 01010101и установленным флагом переноса; если мы выполним команду поворота влево через перенос , результат будет 10101011со сброшенным флагом переноса, потому что самый старший бит (бит 7) был повернут в перенос, а перенос был повернут в младший значащий бит (бит 0).

Ранние микропроцессоры Intel 4004 и Intel 8008 имели особые инструкции для явной установки, а также сброса флага переноса. Однако более поздние Intel 8080Z80 ) не включали явный код операции переноса сброса, поскольку это можно было сделать так же быстро с помощью одной из команд побитового И, ИЛИ или XOR (которые не используют флаг переноса).

Флаг переноса также часто используется после инструкций сравнения, которые обычно реализуются посредством операций вычитания, чтобы можно было принять решение о том, какое из двух сравниваемых значений ниже (или больше или равно) другому. Инструкции перехода, которые проверяют флаг переноса, часто представлены мнемониками, такими как BCCи BCSto branch, если перенос очищен, или переход, если перенос установлен соответственно. При таком использовании флаг переноса обеспечивает механизм для сравнения значений как целых чисел без знака. Это контрастирует с флагом переполнения, который предоставляет механизм для сравнения значений как целочисленных значений со знаком.

Против. заимствовать флаг

Хотя флаг переноса четко определен для сложения, существует два общих способа использования флага переноса для операций вычитания.

Первый использует бит как флаг заимствования, устанавливая его, если a < b при вычислении a - b , и заимствование должно быть выполнено. Если ab , бит очищается. Команда вычитания с помощью заимствования ( SBB) вычислит a - b - C = a - ( b + C ), в то время как вычитание без заимствования ( SUB) действует так, как если бы бит заимствования был очищен. Семейства 8080 , 6800 , Z80 , 8051 , x86 и 68k (среди прочих) используют бит заимствования.

Второй использует тождество - x = ( не x ) +1 напрямую (т.е. без сохранения инвертированного бита переноса) и вычисляет a - b как a + (не b ) +1. Флаг переноса устанавливается в соответствии с этим сложением, и вычитание с переносом вычисляет a + not ( b ) + C , в то время как вычитание без переноса действует так, как если бы был установлен бит переноса. В результате бит переноса устанавливается, если ab , и очищается, если a < b . Это соглашение используется в процессорах System / 360 , 6502 , MSP430 , COP8 , ARM и PowerPC . 6502 является особенно известным примером, поскольку в нем нет операции вычитания без операции переноса, поэтому программисты должны убедиться, что флаг переноса установлен перед каждой операцией вычитания, когда заимствование не требуется.

Резюме различных вариантов использования флага переноса при вычитании
Носите или
одалживайте бит
Вычесть без
переноса / заимствования
Вычесть
с заимствованием
Вычесть
с переносом
C = 0 а - б
= а + не ( б ) + 1
а - б - 0
= а + не ( б ) + 1
а - б - 1
= а + не ( б ) + 0
С = 1 а - б - 1
= а + не ( б ) + 0
а - б - 0
= а + не ( б ) + 1

Чаще всего первая альтернатива называется «вычитанием с заимствованием», а вторая - «вычитанием с переносом». Однако есть исключения в обоих направлениях; в VAX , NS320xx и Atmel AVR архитектура использует заема битовые конвенции, но называть их - Ь - С операцией «вычесть с переносом» ( , и ). Архитектуры PA-RISC и PICmicro используют соглашение о битах переноса, но называют свою операцию a + not ( b ) + C «вычитание с заимствованием» ( и ). SBWCSUBCSBCSUBBSUBWFB

В ST6 8-разрядные микроконтроллеры являются , пожалуй, наиболее запутанным из всех. Хотя у них нет какой-либо инструкции «вычитание с переносом», у них есть бит переноса, который устанавливается инструкцией вычитания, и соглашение зависит от модели процессора. Процессор ST60 использует соглашение о переносе, а процессоры ST62 и ST63 используют соглашение о заимствовании.

Смотрите также

использованная литература

внешние ссылки