assembly 为什么莱亚rax中有一个“±”,[ rip ± 0xeb3]?

pn9klfpd  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(136)

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

  • 〈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.
mfuanj7w

mfuanj7w1#

这不是plus-minus (±, Unicode point 0x00b1),这是一个带下划线的加号。
如果您复制粘贴它,则只会得到一个加号(+)。
GDB 12.1 uses Python to colorize each line of its disassembler output。具体来说,它使用了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())

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

相关问题