重构c代码:movsx带测试指令

逆向工程 x86 C 静态分析
2021-07-01 12:01:44

我刚开始学习从汇编指令中重构 C 代码。

我有以下汇编代码:

mov eax dword ptr [ebp+8]
add eax, dword ptr[ebp-4]
movsx ecx, byte ptr [eax]
test ecx, ecx
jne XXXXX
comp dword ptr [ebp-4], ffh
jle XXXX

我想重建这些线路的条件,但我有一些问题或不确定的事情:我重新构建了以下内容:

让,ebp+8= param1ebp-4 = i

if(param1[i]!=’\0’ || i<=0xff){
…
}

但我想知道这一行:

movsx ecx, byte ptr [eax]

据我了解,movsx它将一个带符号的值移动到一个寄存器中并用 1 对其进行符号扩展。因此,ecxshouble 看起来像0xFFFFFF<eax>. 因为只有byte ptr eaxeax的低字节 ( ) 被移动并且 ecx 被扩展了 1。我哪里错了?

1个回答

您可能希望熟悉二进制补码表示法。它只会将符号位 (msb) 扩展到更大的寄存器中。因此,msb 将扩展为所有附加位 -- sxxxxxxx -> sssssssssssssssssssssssxxxxxxx

例如,如果指向的字节值为eax1 (0b00000001),ecx则为 1 (0b00000000000000000000000000000001)。类似地,如果它是二进制补码字节中可能的最大正数,则 127 (0b01111111)ecx也是 127 (0b00000000000000000000000001111111)。

需要符号扩展的地方是保持负数的值。如果该值为 -1 (0b11111111),那么如果您只是简单地将零扩展为 32 位值,您将获得 255 (0b00000000000000000000000011111111)ecx而不是 -1 (0b1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111。