我写了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
答案 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