gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:23:07 24 4
gpt4 key购买 nike

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

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

  • 为什么 gdb 仍然显示 AT&T 符号?
  • 为什么寄存器EIP(指令指针)显示为无效寄存器

最佳答案

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

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

如果我用 at&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

关于c++ - GDB Dis-Flavor 设置为 Intel,但显示 AT&T 风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32487278/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com