Assembly 8086汇编语言程序求两个数的GCD

Assembly 8086汇编语言程序求两个数的GCD,assembly,x86,masm,irvine32,greatest-common-divisor,Assembly,X86,Masm,Irvine32,Greatest Common Divisor,当它点击“ret8”时,我的程序停止工作。有人能告诉我为什么吗 查找用户输入的2个数字的GCD。一直循环直到你停下来 提前谢谢 INCLUDE irvine32.inc .data msg1 byte " Enter first number", 0ah, 0dh,0 msg2 byte " Enter second number",0ah, 0dh,0 msg3 byte " GCD is ",0ah,0dh,0 ValA DWORD ? ValB

当它点击“ret8”时,我的程序停止工作。有人能告诉我为什么吗

查找用户输入的2个数字的GCD。一直循环直到你停下来

提前谢谢

INCLUDE irvine32.inc

.data

    msg1 byte " Enter first number", 0ah, 0dh,0
    msg2 byte " Enter second number",0ah, 0dh,0
    msg3 byte " GCD is ",0ah,0dh,0
    ValA DWORD ?
    ValB DWORD ?

.code

main PROC

     start:
            mov edx, offset msg1
            call WriteString
            call ReadDec
            mov ValA,eax



            mov edx, offset msg2
            call WriteString
            call ReadDec
            mov ValB,eax

            mov eax,DWORD ptr[ValA]
            mov ebx,DWORD ptr[ValB]
            push ValB
            push ValA
            call CalcGcd
            call DumpRegs
            call start

    exit
    main ENDP


CalcGcd PROC

        push ebp
        mov ebp, esp
        xor edx,edx
        mov eax, [ebp+8]
        mov ebx, [ebp+12]

    L1:
        cmp eax,ebx
        JE DONE
        JB EXCH

    L2:
        div ebx
        cmp edx,0
        JE DONE
        mov eax,ebx
        mov ebx,edx
        JMP L1

    EXCH:
        XCHG eax,ebx
        JMP L1

    DONE:
        mov eax,ebx
        mov edx, offset msg3
        call writestring
        call writedec
        ret 8



    CalcGcd ENDP
    END main

代码在返回前缺少一个
pop ebp
调用start
将反复循环,直到程序耗尽堆栈空间。

实际上不需要条件交换:另一次迭代
div
将为您实现这一点,因为您保留余数并放弃商。(请参阅。)但是
div
的速度非常慢,因此在某些迭代中使用
xchg
来进行分支实际上可能值得受到分支预测失误的惩罚。