所以基本上我是objdump
用来在 32 位 Linux x86 上从“GNU Coreutils”反汇编二进制文件的。
在反汇编的代码中,我发现了一条这样的“损坏”指令:
804bb49: 8d 04 ed 00 00 00 00 lea 0x0(,%ebp,8),%eax
我在这里问了一个关于一个非常相似的指令的相关问题,在那个问题中,我认为它应该是一个与跳转表相关的指令,但是这个呢?我很困惑..
谁能给我一些帮助?
所以基本上我是objdump
用来在 32 位 Linux x86 上从“GNU Coreutils”反汇编二进制文件的。
在反汇编的代码中,我发现了一条这样的“损坏”指令:
804bb49: 8d 04 ed 00 00 00 00 lea 0x0(,%ebp,8),%eax
我在这里问了一个关于一个非常相似的指令的相关问题,在那个问题中,我认为它应该是一个与跳转表相关的指令,但是这个呢?我很困惑..
谁能给我一些帮助?
我不知道是什么让你认为这条指令是“坏的”——括号后面有一个逗号,中间没有参数?在这种情况下,反汇编器只是不显示参数,因为它是“零”(更准确地说,它指定“无寄存器”,其中允许“任何处理器寄存器”)。
这里发生的事情是:当寻址内存位置时,处理器有一个模式,它寻址
这个计算非常快,因为它是在地址总线子系统中的特殊硬件中完成的。
的lea
(加载有效地址)指令是一种特殊的RAM存取-它计算操作数的地址,但随后,它移动的地址,而不是在该地址的数据,到目的寄存器。
因此,您的“损坏”指令将基址偏移量 0 加上“no”第一个寄存器,加上 ebp 内容的 8 倍,移入 eax。通过将 ebp 移动到 eax 并乘以 8 或移动并向左移动 3 位,也可以完成相同的lea
操作,但指令可能要快一点(因为,正如我所说,它是在专门的地址总线硬件中完成的),所以编译器使用那个来节省几个周期。这里什么都没有坏。
您可能想在反汇编时查看 i386 汇编程序参考,间接寻址在OS X 汇编程序参考中有很好的解释,向下滚动到“间接内存操作数”。
破了是什么意思
这篇文章或您之前的文章中的说明似乎没有被破坏
如果您对 AT&T 语法感到困惑,那么您可以要求 objdump 以 intel 语法进行反汇编
更好的破解解释可以得到更好的答案
root@box:/home/dsl/gcctests/test# cat testjt.c
void naked (void)
{
asm( ".globl _naked\n");
asm( "_naked:\n");
asm( "jmp *0x80509e4(,%eax,4)");
asm( "lea 0x0(,%ebp,8),%eax");
asm( "ret");
}
int main (void)
{
naked();
return 0;
}
root@box:/home/dsl/gcctests/test# objdump -t ./testjt | grep _naked
08048357 g .text 00000000 _naked
root@box:/home/dsl/gcctests/test# objdump -d --disassembler-option=intel ./testjt | grep -A 2 _naked
08048357 <_naked>:
8048357: ff 24 85 e4 09 05 08 jmp DWORD PTR [eax*4+134547940]
804835e: 8d 04 ed 00 00 00 00 lea eax,[ebp*8]
root@box:/home/dsl/gcctests/test#