我正在尝试确定在执行以下操作后应将各种标志设置为(进位,符号,零,溢出):
mov ax, 7ff0h; ax register is now 7ff0h
add al, 10h;
我对汇编处理这个问题感到困惑。因为我们只添加包含f0h
的寄存器的al部分,f0h + 10h
给出100h
。这会设置溢出标志吗?携带旗帜?都不是?我认为溢出标志会被设置,但是,我想到的另一种可能性是程序检测到这一点并自动将7fh
的{1}}寄存器改为80h
,使得ax
完整注册8000h
。理论上这不会设置进位标志,而是设置符号标志和溢出标志,因为我们的总数8000h
现在是负数。有谁可以解释这是如何处理的?
感谢。
答案 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]