求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
-
运行结果: