2013-04-24 6 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

Не уверен, почему вы сделали mainPROC. Также есть вероятность, что из-за того, как вы заказали свой код, он снова продолжит выполнение 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 
+0

Он работает хорошо, когда я могу изменить его, но почему порядок будет такой другой последовательности? –

+1

Ваш 'main' не заканчивается вызовом' ExitProcess' или 'ret', поэтому он будет продолжать выполнять все, что приходит после него (что было' gcd' в исходной версии). Чтобы быть полностью правильным, вы действительно должны использовать 'invokeProcess, 0' для выхода из Windows. – Michael

 Смежные вопросы

  • Нет связанных вопросов^_^