因此,基本上,我使用IDC脚本使用Windows 32位IDA Pro 6.1逐一转储指令。 PE文件格式

我使用这样的方式尝试转储一个操作码指令,如

stosd
stosb
stosq
movsd




for (addr = funcStart; addr != BADADDR; addr = NextHead(addr, funcEnd)) {
 ......
auto code;
line = GetDisasm(addr);
mnem = GetMnem(addr);
.......
if (strstr(line, mnem) != 0) {
        mnem = line;
}
line = form("%-8s", mnem);


但是令我惊讶的是,当遇到一条这样的操作码指令时,mnem会得到类似的信息

stos
stos
stos
movs
movs
movs


通过检查直接转储的asm文件* * File-> Produce File-> Create ASM File ... **,我发现那些错误说明应该是

stosd
stosd
stosd
movsd
movsd
movsd


这意味着生成的结果API GetMnem是错误的...

谁能给我一些帮助吗?谢谢!

#1 楼

如果您查看这些指令的特定操作码,它们是相同的。
更准确地说,“ stos m8”和stob具有与“ STOS m16”,“ STOS m32”相同的操作码(0xAA)。 ”,“ STOSW”和“ STOSD”(0xAB)。引用该手册:


在汇编代码级别,此指令的两种形式允许使用:“显式操作数”形式和“无操作数”形式。显式操作数形式(用STOS助记符指定)允许显式指定目标操作数。在此,目标操作数应该是一个指示目标值的大小和位置的符号。然后,自动选择源操作数以匹配目标操作数的大小(字节操作数的AL寄存器,字操作数的AX以及双字操作数的EAX)。提供此显式操作数形式是为了允许文档;但是,请注意,此表格提供的文档可能会产生误导。即,目标操作数符号必须指定操作数的正确类型(大小)(字节,字或双字),但不必指定正确的位置。该位置始终由ES:(E)DI寄存器指定,必须在执行存储字符串指令之前正确加载该寄存器。


以及来自GetMnem文档:


注意:此功能可能不会返回与您在屏幕上看到的完全相同的助记符。