Используйте инструкцию call
вместо je
, чтобы войти в write
. ret
ожидает, что обратный адрес будет в стеке, но он не будет выдвинут, если вы воспользуетесь прыжком, чтобы попасть туда! Вам также придется вернуть esp
к тому, что было, когда вы входили в функцию. Вот лучший пример, основанный на вашем коде:
write:
mov eax, 0x4
sub esp, 4
int 0x80
add esp, 4
ret
main: ; The message has already been pushed to the stack
mov eax, 4
inc eax
cmp eax, 5
jne dontwrite ; skip calling 'write' if eax != 5
call write
dontwrite:
; the rest of the program goes here