2

我试图确定在以下操作之后应该设置哪些各种标志(进位、符号、零、溢出):

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

add al, 10h;         

我对汇编如何处理这个感到困惑。因为我们只添加到寄存器的 al 部分,其中包含f0h,f0h + 10h给出100h. 这是否设置了溢出标志?携带标志?两者都不?我认为会设置溢出标志,但是,我想到的另一种可能性是程序检测到这一点并自动将 ah 寄存器从 更改7fh80h,从而使ax寄存器完整8000h。这在理论上不会设置进位标志,而是设置符号标志和溢出标志,因为我们的总数8000h现在是负数。谁能解释这是如何处理的?

谢谢。

4

2 回答 2

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
于 2013-02-21T12:45:16.373 回答
1

我玩了一下调试命令(随 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 [进位]

于 2013-02-21T13:05:30.330 回答