x86 32位汇编问题

时间:2011-08-26 21:36:22

标签: assembly x86 32-bit intel macos

我目前正在学习汇编,我正在玩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 个答案:

答案 0 :(得分: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

答案 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