Что делать, если непосредственное число выходит за пределы диапазона до операций с числами со знаком
Одно из моих домашних упражнений выглядит следующим образом:
mov al,77h
sub al,80h
AL=_______
CF=_______
OF=_______
Когда я впервые увидел это, я подумал, что результат "положительное число минус положительное число" не переполнится. И я просто сделал OF равным 0.
Но мой ассемблерный код показывает мне, что OF=1.
Я использую 32-битную консольную среду MASM6.15
Вот мой код и результат:
Код 1:
; eg000000.asm in Windows Console
include io32.inc
.data
.code
start:
mov al,77h ;119
sub al,80h ;128
call disprf ;show those 6 flags
call dispbd ;binary
call dispcrlf
call disphd ;hexadecimal
exit 0
end start
Выход 1:
OF=1, SF=1, ZF=0, AF=0, PF=0, CF=1
000000000001100111111111 1111 0111
0019FFF7
Код 2:
; eg000000.asm in Windows Console
include io32.inc
.data
.code
start:
mov al,77h
add al,-80h ;-128
call disprf
call dispbd
call dispcrlf
call disphd
exit 0
end start
Выход 2:
OF=0, SF=1, ZF=0, AF=0, PF=0, CF=0
000000000001100111111111 1111 0111
0019FFF7
Код 3:
; eg0000.asm in Windows Console
include io32.inc
.data
.code
start:
mov al,77h
sub al,7fh ;127
call disprf
call dispbd
call dispcrlf
call disphd
exit 0
end start
Выход 3:
OF=0, SF=1, ZF=0, AF=1, PF=0, CF=1
000000000001100111111111 1111 1000
0019FFF8
В 'Код 1:' я ожидаю OF=0 и CF=1
'В' Код 2:'Я ожидаю CF=1
' Код 3:'вывод правильный
Может ли кто-нибудь сказать мне, почему это так и что, если непосредственное число выходит за пределы диапазона, такого как "Код 1:", до того, как компьютер завершит свои вычисления. Я знаю, что независимо от числа со знаком или без знака, компьютер просто не знает об этом.
BTW: Мой первый вопрос здесь. Если я что-то сделал не так, я буду признателен, если вы укажете на это и подскажете, как это сделать правильно.:)
1 ответ
Подписанное 2-дополнительное толкование 80h
битовый шаблон -128
. Вот что важно для того, какsub
наборы. См. Также Общие сведения об условиях / флагах переноса и переполнения для подписанных и неподписанных.
-80h
имеет то же значение и будет собираться в один и тот же машинный код.