2011-12-13 2 views
13

У меня есть следующий код:Монтаж - Флаг переноса VS флаг переполнения

mov al, -5 
add al, 132 
add al, 1 

Как я проверить это, флаг переполнения и флаг переноса будет установлен в первой операции, а во-вторых, только перелива будет установлен.

Но я не понимаю, почему:

  1. В число без знака, то результат будет 143 (8FH), и для этого годен 8-разрядное целое число без знака (меньше 255) => перенос флаг не должен быть установлен. В подписанном числе результат равен 127, он подходит для 8-битной подписки, и переполнение не должно быть установлено.

Что-то не так? Благодарю.

ответ

13

В беззнаковой арифметике вы добавили 0xFB в 0x84, то есть 251 + 132, который действительно больше 8-бит, и поэтому установлен флаг переноса.

Во втором случае вы добавляете +127 в 1, что действительно превышает подписанный 8-битный диапазон, и поэтому установлен флаг переполнения.

+0

Таким образом, переполнение устанавливается только тогда, когда я добавляю al, 1 '? Если я удалю эту строку, переполнение не будет установлено? –

+1

@Tom: переполнение будет задано командами 'add'. –

+0

Итак, вы можете объяснить мне, пожалуйста, где переполнение? потому что, как я понял, диапазон от -128 до 127 не влияет на переполнение. –

21

Переполнение происходит, когда результат добавления двух положительных чисел отрицательный или результат добавления двух отрицательных чисел положителен. Например: +127+1=?

+127=0111 1111 
    +1=0000 0001 
    --------- 
    1000 0000 

Как мы смотрим на знак битах двух операндов и знаковый бит В результате, мы видим, что произошло переполнение и ответ неверен.

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