如果在有符号数操作之前立即数超出范围怎么办
What if an immediate number is out of range before signed number operations
我的一个作业练习如下:
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:' 它的输出是正确的
有人能告诉我这是为什么吗?如果在计算机完成计算之前立即数超出范围,如 'Code 1:' 怎么办。我知道无论有符号数还是无符号数,计算机都不知道。
顺便说一句:我第一次在这里问。如果我做错了什么,如果你能指出并告诉我正确的做法,我将不胜感激。:)
80h
位模式的有符号 2 的补码解释为 -128
。这就是 sub
如何设置 OF 的关键。另见 Understanding Carry vs. Overflow conditions/flags for signed vs. unsigned.
-80h
是相同的值,将 assemble 到相同的机器代码。
我的一个作业练习如下:
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:' 它的输出是正确的
有人能告诉我这是为什么吗?如果在计算机完成计算之前立即数超出范围,如 'Code 1:' 怎么办。我知道无论有符号数还是无符号数,计算机都不知道。
顺便说一句:我第一次在这里问。如果我做错了什么,如果你能指出并告诉我正确的做法,我将不胜感激。:)
80h
位模式的有符号 2 的补码解释为 -128
。这就是 sub
如何设置 OF 的关键。另见 Understanding Carry vs. Overflow conditions/flags for signed vs. unsigned.
-80h
是相同的值,将 assemble 到相同的机器代码。