汇编语言 - 标志设置让我头疼

时间:2013-02-21 12:20:37

标签: assembly x86 flags cpu-registers

我正在尝试确定在执行以下操作后应将各种标志设置为(进位,符号,零,溢出):

mov ax, 7ff0h;       ax register is now 7ff0h

add al, 10h;         

我对汇编处理这个问题感到困惑。因为我们只添加包含f0h的寄存器的al部分,f0h + 10h给出100h。这会设置溢出标志吗?携带旗帜?都不是?我认为溢出标志会被设置,但是,我想到的另一种可能性是程序检测到这一点并自动将7fh的{​​1}}寄存器改为80h,使得ax完整注册8000h。理论上这不会设置进位标志,而是设置符号标志和溢出标志,因为我们的总数8000h现在是负数。有谁可以解释这是如何处理的?

感谢。

2 个答案:

答案 0 :(得分:1)

ADD指令的英特尔说明手册:

  

ADD指令执行整数加法。它评估两个签名的结果   和无符号整数操作数,并设置OF和CF标志以指示进位(溢出)   分别在签名或未签名的结果中。 SF标志表示符号   签署的结果。

在调试器中运行一个简单测试,我们可以看到CF标志已设置,只有形成AL的位被更改:

.386
.MODEL FLAT

.STACK 1024

ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD

.CODE
_start:
    XOR EAX,EAX
    MOV AX,7ff0h
    ADD AL,10h
    PUSH 0  ;EAX is now 0x00007F00
    CALL ExitProcess

PUBLIC _start
END

答案 1 :(得分:1)

我使用debug命令(x86 Windows附带)玩了一下:

-a 100
1A2F:0100 mov ax, 7ff0
1A2F:0103 add al, 10
1A2F:0105
-t =100 2

AX=7FF0  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0103   NV UP EI PL NZ NA PO NC
1A2F:0103 0410          ADD     AL,10

AX=7F00  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=1A2F  ES=1A2F  SS=1A2F  CS=1A2F  IP=0105   NV UP EI PL ZR NA PE CY
1A2F:0105 0000          ADD     [BX+SI],AL                         DS:0000=CD
-

NV [无溢出] PL(正面) CY [Carry]