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#
评论
您应该更新您的问题并更加准确。我似乎无法从提供的代码中理解“中断”的含义。