2013-04-24 3 views
0

GreatCommonDivisor를 작성하고 repeat....until을 선언하고 사용했지만 여전히 repeat ..... until에 들어가서 0으로 나누어 오류가 발생합니다.'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

당신이 PROCmain을 만든 이유는 확실하지. 또한 코드를 주문한 방법으로 인해 main의 끝에 도달 한 후 gcd을 다시 실행하게 될 가능성이 있습니다 (이 컴퓨터에서 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 
+0

그것은 잘 작동 :

이 같은 프로그램을 구성거야? –

+1

'main'은'ExitProcess' 호출이나'ret'로 끝나지 않으므로, 그 뒤에 나오는 것을 실행합니다 (원래 버전에서는'gcd'였습니다). 완전히 정확하려면'Invoke ExitProcess, 0'을 사용하여 Windows로 돌아가십시오. – Michael