следующий gdb с _GetStdHandle @ 4 завершает программу

#debugging #x86 #gdb #nasm #32-bit

#отладка #x86 #gdb #nasm #32-разрядный

Вопрос:

Вот код asm x86 в Windows 10, он помещает символ ascii в память и печатает его с помощью файла записи.

file.asm :

 global _main
extern _GetStdHandle@4
extern _WriteFile@20
extern _ExitProcess@4

section .text
_main:  
    mov al, 8
    add al, '0'

    mov [message], al

    push -11
    call _GetStdHandle@4

    push 0
    push 0
    push 1
    push message
    push eax
    call _WriteFile@20

    push 0
    call _ExitProcess@4

section .bss
    message resb 1
  

Команды :

 nasm -fwin32 file.asm
gcc file.obj
a.exe
  

Он печатает 8 . Я хочу проверять изменения в регистрах при каждой включенной инструкции gdb .

Я делаю следующее :

 gdb a.exe
  

Затем в gdb :

 b main
run
nexti
i r
nexti
i r
nexti
i r
nexti
i r
  

Это работает хорошо, но когда позиция находится непосредственно перед call _GetStdHandle@4 и я nexti снова делаю a , она продолжает всю программу и завершается.
Я должен поставить перерыв сразу после вызова. Кажется _GetStdHandle@4 , он изменяет некоторый регистр (например EAX ), поэтому я хотел обойтись nexti без перехода.

Я протестировал пользовательский call интерфейс с помощью a ret , и здесь nexti он работает правильно.

  1. Почему программа завершается, когда я выполняю nexti call _GetStdHandle@4 команду?
  2. Как я могу выполнить nexti работу так, как нужно?