使用GDB调试NASM / MinGW生成的汇编程序不会在断点处停止?

时间:2016-08-04 17:10:57

标签: windows assembly gdb mingw nasm

  

使用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

0 个答案:

没有答案