#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
он работает правильно.
- Почему программа завершается, когда я выполняю
nexti
call _GetStdHandle@4
команду? - Как я могу выполнить
nexti
работу так, как нужно?