GDB не останавливается на всех контрольных точках с NASM - PullRequest
2 голосов
/ 11 апреля 2020

Я только недавно начал изучать ассемблер (NASM). Книга, из которой я учусь, была написана для 32-битного процессора, но мой компьютер 64-битный.

У меня есть файл `sandbox.asm ', в который я помещаю код, а затем после сборки запускаю программу в gdb, чтобы увидеть регистр значений и что происходит с каждой строкой и т. д. c.

Иногда я получаю ошибки с 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 должна go в 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 в другом.

Есть ли лучший отладчик, специально предназначенный для сборки (скорее чем для c как у gdb)?

1 Ответ

3 голосов
/ 11 апреля 2020

Извините за публикацию, я только что нашел решение.

Мой предыдущий make-файл был:

1   sandbox: sandbox.o
2       ld -o sandbox sandbox.o
3   sandbox.o: sandbox.asm
4       nasm -f elf64 -g -F stabs sandbox.asm

, но теперь я изменил его на:

1   sandbox: sandbox.o
2       ld -o sandbox sandbox.o
3   sandbox.o: sandbox.asm
4       nasm -f elf64 -g -F dwarf sandbox.asm

Эта команда `dwarf 'делает МИР разным!

Теперь GDB ведет себя так, как я и ожидал.

...