【问题标题】:What does d refer to in %r11d in this x86 instruction?在这个 x86 指令中, %r11d 中的 d 指的是什么?
【发布时间】:2015-10-15 01:34:23
【问题描述】:

我有一个函数 fn(),它在堆栈上分配一个 64 字节的缓冲区,然后调用 get 函数。 注意:我正在使用gets来覆盖堆栈上的返回地址。

void fn() {
    char buf[64];
    gets(buf);
}

代码已使用修改后的用于 Native Client 的 gcc 编译器编译。如果我们查看地址 20243,我们会将栈顶弹出到寄存器 r11。然后,在下一行,我们将这个寄存器的内容移动到 %ebp 中。

但是,我不明白%r11d 末尾的 d 指的是什么。我在 x86 指令集中找不到参考(也许我错过了)所以它可能是 GAS 语法吗?谁能解释一下?

0000000000020220 <fn>:
   20220:       55                      push   %rbp
   20221:       48 89 e5                mov    %rsp,%rbp
   20224:       83 ec 40                sub    $0x40,%esp
   20227:       4c 01 fc                add    %r15,%rsp
   2022a:       8d 45 c0                lea    -0x40(%rbp),%eax
   2022d:       89 c7                   mov    %eax,%edi
   2022f:       66 66 66 2e 0f 1f 84    data32 data32 nopw %cs:0x0(%rax,%rax,1)
   20236:       00 00 00 00 00
   2023b:       e8 a0 12 00 00          callq  214e0 <gets>
   20240:       48 89 ec                mov    %rbp,%rsp
   20243:       41 5b                   pop    %r11
   20245:       44 89 dd                mov    %r11d,%ebp
   20248:       4c 01 fd                add    %r15,%rbp
   2024b:       41 5b                   pop    %r11
   2024d:       41 83 e3 e0             and    $0xffffffe0,%r11d
   20251:       4d 01 fb                add    %r15,%r11
   20254:       41 ff e3                jmpq   *%r11
   20257:       66 0f 1f 84 00 00 00    nopw   0x0(%rax,%rax,1)

【问题讨论】:

  • d = 双字,w = 字,b = 字节

标签: assembly x86 x86-64


【解决方案1】:

引用Gentle Introduction to x86-64 Assembly:

注册集扩展
X86-64 定义了八个名为 r8-r15 的新整数寄存器。这些寄存器使用特殊的 REX 前缀进行编码,因此在非 64 位指令中使用它们意味着指令长度增加 1 个字节。它们的命名如下:

rXb 为 8 位寄存器(包含 64 位值的最低字节)
rXw 16 位
rXd 32 位
64 位的 rX

【讨论】:

    猜你喜欢
    • 2015-01-05
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 2013-05-20
    • 2011-11-24
    相关资源
    最近更新 更多