Введение
Флаг процессора, указывающий, произошел ли неозначенный арифметический переполнение В компьютерных процессорах флаг переноса (обычно обозначенный как флаг C) представляет собой один бит в регистре состояния системы / регистре флага, используемом для указания того, когда арифметический перенос или заимствование были сгенерированы из наиболее значимой позиции бита арифметической логической единицы (ALU). Флаг переноса позволяет добавлять/вычитать числа, большее, чем ширина одного ALU, путем переноса (добавления) двоичной цифры от частичного сложения/вычитания до наименее значимой битовой позиции более значимого слова. Это обычно программируется пользователем процессора на уровне сборки или машинного кода, но также может происходить внутри некоторых процессоров, через цифровую логику или микрокод, где некоторые процессоры имеют более широкие регистры и арифметические инструкции, чем (комбинаторные или "физические") ALU. Он также используется для расширения битовых сдвигов и вращения аналогичным образом на многих процессорах (иногда это делается через выделенный флаг). Для вычитающих операций используются две (противоположные) конвенции, поскольку большинство машин устанавливают флаг переноса на заимствование, в то время как некоторые машины (например, 6502 и PIC) вместо этого перезагружают флаг переноса на заимствование (и наоборот).
In computer processors the carry flag (usually indicated as the C flag) is a single bit in a system status register/flag register used to indicate when an arithmetic carry or borrow has been generated out of the most significant arithmetic logic unit (ALU) bit position. The carry flag enables numbers larger than a single ALU width to be added/subtracted by carrying (adding) a binary digit from a partial addition/subtraction to the least significant bit position of a more significant word. This is typically programmed by the user of the processor on the assembly or machine code level, but can also happen internally in certain processors, via digital logic or microcode, where some processors have wider registers and arithmetic instructions than (combinatorial, or "physical") ALU. It is also used to extend bit shifts and rotates in a similar manner on many processors (sometimes done via a dedicated flag). For subtractive operations, two (opposite) conventions are employed as most machines set the carry flag on borrow while some machines (such as the 6502 and the PIC) instead reset the carry flag on borrow (and vice versa).
Применение
На флаг переноса влияет результат большинства арифметических (и обычно нескольких битных) инструкций, а также используется в качестве ввода для многих из них. Некоторые из этих инструкций имеют две формы, которые либо читают, либо игнорируют ношение. В языках сборки эти инструкции представлены мнемониками, такими как 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 Flag, набор Sign Flag и Clear Overflow Flag. Если 11111111 представляет собой двухдополнительное целое число с подписью −1 (ADD al, 1), то интерпретация результата равна 2, потому что флаг переполнения ясен, а флаг переноса игнорируется. Знак результата отрицательный, потому что Знак флага установлен. 11111110 - это форма дополнения двух знаков -2. Если 11111111 представляет собой неподписанное целое двоичное число 255 (ADD al,255), то интерпретация результата будет 254, что не корректно, потому что самый значимый бит результата попал в флаг Carry, который, следовательно, не может быть проигнорирован. Флаг переполнения и флаг знака игнорируются. Другим примером может быть 8-битовый регистр с битовой структурой 01010101 и флагом переноса; если мы выполним инструкцию по вращению слева через флаг переноса, результатом будет 10101011 с флагом переноса, очищенным, потому что самый значимый бит (бит 7) был повернут в carry, в то время как carry был повернут в наименее значимый бит (бит 0). Ранние микропроцессоры Intel 4004 и Intel 8008 имели специальные инструкции для настройки и сброса флага переноса. Однако более поздние Intel 8080 (и Z80) не включали в себя явно сброшенный опкод переноса, поскольку это можно было сделать одинаково быстро через одну из битовых инструкций AND, OR или XOR (которые не используют флаг переноса). Флаг переноса также часто используется после инструкций по сравнению, которые обычно реализуются путем вычитания, чтобы можно было принять решение о том, какое из двух сравниваемых значений меньше (или больше или равно) другому. Инструкции по ветвям, которые исследуют флаг переноса, часто представлены мнемониками, такими как BCC и BCS, чтобы разветвиться, если перенос ясен, или разветвиться, если перенос установлен соответственно. При использовании таким образом флаг "перемещение" обеспечивает механизм для сравнения значений в виде неподписанных целых чисел. Это отличается от флага переполнения, который обеспечивает механизм для сравнения значений как значений целочисленных чисел.