Вычитание не равно сложению дополнения до двух на x86. Чтобы понять, какое значение примет флаг переноса, вы должны вместо этого выполнить длинное вычитание:
0000 0100
- 0000 1100
-------------
1 1111 1000
Видите, как в конце остается заимствование? Это заимствование устанавливает флаг переноса (т. е. перенос равен заимствованию).
Некоторые другие архитектуры, такие как ARM, действительно реализуют вычитание как сложение, но они делают это не как сложение дополнения до двух, а скорее как сложение дополнения до единицы и дополнительного переноса. Это важно при вычитании 0.
Например, ваш метод даст 12 − 0:
0000 1100
+ 0000 0000 (- 0000 0000 => + 0000 0000)
-------------
0 0000 1100
с четким переносом. Но то, что происходит на самом деле,
0000 1100
+ 1111 1111 (- 0000 0000 => +1111 1111 + 1)
+ 1
-------------
1 0000 1100
с переноской. Эта деталь важна, так как в противном случае сравнение с 0 не будет работать корректно. В этой схеме перенос указывается всякий раз, когда нет заимствования (т. е. перенос дополняется заимствованием).
То, как это делает Intel, и то, как это делает ARM, на самом деле всегда дает один и тот же результат, за исключением того, что флаг переноса работает наоборот. Таким образом, всякий раз, когда ARM устанавливала перенос, Intel очищала его, и наоборот.
Оба подхода к семантике вычитания довольно распространены. Подход ARM немного проще в реализации, поскольку он позволяет напрямую использовать сумматор для вычитания, вообще не касаясь переноса. С подходом Intel ввод и вывод должны дополняться при выполнении вычитания, но дополнительные вентили для этого действительно не имеют значения в общей схеме вещей. С другой стороны, подход Intel более интуитивен для программистов, поскольку представление о флаге переноса, а также о том, что заимствование, имеет больше смысла, если вы визуализируете выполняемую операцию как длинное вычитание.
person
fuz
schedule
20.11.2020
1111 0100
, который процессор интерпретирует как 244 для целей CF. Это ваша работа - консультироваться с CF или OF в зависимости от того, хотите ли вы неподписанный или подписанный. - person Jester   schedule 21.11.2020