x86 32位汇编问题

4

我目前正在学习汇编语言,并尝试使用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,如果我不这样做,我会得到一个导致分段错误的无限循环。我该怎么做才能使它正常工作呢?
2个回答

1

使用call指令而不是je来进入writeret期望返回地址在堆栈上,但如果您使用跳转来到达该地址,则不会被推入! 您还需要将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

@Jjack,你的问题没有提供足够的信息,无法提供更多帮助。请问你在哪里遇到了错误? - Carl Norum
我是指在函数调用一次之后。 - Jjack
我发现如果我清空整个堆栈,它可以工作,但是然后我会得到一个分段错误... - Jjack

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

我不太熟悉中断,但我看不出你从esp(堆栈指针)中减去4的任何原因。如果您遇到分段错误,我认为这会导致它发生。如果该行没有任何重要作用,请尝试将其注释掉。 - Sparafusile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接