x86 sbb 与第一个和第二个操作数具有相同的寄存器

逆向工程 部件 x86
2021-06-13 19:26:02

我正在分析一系列x86指令,并对以下代码感到困惑:

135328495: sbb edx, edx
135328497: neg edx
135328499: test edx, edx
135328503: jz 0x810f31c

据我所知,sbb等于des = des - (src + CF),换句话说,第一指令以某种方式将-CFedx然后将其negtive -CF转化为CF,并且test是否CF等于零??

但请注意jz检查标志ZF,而不是CF那么基本上上面的代码序列试图做什么?这是一个合法的x86指令序列,由g++version产生4.6.3

1个回答

sbb edx, edx 语句将 0 或 -1 写入 edx,仅取决于进位标志的值。下面的 neg edx 仅仅反映了初始进位标志的值。因此,您序列中的 jz 只不过是一个 jnc 语句(非进位上的 jmp)。然而,这个序列可以通过一个额外的、前面的否定来找到。neg 语句清除零情况下的进位,否则设置它。此序列可用作真假测试,具体取决于 edx 是否具有任意的非零值 (true) 或零值 (false)。带有附加否定的序列将如下所示:

neg edx          ; clears the carry flag in the zero case, otherwise sets it
sbb edx, edx     ; if (cf == 0) then edx == 0, else edx == -1
neg edx          ; remains zero if initially edx has been zero, else 1
test edx, edx    ;
jz toSomewhere   ; jmp on edx having been zero initially

顺便说一句,这是我计划进行倒车测验的问题之一。

玩得开心!