Одно из моих домашних заданий выглядит следующим образом:
mov al,77h
sub al,80h
AL=_______
CF=_______
OF=_______
Когда я впервые увидел его, я подумал, что результат положительного числа минус положительное число не переполнится. И я только что сделал OF равным 0.
Но мой ассемблерный код показывает, что OF = 1.
Я использую MASM6.15, 32-битная консольная среда
Вот мой код и вывод:
Код 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
In 'Код 1:' Я ожидаюOF = 0 и CF = 1
В 'Коде 2:' Я ожидаю, что CF = 1
'Код 3:' его вывод правильный
Может кто-нибудь сказать мне, почему это так и что еслинепосредственный номер выходит за пределы диапазона, например «Код 1:», до того, как компьютер завершит свою работу. Я знаю, что независимо от того, подписан или не подписан номер, компьютер просто не знает об этом.
Кстати: мой первый вопрос здесь. Если есть что-то, что я сделал неправильно, я буду признателен, если вы укажете на это и скажете мне правильный способ сделать это. :)