2014-04-23 80 views
-2

我知道有兩種不同的方法可以找到兩個數字的gcd,但是我想知道哪個是最好給出程序集的命令,以及如何將該方法實現到程序中?如何編寫最大公約數程序是80x86程序集?

這是我到目前爲止有:

.586 
.MODEL FLAT 

INCLUDE io.h   ; header file for input/output 

.STACK 4096 

.DATA 
number1 DWORD ? 
number2 DWORD ? 
prompt1 BYTE "Please enter an integer for X", 0 
prompt2 BYTE "Please enter an integer for Y", 0 
string BYTE 40 DUP (?) 
resultLbl BYTE "The greatest common divisor of X and Y is", 0 
gcd BYTE 11 DUP (?), 0 

.CODE 
_MainProc PROC 
    input prompt1, string, 40 
    atod string 
    mov number1, eax 

    input prompt2, string, 40 
    atod string 
    mov number2, edx 

    mov eax, number1 
    mov edx, number2 

Get_GCD: 
    xchg eax,edx 
    cmp eax,edx 
    jb Get_GCD 
    sub eax,edx 
    test edx,edx 
    jnz Get_GCD 
    ret 

    dtoa gcd, edx 
    output resultLbl, gcd 

    mov eax, 0 
    mov edx, 0 
    ret 
_MainProc ENDP 
END        ; end of source code 

我運行它,並沒有任何反應。

回答

-2
Get_GCD: 
    xchg EAX,EDX 
    cmp EAX,EDX 
    jb Get_GCD 
    sub EAX,EDX 
    test EDX,EDX 
    jnz Get_GCD 
    ret 
0

刪除jnz Get_GCD之後和dtoa之前的ret。歐幾里得減法算法循環可縮短:

;          ;eax and edx are the numbers 
gcd0: cmp  edx,eax     ;edx = smaller number 
     jb  gcd1 
     xchg eax,edx 
gcd1: sub  eax,edx     ;subtract smaller from larger 
     jnz  gcd0     ;loop if not done 
;          ;edx = gcd 

注意,對於上述循環的最壞情況是EAX = 0xFFFFFFFF的和EDX = 1,其中它需要4個十億循環來完成。下面顯示的歐幾里德模數算法使用除法,但最壞情況下的循環次數n爲:n < = 5 log10(較小數字)或n < = 1.50515 log2(較小數字)。對於32位無符號整數,最壞的情況是兩個斐波那契數字,1836311903和2971215073(gcd = 1),其中循環數= 45,即< = 5log10(1836311903)(〜= 46.32)。

歐幾里得模方法:

;          ;eax and ebx are the numbers 
     cmp  ebx,eax     ;ebx = smaller number 
     jb  gcd0 
     xchg eax,ebx 
gcd0: xor  edx,edx     ;divide: larger/smaller 
     div  ebx 
     mov  eax,ebx     ;eax = new larger (was smaller) 
     mov  ebx,edx     ;ebx = new smaller (new remainder) 
     or  ebx,ebx     ;loop if new smaller != 0 
     jnz  gcd0 
;          ;eax = gcd 
-1
include Irvine32.inc 

    .data 

factor DWORD 60 
i  DWORD 2 
largest DWORD ? 

str1 BYTE "Greatest common factor",0 

    .code 
    main PROC 

top:  
    mov eax,factor 
    mov ebx,i 
    xor edx,edx 
    div ebx 
    call writedec 
    cmp ebx,eax 
    je L2 
    call crlf 
    cmp eax,factor 
    jb L1 
    inc i 
    jmp top 
L1: 
    mov largest,ebx  
L2: 
    mov eax,largest 
    mov edx,OFFSET str1 
    call writestring 
    call writedec 

    exit 

    main ENDP 
    END main 
+2

你能否詳細說明如何一點是應該解決您在張貼問題的代碼中發現任何問題(S)?代碼轉儲不能提供特別好的答案。 – Michael

+0

我與邁克爾在這。將答案(僅用於代碼)轉儲到您的家庭作業中並沒有幫助(您的答案最初甚至不可讀),並使用原始問題未使用的庫。我已經投下了這個答案。 –