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