为什么lea rax[rip±0xeb3]中有一个“±”?

Kar*_*jas 5 debugging assembly gdb x86-64 disassembly

我刚刚开始在 VMware 中的 Kali Linux 中学习汇编语言。我有一个锐龙 5 CPU。在下面的代码片段中,我有一些不明白的地方。

\n
    \n
  • lea rax, [rip \xc2\xb1 0xeb3]at <main + 17>是什么意思?我明白是什么lea意思,但是 \xc2\xb1 的含义是什么?
  • \n
  • 那么RDI更新后的用途是什么?
  • \n
\n
(gdb) list\n1       #include<stdio.h>\n2\n3       int main(){\n4               int i;\n5               for(i = 0 ; i < 10 ; i++){\n6                       printf("Hello World!\\n");\n7               }\n8               return 0;\n9       }\n(gdb) disassemble main\nDump of assembler code for function main:\n   0x0000000000001139 <+0>:     push   rbp\n   0x000000000000113a <+1>:     mov    rbp,rsp\n   0x000000000000113d <+4>:     sub    rsp,0x10\n   0x0000000000001141 <+8>:     mov    DWORD PTR [rbp-0x4],0x0\n   0x0000000000001148 <+15>:    jmp    0x115d <main+36>\n   0x000000000000114a <+17>:    lea    rax,[rip\xc2\xb10xeb3]        # 0x2004\n   0x0000000000001151 <+24>:    mov    rdi,rax\n   0x0000000000001154 <+27>:    call   0x1030 <puts@plt>\n   0x0000000000001159 <+32>:    add    DWORD PTR [rbp-0x4],0x1\n   0x000000000000115d <+36>:    cmp    DWORD PTR [rbp-0x4],0x9\n   0x0000000000001161 <+40>:    jle    0x114a <main+17>\n   0x0000000000001163 <+42>:    mov    eax,0x0\n   0x0000000000001168 <+47>:    leave  \n   0x0000000000001169 <+48>:    ret    \nEnd of assembler dump.\n(gdb) \n
Run Code Online (Sandbox Code Playgroud)\n

编辑:

\n
gdb -v        \nGNU gdb (Debian 12.1-3) 12.1\nCopyright (C) 2022 Free Software Foundation, Inc.\nLicense GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>\nThis is free software: you are free to change and redistribute it.\nThere is NO WARRANTY, to the extent permitted by law.\n
Run Code Online (Sandbox Code Playgroud)\n

Mar*_*oom 4

它不是一个加减号(\xc2\xb1,Unicode 点 0x00b1),而是一个带下划线的加号。
\n如果你复制粘贴它,你只会得到一个加号(+)。

\n

GDB 12.1 使用 Python 为其反汇编器输出的每一行着色。具体来说,它使用 Pygments 包,在当前版本 2.11.2 中,该包处理 x64 代码的效果很差,这里是一个测试用例:

\n
from pygments import formatters, lexers, highlight\n \ndef colorize_disasm(content, gdbarch):\n    # Don\'t want any errors.\n    try:\n        lexer = lexers.get_lexer_by_name("asm")\n        formatter = formatters.TerminalFormatter()\n        return highlight(content, lexer, formatter).rstrip().encode()\n    except:\n        return None\n \n \nprint(colorize_disasm("lea [rip+0x211]  #test", None).decode())\n
Run Code Online (Sandbox Code Playgroud)\n

RIP 相关操作数的 Pygments 输出错误

\n

(尚未发布)的下一个版本使用完全不同的着色代码,其中每个反汇编器函数都可以在其输出和反汇编命令中引入样式标记(请参阅gdb/disassemble.c)将这些标记转换为终端转义符。

\n