lodsd / stosd汇编指令:倒车时可能的勘误表

时间:2015-03-15 14:05:52

标签: assembly x86 x86-64

在“实用逆向工程x86 - x64 ARM,内核和混淆”的第25页中,我发现了一个重新编译为粗略C的汇编代码示例,其中lodsd和stosd指令“translate”似乎是反转的。因为我对汇编语言不熟悉,所以我想知道它是不是真的是一个勘误表,或者还有一些我可能没有考虑的事情。 这是简单的代码:

装配

01: 8B CA     mov ecx, edx
02:           loc_CFB8F:
03: AD        lodsd
04: F7 D0     not eax
05: AB        stosd
06: E2 FA     loop loc_CFB8F

粗糙C

while (ecx != 0) {
eax = *edi;
edi++;
*esi = ~eax;
esi++;
ecx--;
}

在我读到的关于lods指令的每个在线解释中,都说SI / ESI中的任何值都存储在AL / AX / EAX中,然后递增ESI。

同样地,stos应该表示粗略的高级“memset”,其中AL / AX / EAX中的任何内容都写入DI / EDI然后递增寄存器。

但是看起来我错了,因为在上面的翻译中,eax被赋予了EDI的取代引用而不是ESI,并且在ESI指向的值的正下方获得了stos的反向eax。我在这里错过了什么吗?

1 个答案:

答案 0 :(得分:3)

您的说法是正确的,因为C“翻译”似乎已交换ediesi。但即便如此,翻译仍有一些问题。首先,汇编代码将始终执行一个副本,因此相应的C构造实际上将是do ... while。其次,指针是递增还是递减实际上由方向标志确定,方向标志未指示其状态。我将代码翻译为:

// note: this assumes that the direction flag is clear (increment mode)
do {
    eax = *esi;
    esi++;
    *edi = ~eax;
    edi++;
    ecx--;
} while (ecx != 0);