2013-04-24 63 views
0

我编写GreatCommonDivisor并使用已声明ret的repeat....until,但发现它仍然进入repeat ..... until并导致除零错误。程序执行'ret'但不执行它

我觉得ret弹出呼叫者下一行的地址,但是为什么它跳到了repeat...until

ps:eax is dividend and ebx is divisor. 

Thx提前。

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 

回答

2

不知道为什么你做main一个PROC。还有一种可能性是,由于您已经订购了代码,在到达main(我没有在此计算机上使用MASM来验证这一点)的结尾时,它将继续执行gcd

我想构建这样的程序:

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 
+0

它做工精细,当我改变它,但是为什么订单会有如此不同的序列? – 2013-04-24 15:07:03

+1

你的'main'不是以'ExitProcess'调用或'ret'结束的,所以它只会继续执行它后面的任何内容(在原始版本中是'gcd')。为了完全正确,你应该使用'调用ExitProcess,0'来退出到Windows。 – Michael 2013-04-24 15:19:06