Я только недавно начал изучать ассемблер (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)?