gpt4 book ai didi

assembly - lodsd/stosd 汇编指令 : possible errata in reversing book

转载 作者:行者123 更新时间:2023-12-01 08:26:28 25 4
gpt4 key购买 nike

在“Practical Reverse Engineering x86 - x64 ARM, Kernel & Obfuscation”的第 25 页中,我发现了一个汇编代码示例被重新转换为粗略的 C,其中 lodsd 和 stosd 指令“翻译”似乎颠倒了。由于我是汇编语言的新手,我想知道它是否真的是一个勘误表,或者还有更多我可能没有考虑的内容。
这是简单的代码:

集会

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。我在这里错过了什么吗?

最佳答案

你是对的,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);

关于assembly - lodsd/stosd 汇编指令 : possible errata in reversing book,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061512/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com