因此,基本上,我使用objdump在32位Linux x86上从“ GNU Coreutils”反汇编了一个二进制文件。

在反汇编的代码中,我发现了一条像这样的“中断”指令:
<我在这里问了一个关于非常相似的指令的相关问题,在这个问题中,我认为这应该是与跳转表相关的指令,但是这个指令呢?我很困惑。 。

谁能给我一些帮助吗?

评论

您应该更新您的问题并更加准确。我似乎无法从提供的代码中理解“中断”的含义。

#1 楼

我不知道是什么让您认为此指令“已损坏”-括号后有一个逗号,中间没有参数?在这种情况下,反汇编程序只是不显示参数,因为它是“零”(更确切地说,它指定了“无寄存器”,其中允许“任何处理器寄存器”)。

这里发生了什么是:在寻址内存位置时,处理器具有一种模式,它可以处理


基本偏移量
加上一个处理器寄存器的内容
再加上另一个寄存器的内容处理器寄存器,乘以可以为1,2,4或8的整数

此计算速度非常快,因为它是在地址总线子系统中的特殊硬件中完成的。

lea(加载有效地址)指令是一种特殊的RAM访问-它计算操作数的地址,但随后会将地址(而不是该地址的数据)移至目标寄存器。

因此,您的“中断”指令将基本偏移量0加上“ no”第一个寄存器加上ebp内容的8倍移入eax。可以通过将ebp移到eax并乘以8,或者向左移3位来完成相同的操作,但是lea指令可能要快一些(因为正如我所说,这是在专用地址总线硬件中完成的),因此,编译器使用该代码节省了一些周期。这里没有任何问题。

反汇编时可能要看一下i386汇编程序参考,在OS X汇编程序参考中对间接地址的解释也很好,向下滚动至“间接内存操作数” 。

#2 楼



这是什么意思?

如果您对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#