-1

我的一项家庭作业如下:

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:”)怎么办。我知道无论是签名还是未签名的号码,计算机都不知道。

顺便说一句:我在这里第一次问。如果我做错了什么,如果您能指出并告诉我正确的方法,我将不胜感激。:)

4

1 回答 1

0

80h位模式的有符号 2 的补码解释是-128. 这对于如何sub设置 OF 很重要。另请参阅了解有符号与无符号的进位与溢出条件/标志。

-80h是相同的值,并将汇编为相同的机器代码。

于 2019-11-03T13:51:18.693 回答