assembly - x86 程序集 - 编码相对 jmp

标签 assembly x86 disassembly objdump radare2

我对 gcc 编码相对跳转的方式有点困惑。我有以下内容:

int main(void)
{
    __asm__ __volatile__(
        "jmp label\n"
        "label:\n"
        "nop\n"
    );

    return 0;
}

构建此 (gcc -c -o test.o test.c) 显示以下内容 (objdump -M intel -d test.o):

0000000000000000 <main>:
   0:   55                      push   rbp
   1:   48 89 e5                mov    rbp,rsp
   4:   eb 00                   jmp    6 <label>

0000000000000006 <label>:
   6:   90                      nop
   ...

rasm2 -d eb00 显示 jmp 2,这意味着正在以偏移量 2 执行跳转。现在,我明白了添加了相对跳转的偏移量eip 的当前值,它应该指向下一条指令(即 nop)。这种编码让我认为偏移量是相对于 jmp 本身的地址的。难道 jmp 不应该被编码为 jmp 0,因为 nop 已经在 label 了吗?

最佳答案

它被编码为偏移量为0:

eb 00

然而,习惯上从汇编中的此类编码细节(以及反汇编器输出)中抽象出来,并用相对于指令开头的偏移量(例如 $+2 )或绝对(如 jmp 6 <label> )表示相对跳转。 ).

关于assembly - x86 程序集 - 编码相对 jmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54730318/

相关文章:

c - 程序集如何访问/存储堆栈上的变量

assembly - objdump使用的反汇编库

assembly - x86 : inline asm or compiler-generated lock bts? 中的原子测试和设置

c - GDB/GNU 程序集 : test %esi, %esi 返回不相等?

c - 库名和函数名混淆

c - 我在汇编中处理一个可能的数组,但我无法弄清楚起始值是多少

c - 在 mmap 中执行代码以产生可执行代码段错误

使用泰勒展开的 sin(x) 汇编代码

c - GCC优化对位操作的有效性

assembly - 无法访问地址处的内存,缓冲区溢出尝试