初学者gdb调试64位asm寄存器

问题描述 投票:1回答:1

我最近才开始学习汇编(NASM)。我正在学习的书是为32位cpu编写的,但我的计算机是64位的。

我有一个放入文件的“ sandbox.asm”文件,然后在组装后在gdb中运行该程序以查看寄存器值以及每一行的内容,等等。

有时我会收到我不了解的gdb错误。

这是我的sandbox.asm:

1   section .data
2   section .text
3   
4       global _start
5   
6   _start:
7       nop
8   ; test code below
9   mov rax,5
10  mov rbx,3
11  mul rbx
12  ; test code above
13      nop
14  
15  section .bss

一个简单的程序,将5放入rax,将3放入rbx,结果应以rdx和rax结尾。

但是gdb会运行到最后,只在1个断点处停止(不知道它是否正在这样做或在'nop'处停止。)>

$ gdb sandbox
(gdb) b 9
Breakpoint 1 at 0x400082: file sandbox.asm, line 9.
(gdb) b 10
Breakpoint 2 at 0x40008c: file sandbox.asm, line 10.
(gdb) b 11
Breakpoint 3 at 0x400096: file sandbox.asm, line 11.
(gdb) r
Starting program: /home/gucci/CODE.d/ASMBLY.d/sandbox.d/sandbox 

Breakpoint 2, 0x000000000040008c in _start ()
(gdb) i r
rax            0xcc 204
rbx            0x3  3
[...]
(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x000000000040008f in ?? ()
(gdb) i r
rax            0x264    612
rbx            0x3  3
[...]
(gdb) c
Continuing.

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists.

204来自哪里?至少要乘以3并将结果放入rax(612)。

为什么我也会出现段错误?我尝试将32位(eax),16位(ax)甚至8位寄存器用于'mov'指令,但是gdb根本无法与它们一起工作。

即使源文件位于同一目录中,$ gdb -tui sandbox也不起作用,所以我在一个终端中打开了gdb,而在另一终端中打开了ed。

是否有一个专门用于汇编的更好的调试器(而不是像gdb这样的c调试器?

感谢您的帮助。

我最近才开始学习汇编(NASM)。我正在学习的书是为32位cpu编写的,但是我的计算机是64位的。我有一个`sandbox.asm'文件,我将代码放入其中,然后...

debugging assembly gdb x86-64 nasm
1个回答
2
投票

很抱歉,我刚刚找到了解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.