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

5

我刚开始在VMware的Kali Linux学习汇编语言,我的CPU是Ryzen 5。在下面的代码片段中,有一些我不理解的东西。

  • <main + 17>处的lea rax, [rip ± 0xeb3]是什么意思?我知道lea的作用,但±表示什么?
  • 更新后RDI的目的是什么?
(gdb) list
1       #include<stdio.h>
2
3       int main(){
4               int i;
5               for(i = 0 ; i < 10 ; i++){
6                       printf("Hello World!\n");
7               }
8               return 0;
9       }
(gdb) disassemble main
Dump of assembler code for function main:
   0x0000000000001139 <+0>:     push   rbp
   0x000000000000113a <+1>:     mov    rbp,rsp
   0x000000000000113d <+4>:     sub    rsp,0x10
   0x0000000000001141 <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x0000000000001148 <+15>:    jmp    0x115d <main+36>
   0x000000000000114a <+17>:    lea    rax,[rip±0xeb3]        # 0x2004
   0x0000000000001151 <+24>:    mov    rdi,rax
   0x0000000000001154 <+27>:    call   0x1030 <puts@plt>
   0x0000000000001159 <+32>:    add    DWORD PTR [rbp-0x4],0x1
   0x000000000000115d <+36>:    cmp    DWORD PTR [rbp-0x4],0x9
   0x0000000000001161 <+40>:    jle    0x114a <main+17>
   0x0000000000001163 <+42>:    mov    eax,0x0
   0x0000000000001168 <+47>:    leave  
   0x0000000000001169 <+48>:    ret    
End of assembler dump.
(gdb) 

编辑:

gdb -v        
GNU gdb (Debian 12.1-3) 12.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

7
我可以重现这个问题。它不是加减号,而是带下划线的加号。可能是由于错误的颜色转义序列导致的。 - Margaret Bloom
10
好的,找到了bug。gdb 12.1 使用Python(!)来着色其输出。具体来说,它使用Pygments软件包。该软件包在处理x64代码时存在问题,这是一个测试案例。下一个版本(尚未发布)将使用完全不同的着色代码,其中每个反汇编函数都可以在其输出中引入样式标记,并且disassemble命令(gdb/disassemble.c)将这些标记转换为终端转义字符。 - Margaret Bloom
1
好的,这意味着+对吗?感谢查看。 - Karan Tejas
4
@KaranTejas,你可以执行 set style disassembler enabled off 命令来禁用反汇编样式,这将解决格式问题。 - Andrew
2
@MargaretBloom:你可以把那个作为答案发布。顺便说一下,在我的Arch Linux系统中,在Konsole中,你的pastebin测试用例会打印一个带有下划线的“+”,一开始看起来很令人困惑,但是一旦你知道要寻找它,就清楚地看到了整个单元格下划线的“+”。而且它复制/粘贴为“+”,而不是“±”。 - Peter Cordes
显示剩余7条评论
1个回答

4

这不是一个正负号(±,Unicode点0x00b1),而是一个下划线加号。
如果你复制粘贴它,你只会得到一个加号(+)。

GDB 12.1使用Python为其反汇编器输出的每一行着色。具体来说,它使用Pygments软件包,但在当前版本2.11.2中,处理x64代码存在问题,以下是一个测试案例:

from pygments import formatters, lexers, highlight
 
def colorize_disasm(content, gdbarch):
    # Don't want any errors.
    try:
        lexer = lexers.get_lexer_by_name("asm")
        formatter = formatters.TerminalFormatter()
        return highlight(content, lexer, formatter).rstrip().encode()
    except:
        return None
 
 
print(colorize_disasm("lea [rip+0x211]  #test", None).decode())

Wrong Pygments output for RIP-relative operands

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接