哪位汇编高手能帮我“用汇编语言求两个数的最小公倍数和最大公约数”?
1、一定要用汇编语言哪
2、两个数为16位以内带符号的字型
3、每句后面加上注释~~
追问:最小公倍数运行不出来嗳,老是显示:devide overflow可以再改一下不?额,还有注释的语句能多写点不?谢谢啦~~好吧,我继续追问:把每句都加注释吧!我就菜鸟一个,啥也不懂,只能看注释来研究研究了……而且,之前最大公约数还能运行出来的现在都运行不出来了,现在那个运行出来的最大公约数挺大的,最小公倍数直接是0,麻烦了,谢谢啊~~
答案:data segment
x dw ?
y dw ?
z dw ?
data ends
code segment
assume cs:code, ds:data
start:
call shuru
mov x, bx
call shuru
mov y, bx
call gongyueshu
mov bx, z
call xianshi
call gongbeishu
jmp out1
shuru: ; 输入数字到bx
mov bx, 0
s1:
mov ah, 1
int 21h
cmp al, 0dh ; 输入是回车是结束
jz exit
and ax, 000fh
xchg ax, bx
mov cx, 10
mul cx ;之前输入的数乘以10 加上新输得数..比如123先是 0*10+1 ->1*10+2 ->12*10+3
add bx, ax
jmp s1
exit: ;输入了回车 退出
mov dl, 0ah ;换行
mov ah, 2
int 21h
ret
xianshi: ; 显示bx当中的数
mov dl, 0ah ;换行
mov ah, 2
int 21h
mov ax, bx
mov bx, 10
mov cx, 0
let1: ;将要显示的数处以10 把余数入栈
mov dx, 0
inc cx
idiv bx
push dx
cmp ax, 0 ;余数为0时结束
jnz let1
let2:
pop ax ;将余数弹入 ax
add ax, 3030h ;余数调整为asc码
mov dl, al ;显示
mov ah, 2
int 21h
loop let2
ret
gongyueshu: ;求 x 和 y 的最大公约数..bx是除数
mov bx, 1
ss1:
mov dx, 0
mov ax, x
div bx
cmp dx, 0
jnz ss2 ; 如果bx不能被x整除 bx不是公约数 跳到ss2
mov dx, 0
mov ax, y
div bx
cmp dx, 0
jnz ss2 ; 如果bx不能被y整除 bx不是公约数 跳到ss2
mov z, bx ;如果既能被x整除又能被y整除的值放到z里面
ss2: ; bx加到等于被除数的时候跳出 ..否则除数加1..判断bx+1是不用公约数..
cmp bx, x
inc bx
jnz ss1
ret
gongbeishu: ;公倍数就是x乘y在除以最大公约数...
mov ax, x
mul y
div z
mov bx, ax
call xianshi
ret
out1:
mov ah, 4ch
int 21h
code ends
end start
上一个:求Linux内核、操作系统原理、汇编语言的学习顺序
下一个:汇编问题,请高手指教