在状态标志方面我很困惑。有人可以帮助我通过一个例子和我需要采取的步骤来验证标志的行为吗?
mov ah, 21
mov al, -21
cmp ah,al
有人可以帮我确定CF,ZF,SF和OF的行为吗?
由于
答案 0 :(得分:0)
您可以在调试器中查看eflags
寄存器(如gdb)。有很多关于eflags的易于访问的文档,但是寄存器中的位基本上是0或1,具体取决于是否设置了特定的状态标志。
如果仅仅看到调试器中的值是不够的,并且您需要对它们执行某些操作:
你可以将eflags
推入堆栈(pushfl
适用于我),然后将堆栈弹出到通用寄存器。
您可以使用jc
,jz
,jo
和js
指令跳转到指定标签,如果进位,零,溢出或设置了标志标志。
例如:
clc # clear carry flag (set CF = 0)
addl eax, 0xffffffff # some operation that might change status flags
jc label1 # if the carry flag is set, jump to label
... # instructions to execute if carry not set (CF = 0)
jmp label2
label1:
... # instructions to execute if carry set (CF = 0)
label2:
... # resume execution which does not depend on CF