如下
我還是找不出明確原因
gcd PROC
mov edx,OFFSET Msn2; address of the prompt
call WriteString
call crlf
pushad
;/*迴圈do while*/*/
mov ecx,B
.WHILE B>0
mov eax,A ;/*eax=A被除數
cdq ;/*延伸除法
idiv B ;A/B ,eax=商數 ,edx=餘數
mov ebx,edx ;/*A%B*/ /*ebx=reminder*/
cmp ebx,0
mov ecx,B ;/*A=B*/
mov A,ecx
mov B,ebx ;/*B=reminder*/
mov gcd1,ebx
.ENDW
popad
謝謝
2006-05-31 00:04:12 · 2 個解答 · 發問者 小蘋 1 in 電腦與網際網路 ➔ 程式設計
首先
上面WHILE回圈改成 DO WHILE 迴圈較好
實做就是
JA:
mov eax,A ;/*eax=A被除數
cdq ;/*延伸除法
idiv B ;A/B ,eax=商數 ,edx=餘數
mov ebx,edx ;/*A%B*/ /*ebx=reminder*/
cmp ebx,0 ;/如果餘數零就跳出回圈,重要,避免下一次除數為零
jle Lx
mov ecx,B ;/*A=B*/
mov A,ecx
mov B,ebx ;/*B=reminder*/
mov gcd1,ebx
cmp B,0
jle Lx ;//if B<=0,跳出回圈
popad
基本上
就是除法要注意溢位和除數為零的問題
另外
迴圈要很小心
通常無窮回圈編譯器是檢查不出來的
2006-05-31 00:25:00 · answer #1 · answered by 醬爆口水男 2 · 0⤊ 0⤋
個人寫了一點 GCD 演算法的東東在下述文章的意見裡。
有興趣的可以去看一下。
http://tw.knowledge.yahoo.com/question/question?qid=1607052408879
2007-07-02 20:04:25 · answer #2 · answered by ? 7 · 0⤊ 0⤋