使用GDB调试NASM / MinGW生成的汇编程序不会在断点处停止吗?
使用GDB进行调试时,汇编和链接以下程序会产生意外结果。
nasm -g -f win32 insertion_sort_static.asm
ld insertion_sort_static.obj -o test
现在,当我运行GDB并在_exit
设置断点时,程序不会在指定点处中断。而是程序终止。
gdb test
(gdb) break exit
Breakpoint 1 at 0x401034
(gdb) run
Starting program: C:\Users\nze\Desktop\asm\sorting\insertion_sort/test
[New Thread 6548.0x2c9c]
[Inferior 1 (process 6548) exited with code 01]
(gdb)
另一方面,如果我设置了break start
,该程序会在_start
下方中断三条指令:
(gdb) break start
Breakpoint 2 at 0x401003
(gdb) run
Starting program: C:\Users\nze\Desktop\asm\sorting\insertion_sort/test
[New Thread 4520.0x28e8]
Breakpoint 2, 0x00401003 in start ()
(gdb) disassemble
Dump of assembler code for function start:
0x00401000 <+0>: push %ebp
0x00401001 <+1>: mov %esp,%ebp
=> 0x00401003 <+3>: xor %ecx,%ecx
这些麻烦的原因是什么?真的很困扰我,我似乎无法找到解决方案。
;; insertion_sort(int[] num, int len)
BITS 32
section .data
_array: dd 4, 2, 8, 6, 1
_len: equ ($ - _array) / 4
section .text
global _start
_start:
push ebp
mov ebp, esp
xor ecx, ecx
_outer:
inc ecx
cmp ecx, _len
jge _exit
mov ebx, ecx
dec ebx
lea esi, [_array + ecx * 4]
lea edi, [_array + ebx * 4]
_inner:
cmp ebx, 0
jl _outer
mov eax, [edi]
cmp eax, [esi]
jle _outer
xchg eax, dword [esi] ; swap [esi] and [edi]
mov dword [edi], eax
sub esi, 4
sub edi, 4
dec ebx
jmp _inner
_exit:
mov esp, ebp
pop ebp
ret