Я бы просто загрузил его прямо в gdb
и пошагово выполнял инструкцию по инструкции, следя за ходом всех регистров и содержимого памяти.
Я уверен, что ничего вам не скажуНе знаю, но программа кажется достаточно простой, чтобы оправдать такой подход.Я бы оставил хитрые уловки отладки, такие как возврат (и даже точки останова) для более сложного кода.
Что касается конкретной проблемы (код перефразирован ниже):
extern printf
SECTION .data
format: db "%d",0
SECTION .bss
v_0: resb 4
SECTION .text
global main
main:
push 5
pop eax
mov [v_0], eax
mov eax, v_0
push eax
call printf
Вы, кажется, просто нажимаете5 в стек, за которым следует адрес 5 в памяти (v_0
).Я почти уверен, что вам нужно будет нажать адрес строки формата в какой-то момент, если вы хотите вызвать printf
.Не будь любезен, если тебе дадут мошенническую строку формата.
Вполне вероятно, что твое:
mov eax, v_0
должно быть:
mov eax, format
и я 'm при условии , что после этого вызова к printf
появилось больше кода, который вы просто остановили как неважный (иначе вы вернетесь, чтобы никогда не приземлиться, когда он вернется).