2017-01-25 4 views
2

Я знаю, что флаг Carry в течение SUB устанавливается каждый раз, когда minuend меньше вычитаемого и требуется заимствование, но не смог найти ничего более подробного объяснения этого.Как установлен флаг переноса, когда вычитание больше?

Поскольку вычитание на самом деле просто добавляется с дополнением двух, как ЦП знает, что вычитание больше, а заимствование произошло?

Единственное, о чем я могу думать, это то, что, возможно, флаг Carry устанавливается автоматически во время SUB, всякий раз, когда он преобразует вычитание в его дополнение 2. Затем, если не произойдет другого Carry (как и во время добавления, когда minuend больше, чем вычитаемый), чтобы отключить его, он остается включенным.

Или я в отъезде?

+3

Вы чрезмерно усложнять ее. Процессор не знает о дополнении 2. ALU вычитает операнды, и полученный перенос переходит в этот флаг 'C'. Он также установит флаг 'O' от выполнения к m.s. немного. И флаг 'S', чтобы отразить m.s. немного. И флаг 'Z', если результат был' 0'. Другие флаги тоже зависят от процессора. * Как это делается? Это не «язык». –

+1

Перенос от преобразования отбрасывается, выходной перенос - это отрицание переноса из добавления. Некоторые архитектуры фактически не отрицают его, поэтому вы фактически получаете CF = 1, когда нет заимствований. – Jester

+0

вычитание делается в unsigned, поэтому не нужно знать о типе. Флаг переноса проверяется выходными битами –

ответ

1

Вы, кажется, путаете флаги переноса и переполнения.
Флаг переноса проверяет неподписанное переполнение, а флаг переполнения проверяет переполнение подписей.
Как это работает, так это то, что перед вычитанием сравниваются (без знака) числа и если b> a, тогда устанавливается CF.
Если знак первого операнда изменяет значение переполнения.

Во время вычитания ЦПУ не заботится о том, являются ли операнды отрицательными.
Если база без знака меньше вычитаемого без знака числа, то происходит перенос.

E.g. (Только испытания с точки зрения процессора моего отладчика)

0 - -1 = 1 ->> CF = 1, because 0xFFFFFFFF > 0 
10 - -1 = 11 ->> CF = 1, same reason 
-2 - 4 = -6 ->> CF = 0, because 0x4 < 0xFFFFFFFE 

Помните, в знаковой арифметики эти результаты являются правильными, но без знака арифметике они * способ * выключен, поэтому CF = 1.

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

Вот список наиболее распространенных флагов и их функции:

code | descripton  |name  | When set 
---+++----------------+---------+------------------- 
CF unsigned overflow Carry  If unsigned over-/underflow occurs 
OF signed overflow Overflow If sign bit (MSB) flips 
SF Sign flag   Sign  If MSB is set, i.e. is result is negative 
ZF Zero flag   Zero  If Result is zero 

Ни один из этих флагов имеют много на пути «интеллекта».
Необходимо помнить, что эти флаги были спроектированы, когда транзисторы были в дефиците.

О 2 дополнением
2 дополнением разработан таким образом, что сложение и вычитание не нужно знать о конверсии с положительного на отрицательный.
Вы можете просто добавить и вычесть без осторожности, если операнд или результат будут положительными или отрицательными.
Единственные предостережения возникают при переполнении, что является тем, что проверяет флаг переноса.

Если вы используете инверсию (например, дополнение 1) как отрицательные числа, тогда вам понадобятся всевозможные меры предосторожности при добавлении и вычитании; вот почему 2-й вариант универсально используется.

Дальнейшее чтение
http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt
Спасибо Peter

+0

Для дополнения, число, подлежащее вычитанию, просто дополняется (дополнение). Во время добавления, если есть перенос, результат увеличивается. Некоторые старые компьютеры (например, CDC 3000 series) использовали свое дополнение. – rcgldr

Смежные вопросы