Loops 如何编程最大公约数程序是80x86汇编?

Loops 如何编程最大公约数程序是80x86汇编?,loops,assembly,x86,greatest-common-divisor,Loops,Assembly,X86,Greatest Common Divisor,我知道有不同的方法可以找到两个数字的gcd,但我想知道哪一个是给定汇编命令的最佳方法,以及如何在程序中实现该方法 以下是我目前掌握的情况: .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

我知道有不同的方法可以找到两个数字的gcd,但我想知道哪一个是给定汇编命令的最佳方法,以及如何在程序中实现该方法

以下是我目前掌握的情况:

.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

我运行它,但什么也没发生。

删除jnz Get_GCD之后和dtoa之前的ret。欧几里德减法算法循环可以缩短:

Get_GCD:
    xchg EAX,EDX
    cmp EAX,EDX
    jb Get_GCD
    sub EAX,EDX
    test EDX,EDX
    jnz Get_GCD
    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,其中需要40亿个循环才能完成。下面所示的欧几里德模算法使用除法,但最坏情况下的循环数n是:n您能详细说明一下这是如何解决您在问题中发布的代码中发现的任何问题的吗?代码转储并不能得到特别好的答案。我支持Michael的观点。将答案(仅代码)转储到您的家庭作业中没有任何帮助(您最初的答案甚至不可读),并且使用了原始问题未使用的库。我否决了这个答案。
;                                       ;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
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