过程执行'ret'但不执行它

时间:2013-04-24 13:54:19

标签: assembly x86 masm irvine32

我写了GreatCommonDivisor并使用声明向下调整repeat....until,但发现它仍然进入repeat ..... until并导致除零错误。

我认为ret会弹出来电者下一行的地址,但为什么会跳转到repeat...until

ps:eax is dividend and ebx is divisor.
提前谢谢。

INCLUDE Irvine32.inc

.data

.code
main PROC
mov eax, 75
mov ebx, 18
call gcd
main ENDP


gcd PROC 

or eax,eax;set SF
.IF Sign?
    Neg eax
.Else 
.EndIf

or ebx,ebx;set SF
.IF Sign?
    Neg ebx
.Else 
.EndIf

.Repeat 
mov edx, 0
div ebx

mov eax, ebx
mov ebx, edx    
.Until ebx <= 0

call WriteInt
ret
gcd ENDP

END main

1 个答案:

答案 0 :(得分:2)

不确定为何main成为PROC。由于您订购代码的方式,还有可能在到达gcd结束后继续执行main(我在这台机器上没有MASM方便验证这个)。

我会像这样构建程序:

INCLUDE Irvine32.inc

.data
.code

gcd PROC 
; gcd implementation omitted for brevity..
ret
gcd ENDP

main:
mov eax, 75
mov ebx, 18
call gcd

END main