求x和y的最大公约数gcd(x,y),x和y均为无符号字型整数。
思路:
if(x > y && y > 0)
{
do
{
z = x % y ;
x = y ;
y = z ;
}While( z != 0 )
gcd = x ;
}
Include io.inc
.model small ;定义程序的存储模型(small表示小模型)
.stack
.data
x dw 15
y dw 0
result dw ?
msg db 'input error$'
.code
.startup
call gcd
.exit
gcd proc ;用于求最大公约数的子程序
mov ax,x ;取第一个数据
mov bx,y ;取第二个数据
cmp ax,bx ;比较验证x>y?
jnb L0 ;第一个数高于等于第二个数,转移到L0
mov y,ax ;否则,交换两个数,避免除数大于被除数
mov x,bx
L0: ;继续验证y>0?
mov ax,x
mov bx,y
cmp bx,0 ;比较y和0的大小
ja L1 ;y高于0,转移到L1
mov dx,offset msg ;y不大于0,则输入错误没有最大公约数
mov ah,9 ;9号功能显示
int 21h
L1:
mov ax,x
mov bx,y
mov dx,0 ;初始化dx为0
div bx ;x%y,两个数字相除,余数自动存入dx中
cmp dx, 0 ;比较dx与0
je L_End ;余数为0时,则找到了最终的最大公约数,跳转到L_End
mov ax,y ;若上一步余数不为0,则将除数y放入ax中
mov x, ax ;再把原除数y,通过ax传递给x,作为用作下一次操作的被除数,即x=y
mov y,dx ;再把dx内的余数,赋给y,作为下一次操作的除数 (从而再次保证了x>y),即y=z
jmp L1 ;跳转回L1
L_End:
mov result,bx ;将最大公约数赋值给result
mov ax, result ;结果显示
call dispsiw
ret
gcd endp
end
运行结果: