首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDB Flavor设置为Intel,但显示AT&T风格

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

Stack Overflow用户
提问于 2015-09-09 18:59:21
回答 1查看 1.3K关注 0票数 1

我已经将disassembly-flavorgdb调试器设置为Intel (两者都是su & normal user),但无论如何,它仍然以AT&T符号显示程序集代码:

代码语言:javascript
复制
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 (指令指针)显示为无效寄存器
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-09 19:15:13

你误解了什么是分解味道的意思。它的确切意思是:当您以人类可读的(Ish)形式查看机器代码时,反汇编看起来是什么样子。

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

如果我用at&t语法解压缩我的一个程序,gdb将显示如下:

代码语言:javascript
复制
   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

然后这样做:

代码语言:javascript
复制
(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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32487278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档