我的一项家庭作业如下:
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
在 'Code 1:' 我期望 OF=0 和 CF=1
在 'Code 2:' 我期望 CF=1
'Code 3:' 它的输出是正确的
有人能告诉我为什么会这样吗?如果在计算机完成计算之前立即数超出范围(如“代码 1:”)怎么办。我知道无论是签名还是未签名的号码,计算机都不知道。
顺便说一句:我在这里第一次问。如果我做错了什么,如果您能指出并告诉我正确的方法,我将不胜感激。:)