有时间的写的请进来下!

zhoulong12ag 2008-12-26 05:20:50
想求个乘法运算器.可以输入小数进行运算的,有人能帮写下吗?
只要乘法运算的.要求输入2位数相乘.
急 12月29号前谁能给个答复!!!
...全文
111 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulong12ag 2008-12-28
  • 打赏
  • 举报
回复
看错了 谢谢了
zhoulong12ag 2008-12-28
  • 打赏
  • 举报
回复
这个是除法运算。 。。。我要的是乘法。。。急
ahalf 2008-12-27
  • 打赏
  • 举报
回复
用浮点命令fmul
xiaopoy 2008-12-27
  • 打赏
  • 举报
回复
确实不错,不过自己这样转换小数运算为整数运输还是不比转换为浮点后设计起来容易啊
ckh2007 2008-12-27
  • 打赏
  • 举报
回复
为什么我用msam5.0编译不出来
BAYNPU 2008-12-27
  • 打赏
  • 举报
回复
楼上编写的乘法运算器程序很不错!
killbug2004 2008-12-27
  • 打赏
  • 举报
回复
我该别人的,撮合看看,自己再改一下吧
.model small
.386
.stack 64
.data

;输入参数表
mes1 db 'sum1=$'
mes2 db 0dh,0ah
db 'sum2=$'
result db 0dh,0ah
db 'result=$'
ascprod db 11 dup(30h),'$'

sum1 label byte ;
maxlen1 db 5
actlen1 db ?
sum1fld db 5 dup(?)

sum2 label byte ;
maxlen2 db 5
actlen2 db ?
sum2fld db 5 dup(?)


;数据项
binprod dw 00 ;暂存转化的二进制值
binsum1 dw 00 ;sum1的二进制值
binsum2 dw 00 ;sum2的二进制值
decind db 00 ;小数点标志
mult10 dw 01 ;乘积因子
nodecims dw 00 ;整体小数位数
shift dw ? ;移位倍数
adjust dw ? ;折半

.code
a10main proc far
mov ax,@data
mov ds,ax
mov es,ax

mov dx,offset mes1
mov ah,9
int 21h
mov dx,offset sum1
mov ah,0ah
int 21h

mov dx,offset mes2
mov ah,9
int 21h
mov dx,offset sum2
mov ah,0ah
int 21h

call c10 ;把sum1转换为二进制
call d10 ;把sum2转换为二进制
call e10 ;计算乘积,舍入
call f10 ;把乘积转化成ASCII
call g10 ;显示乘积

mov ax,4c00h
int 21h
a10main endp


;把sum1转换为二进制
c10 proc near
mov nodecims,00 ;清除十进制小数位的长度
movzx cx,actlen1 ;sum1的长度 数据传送扩展指令movzx 源操作数<=目的操作数长度
lea si,sum1fld-1
add si,cx ;设置sum1的右进位置,si指向最低位
call j10 ;转换成二进制
mov ax,binprod
mov binsum1,ax ;存放二进制结果
ret
c10 endp


;把sum2转换为二进制
d10 proc near
movzx cx,actlen2 ;长度
lea si,sum2fld-1
add si,cx ;设置右进位置
call j10 ;转换成二进制
mov ax,binprod
mov binsum2,ax ;存放二进制结果
ret
d10 endp


;计算乘积,舍入
e10 proc near
mov cx,11 ;乘积长度
lea di,ascprod
mov al,30h
cld
rep stosb
mov shift,10 ;初始移位因子
mov adjust,00
mov cx,nodecims ;小数位数
sub cx,02
jle e30 ;如果小数位多于2位,设为2
mov nodecims,02
mov ax,01
e20:
imul ax,10 ;移位因子
loop e20
mov shift,ax
shr ax,1 ;舍入值=移位的一半
mov adjust,ax
e30:
mov ax,binsum1
mul binsum2 ;sum1*sum2=乘积
add ax,adjust
adc dx,00
cmp adjust,00 ;移位
jz e40
push ax
mov ax,dx
mov dx,0
div shift
mov bx,ax
pop ax
div shift
;mov cx,dx
mov dx,bx
e40:
ret
e10 endp


;把乘积转化成ASCII
f10 proc near
lea si,ascprod+8
mov byte ptr[si],'.' ;在ASCII乘积设置十进制小数点
add si,nodecims ;设置右边起点
f20:
cmp byte ptr[si],'.'
jne f30
dec si
f30:
cmp dx,0
je f40 ;当乘积中dx为0转f40
push ax ;当乘积超16,防止除法溢出
mov ax,dx ;被除数DX AX
mov dx,0 ;除数CX
mov cx,10 ;商DX AX
div cx ;余数CX
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
or cl,30h
mov [si],cl
dec si
jmp f20
f40:
cmp ax,10 ;当dx=0用循环除十求余
jb f50
mov cx,10
div cx
or dl,30h
mov [si],dl
dec si
mov dx,0
jmp f20
f50:
or al,30h
mov [si],al
ret
f10 endp


;显示乘积
g10 proc near
mov cx,10 ;ascprod的长度
lea si,ascprod
g20:
cmp byte ptr[si],30h
jne g30
cmp byte ptr[si+1],'.'
jz g30
mov byte ptr[si],20h ;在ascprod中前导零,成空白
inc si
loop g20
g30:
mov ah,9
mov dx,offset result
int 21h ;显示乘积提示符
mov dx,offset ascprod
int 21h
ret
g10 endp


;把ASCIIsum1和sum2转换成二进制在入口处
j10 proc near
mov mult10,0001 ;初始化
mov binprod,00
mov decind,00
xor bx,bx
j20:
mov al,[si] ;si指向最低位
cmp al,'.' ;取ASCII字符十进制小数点
jne j30
mov decind,01
jmp j40
j30:
and ax,000fh
mul mult10
add binprod,ax
mov ax,mult10
imul ax,10
mov mult10,ax
cmp decind,00
jnz j40
inc bx ;累计小数位数
j40:
dec si ;遇小数点指向下一位
loop j20
cmp decind,00
jz j90
add nodecims,bx ;存储2个数的小数总位数
j90:
ret
j10 endp

end a10main
zhoulong12ag 2008-12-27
  • 打赏
  • 举报
回复
麻烦高手帮写下.我很急的,跪求了!
xiaopoy 2008-12-27
  • 打赏
  • 举报
回复
fld REAL4 [source0];假设source0为读取到的操作数0
fst st[1]
fld REAL4 [source1];假设source1为读取到的操作数1
fmul st[0],st[1];
fstp REAL8 [direct];假设direct为保存64位结果的区域

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧