当前位置:编程学习 > 汇编语言 >>

哪位汇编高手能帮我“用汇编语言求两个数的最小公倍数和最大公约数”?

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内核、操作系统原理、汇编语言的学习顺序
下一个:汇编问题,请高手指教

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,