Assembly 8086汇编语言程序求两个数的GCD
当它点击“ret8”时,我的程序停止工作。有人能告诉我为什么吗 查找用户输入的2个数字的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
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
来进行分支实际上可能值得受到分支预测失误的惩罚。