主题:汇编-编写程序:实现双字长(32 bit)无符号整数乘法
wengzq
[专家分:0] 发布于 2008-05-26 22:08:00
请哪位高手帮小弟这个忙吧、、
在下急需这个程序 啊!~
谢谢了~~
回复列表 (共14个回复)
沙发
日落C山 [专家分:90] 发布于 2008-05-27 23:32:00
在5月24日的那个帖子里已经回了,用的是分段的办法,测试过了可以
板凳
wengzq [专家分:0] 发布于 2008-05-28 20:00:00
上次那个我试过了,不行啊!
我在DOS下建立OBJ文件时出现了“2个server error”有错 啊
请你帮忙再调试一下啊!
不然告诉我个好的软件编译啊
谢谢了
3 楼
日落C山 [专家分:90] 发布于 2008-05-28 22:28:00
我刚刚又试了一下,可以的,我用的是masm 6.15 ,代码还是一样的
.model small
.stack
.data
buf1 dd 12345678h
buf2 dd 12345678h
result dw 4 dup(0)
.code
.startup
mov di,offset buf1
lea si,buf2
mov ax,[di]
mov bx,[si]
mul bx
mov result,ax
mov result+2,dx
mov ax,[di+2]
mul bx
add result+2,ax
adc result+4,dx
mov ax,[di+2]
mov bx,[si+2]
mul bx
add result+4,ax
adc result+6,dx
mov ax,[di]
mul bx
add result+2,ax
adc result+4,dx
adc result+6,0
.exit 0
end
对了,你那个出现的错误是关于什么方面的?
4 楼
wengzq [专家分:0] 发布于 2008-06-03 15:08:00
[em2]程序我试过了可以了,但是我都不懂每一句的意思啊,你能不能帮人帮到底呢,帮我把每一行的每句话解释一下 啊!
急用,谢谢了!
5 楼
wengzq [专家分:0] 发布于 2008-06-05 18:14:00
你上次给我的程序,运行后没有显示输出结果result的值
麻烦你帮忙再修改一下使其能够显示输出result的值,
还有如果有办法的话,能不能使程序提示输入两个数字,之后按回车显示相乘的结果呢 ?
谢谢了!~
6 楼
日落C山 [专家分:90] 发布于 2008-06-07 10:45:00
这个。。。难度有点大啊!尤其是输入的那个,比较令人头痛!
7 楼
日落C山 [专家分:90] 发布于 2008-06-07 12:51:00
.model small
.stack
.data
buf1 dd 12345678h
buf2 dd 12345678h
result dw 4 dup(0)
.code
.startup
mov di,offset buf1 ;获取第一个数据的地址
lea si,buf2 ;获取第二个数据的地址
mov ax,[di] ;将第一个数据的低字节传给ax
mov bx,[si] ;将第二个数据的低字节传给bx
mul bx ;低字节相乘,结果放在dx.ax中
mov result,ax ;结果加到result的低16位
mov result+2,dx ;就像十进制的个位数和个位数相乘,结果加在个位和十位上一样
mov ax,[di+2] ;将第一个数据的高字节传给ax,bx还是放第二个数据的低字节
mul bx ;高字节和低字节相乘,结果放在dx.ax中
add result+2,ax ;结果加到result的17到24位
adc result+4,dx ;就像十进制的十位数和个位数相乘,结果加在十位和百位上一样
mov ax,[di+2] ;将第一个数据的高字节传给ax
mov bx,[si+2] ;将第二个数据的高字节传给bx
mul bx ;高字节相乘,结果放在dx.ax中
add result+4,ax ;结果加到result的高16位
adc result+6,dx ;就像十进制的十位数和十位数相乘,结果加在百位和千位上一样
mov ax,[di] ;将第一个数据的低字节传给ax,bx还是放第二个数据的高字节
mul bx ;低字节和高字节相乘,结果放在dx.ax中
add result+2,ax ;结果加到result的17到24位
adc result+4,dx ;就像十进制的个位数和十位数相乘,结果加在十位和百位上一样
adc result+6,0 ;上步结果有可能产生进位,若进位则加到高位去。
.exit 0
end
8 楼
wengzq [专家分:0] 发布于 2008-06-07 13:32:00
如果输入的难度实在很大,那就算了,不过你有办法把result的值输出到界面吗?
即显示出来吗?
如果有的话帮忙弄下,没办法的话也就算了!
还是很感谢你 啊!~
谢谢啦!!高手。。。
9 楼
wengzq [专家分:0] 发布于 2008-06-07 13:44:00
stack segment para stack
dw 20H dup(30)
stack ends
data segment
buf1 dd 0000000fh
buf2 dd 00000008h
result dw 4 dup(0) ;重复4个字单元,每个字单元预置数据0,共分配10*2=20(14H)个字节存储单元
doubleword db 64 dup(61h)
doubleword1 db 71 dup(?)
data ends
code segment
assume cs:code, ds:data, ss:stack
start:
mov ax,data
mov ds,ax
;两个32位相乘的算法
mov di,offset buf1 ;把offset的偏移地址给di
lea si,buf2 ;把buf2的有效地址即偏移地址给si
mov ax,[di]
mov bx,[si]
mul bx
mov result,ax
mov result+2,dx ;result+2是在result的下一个字存储单元
mov ax,[di+2]
mul bx
add result+2,ax
adc result+4,dx
mov ax,[di+2]
mov bx,[si+2]
mul bx
add result+4,ax
adc result+6,dx
mov ax,[di]
mul bx
add result+2,ax
adc result+4,dx
adc result+6,0
;将result中数转存到doubleword这个存储空间中
sub si,si
xor cx,cx
mov cl,16
mov bx,0001h
lop:
test result,bx
jz next
mov doubleword[si], 31h ;87
jmp laa
next:
mov doubleword[si],30h
laa:
inc si
shl bx,1
loop lop
mov si,16
xor cx,cx
mov cl,16
mov bx,0001h
lop1:
test result+2,bx
je next1
mov doubleword[si],31h ;102
jmp laa1
next1:
mov doubleword[si],30h
laa1:
inc si
shl bx,1
loop lop1
mov si,32
xor cx,cx
mov cl,16
mov bx,0001h
lop2:
test result[4],bx
jz next2
mov doubleword[si],31h ;117
jmp laa2
next2:
mov doubleword[si],30h
laa2:
inc si
shl bx,1
loop lop2
mov si,48
xor cx,cx
mov cl,16
mov bx,0001h
lop3:
test result[6],bx
jz next3
mov doubleword[si],31h ;132
jmp laa3
next3:
mov doubleword[si],30h
laa3:
inc si
shl bx,1
loop lop3
;显示两数相乘的结果
sub si,si
sub bx,bx
sub dx,dx
sub di,di
mov di,0h
sub cx,cx
mov cl,8
lop4:
mov bl,cl
mov cl,8
www:
mov dl,doubleword[si]
mov doubleword1[di],dl
inc si
inc di
loop www
mov doubleword1[di],2ch
inc di
mov cl,bl
loop lop4
sub si,si
mov si,70
sub cx,cx
mov cl,71
lop5:
mov dl, doubleword1[si]
mov ah,02h
dec si
int 21h
loop lop5
;汇编结束
mov ah,4ch
int 21h
code ends
end start
这个程序的算法是你写的,然后我叫了一个网友帮我写进去了一些程序使其可以输出result的值了,但是我还是看不懂他的意思,麻烦你帮我看一下,
帮我再一次说明一下每一行,每一句话的意思吧,好吗??
10 楼
日落C山 [专家分:90] 发布于 2008-06-08 14:51:00
.model small
.stack
.data
buf1 dd 12345678h
buf2 dd 12345678h
result dw 4 dup(0)
.code
.startup
mov di,offset buf1
lea si,buf2
mov ax,[di]
mov bx,[si]
mul bx
mov result,ax
mov result+2,dx
mov ax,[di+2]
mul bx
add result+2,ax
adc result+4,dx
mov ax,[di+2]
mov bx,[si+2]
mul bx
add result+4,ax
adc result+6,dx
mov ax,[di]
mul bx
add result+2,ax
adc result+4,dx
adc result+6,0
call output
.exit 0
;
output proc
push ax ;保护寄存器的内容
push BX ;同上
push CX ;同上
push DX ;同上
push di ;同上
mov di,offset result+6 ;从最高字开始输出
mov bx,4 ;共需要输出4次(外层循环)
show: mov dx,word ptr[di] ;将最高字的值传入dx
mov cl,4 ;显示一个字需要4次
mov ch,4 ;一次显示一个16进制数(4位2进制可用一位16进制数表示)
adjust: rol dx,cl ;循环右移4位,将高四位的值放到低四位,准备显示
push dx ;保存移位后的结果以备下次显示使用
and dx,000fh ;屏蔽高12位的内容,为显示低4位的值做准备
cmp dx,9 ;测试低四位的值是否大于9
jbe display ;如果低四位的值小于等于9,直接转换为其ascii码
add dx,07h ;大于9则调整(A的ascii码是41h)
display: add dl,30h ;1-9的ascii码从30h-39h,故加30h
mov ah,02h ;显示
int 21hd
pop dx ;取出刚才保存的dx内容
dec ch ;循环次数减一(内层)
jnz adjust ;少于四次继续显示
sub di,2 ;准备显示次低字的内容
dec bx ;循环次数减一(外层)
jnz show ;少于四次继续显示
pop di ;恢复寄存器的内容
pop dx ;恢复寄存器的内容
pop cx ;恢复寄存器的内容
pop bx ;恢复寄存器的内容
pop ax ;恢复寄存器的内容
ret
output endp
end
显示result的值我用了个子程序(不用也可以),至于你那个网友写的程序,我没有看,因为太长了看了就头大,还有就是程序希望lz自己也能好好分析下,这样才会提高,其实我也只是个初学者,才刚开始学汇编,我觉得只有不断的去写去分析才能真正掌握一些知识,在此与楼主共勉,一起加油啊!
我来回复