GDB Dis-Flavor 设置为 Intel,但显示 AT&T 风格

GDB Dis-Flavor set to Intel, but showing AT&T-style

我已经将 gdb-debuggerdisassembly-flavor 设置为 Intel(两者:su 和普通用户),但无论如何它仍然显示AT&T 表示法中的汇编代码:

patrick@localhost:~/Dokumente/Projekte$ gdb -q ./a.out
Reading symbols from ./a.out...done.
(gdb) break main
Breakpoint 1 at 0x40050e: file firstprog.c, line 5.
(gdb) run
Starting program: /home/patrick/Dokumente/Projekte/a.out 

Breakpoint 1, main () at firstprog.c:5
5   for(i=0; i < 10; i++)
(gdb) show disassembly
The disassembly flavor is "intel".
(gdb) info registers
rax            0x400506 4195590
rbx            0x0  0
rcx            0x0  0
rdx            0x7fffffffe2d8   140737488347864
rsi            0x7fffffffe2c8   140737488347848
rdi            0x1  1
rbp            0x7fffffffe1e0   0x7fffffffe1e0
(gdb) info register eip
Invalid register `eip'

没有重新启动计算机。我的 OS 是 Kali Linux amd64。 我有以下问题:

您误解了反汇编风味的含义。这恰恰意味着:当您以人类可读的(大概)形式查看机器代码时,反汇编是什么样子的。

要打印寄存器(或在任何其他上下文中使用寄存器),您需要使用 $reg,例如 $rip$pc$eax 等。

如果我用 at&t 语法反汇编我的一个程序,gdb 会显示:

   0x00000000007378f0 <+0>: push   %rbp
   0x00000000007378f1 <+1>: mov    %rsp,%rbp
   0x00000000007378f4 <+4>: sub    [=10=]x20,%rsp
   0x00000000007378f8 <+8>: movl   [=10=]x0,-0x4(%rbp)
   0x00000000007378ff <+15>:    mov    %edi,-0x8(%rbp)
   0x0000000000737902 <+18>:    mov    %rsi,-0x10(%rbp)
=> 0x0000000000737906 <+22>:    mov    -0x10(%rbp),%rsi
   0x000000000073790a <+26>:    mov    (%rsi),%rdi
   0x000000000073790d <+29>:    callq  0x737950 <FindLibPath(char const*)>
   0x0000000000737912 <+34>:    xor    %eax,%eax

然后这样做:

(gdb) set disassembly-flavor intel 
(gdb) disass main
Dump of assembler code for function main(int, char**):
   0x00000000007378f0 <+0>: push   rbp
   0x00000000007378f1 <+1>: mov    rbp,rsp
   0x00000000007378f4 <+4>: sub    rsp,0x20
   0x00000000007378f8 <+8>: mov    DWORD PTR [rbp-0x4],0x0
   0x00000000007378ff <+15>:    mov    DWORD PTR [rbp-0x8],edi
   0x0000000000737902 <+18>:    mov    QWORD PTR [rbp-0x10],rsi
=> 0x0000000000737906 <+22>:    mov    rsi,QWORD PTR [rbp-0x10]
   0x000000000073790a <+26>:    mov    rdi,QWORD PTR [rsi]
   0x000000000073790d <+29>:    call   0x737950 <FindLibPath(char const*)>
   0x0000000000737912 <+34>:    xor    eax,eax

你可以看出区别。但是寄存器的名称以及您在 gdb 命令行上使用寄存器的方式并没有改变,在这两种情况下您都需要 $reg