GDB Dis-Flavour设置为英特尔,但呈现AT& T风格

时间:2015-09-09 18:59:22

标签: c++ c debugging gdb

我已将 gdb-debugger disassembly-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'

确实重新启动计算机。我的操作系统是Kali Linux amd64 。 我有以下问题:

  • 为什么 gdb 仍显示AT&T表示法?
  • 为什么寄存器EIP指令指针)显示为无效寄存器

1 个答案:

答案 0 :(得分:2)

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

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

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

   0x00000000007378f0 <+0>: push   %rbp
   0x00000000007378f1 <+1>: mov    %rsp,%rbp
   0x00000000007378f4 <+4>: sub    $0x20,%rsp
   0x00000000007378f8 <+8>: movl   $0x0,-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