如果在有符号数操作之前立即数超出范围怎么办

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 到相同的机器代码。