我目前正在学习汇编,我正在玩if语句。我目前的代码如下。
write:
mov eax, 0x4
sub esp, 4
int 0x80
main:
; The message has already been pushed to the stack
mov eax, 4
inc eax
cmp eax, 5
je write
如果我把ret放在write的末尾:那么我得到一个总线错误10,如果我没有,我得到一个无限循环导致分段错误。我应该怎么做才能使这项工作?
答案 0 :(得分:1)
使用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
答案 1 :(得分:0)
试试这个。无需在示例中调用过程。
main: ; The message has already been pushed to the stack
mov eax, 4
inc eax
cmp eax, 5
jne dontwrite ; Skip Write
; Write
mov eax, 0x4
sub esp, 4
int 0x80
dontwrite:
; the rest of the program goes here