汇编 用文件操作的矩阵乘法运算必须是用文件进行操作的.求各位大侠,从速.完后重分赏.

来源:学生作业帮助网 编辑:作业帮 时间:2024/04/30 09:40:57

汇编 用文件操作的矩阵乘法运算必须是用文件进行操作的.求各位大侠,从速.完后重分赏.
汇编 用文件操作的矩阵乘法运算
必须是用文件进行操作的.求各位大侠,从速.完后重分赏.

汇编 用文件操作的矩阵乘法运算必须是用文件进行操作的.求各位大侠,从速.完后重分赏.
; 本程序通过编译,运行正确
Code Segment
Assume CS:Code,DS:Code
; -------------------------------------
; 功能:显示指定地址(Str_Addr)的字符串
; 入口:
; Str_Addr=字符串地址(要求在数据段)
; 用法: Output Str_Addr
; 用法举例:Output PromptStr
Output MACRO Str_Addr
push dx
lea dx,Str_Addr
mov ah,9
int 21h
pop dx
EndM
; -------------------------------------
; 功能:建立文件,保存文件代号
; 入口参数:dx=文件名地址,bx=文件代号保存地址
Create_File Proc Near
push cx
push ax
xor cx,cx ;新建文件属性
@@Create: mov ah,3ch ;建立文件
int 21h
jc @@Create ;建立不成功,尝试再建
mov [bx],ax ;成功建立,保存文件代号
inc bx
inc bx
pop ax
pop cx
ret
Create_File EndP
; -------------------------------------
; 功能:把AX中的二进制无符号数转换成显式的十进制ASCII码
; 入口:AX=二进制数,DI=转换后的ASCII码数字保存地址
; 出口:把转换后的ASCII码数字串保存在指定的存储单元
Dec_ASCII Proc Near
push dx
push cx
push bx
push si
push di
mov bx,10
lea di,@@Temp_Save[4]
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov [di],dl
dec di
test ax,0ffffh
jnz @@Divide
mov si,di
inc si
lea cx,@@Temp_Save[5]
sub cx,si
pop di
rep movsb
pop si
pop bx
pop cx
pop dx
ret
@@Temp_Save db 5 dup(?)
Dec_ASCII EndP
; -------------------------------------
; 功能:将指定行列的矩阵转换成ASCII码,以文本形式写入文件,最后关闭文件
; 入口参数:si=矩阵地址,bx=文件代号,cx=矩阵行数,dx=矩阵列数
Write_File Proc Near
lea di,Buffer ;数据缓冲区地址
@@Line: push cx
mov cx,dx
@@Column: lodsb ;读入一个矩阵元素
xor ah,ah
call Dec_ASCII
cmp cx,1
jz $+5
mov al,20h ;空一格
stosb
loop @@Column
mov al,0dh ;写一个回车符
stosb
mov al,0ah ;写一个换行符
stosb
pop cx
loop @@Line
@@Write_File:
lea dx,Buffer ;数据缓冲区地址
mov cx,di
sub cx,dx ;写入文件的字节数
@@Write: mov ah,40h ;写文件
int 21h
jc @@Write ;写文件不成功,尝试再写
@@Close: mov ah,3eh ;关闭文件
int 21h
jc @@Close ;关闭不成功,尝试再关
ret ;成功关闭,结束子程序
Write_File EndP
; -------------------------------------
Even ;偶数地址
Handle_File dw ?,?,? ;文件代号
Matrix_A db 11,12,13,14 ;矩阵A,3行4列
db 21,22,23,24
db 31,32,33,34
Matrix_B db 41,42,43,44,45 ;矩阵B,4行5列
db 51,52,53,54,55
db 61,62,63,64,65
db 71,72,73,74,75
Press_Key db 13,10,13,10,'The complated.',7
db 13,10,13,10,'Press any key to exit...$'
; -------------------------------------
Start:
; 取命令行文件名参数,建立三个文件
mov ah,2fh ;取磁盘传送地址,返回在ES:BX
int 21h
add bx,2
mov di,bx
mov cx,80
mov al,13
cld
repnz scasb
push es
pop ds
push cs
pop es
mov cx,di
sub cx,bx
mov si,bx
lea di,Buffer
push cx
rep movsb
push cs
pop ds
mov byte ptr [di-1],0
pop cx
lea di,Buffer
push di
mov al,20h
repnz scasb
mov byte ptr [di-1],0
pop dx
push di
lea bx,Handle_File
call Create_File ;建立第一个文件
repnz scasb
mov byte ptr [di-1],0
pop dx
push di
call Create_File ;建立第二个文件
pop dx
call Create_File ;建立第三个文件
; -------------------------------------
; 把矩阵A和矩阵B分别保存于文件
lea si,Matrix_A ;矩阵A地址
mov cx,3 ;矩阵A行数
mov dx,4 ;矩阵A列数
mov bx,Handle_File ;第一个文件代号
call Write_File ;将矩阵A写入第一个文件
lea si,Matrix_B ;矩阵B地址
mov cx,4 ;矩阵B行数
mov dx,5 ;矩阵B列数
mov bx,Handle_File[2] ;第二个文件代号
call Write_File ;将矩阵B写入第二个文件
; -------------------------------------
;矩阵A乘矩阵B,产生矩阵C
lea si,Matrix_A ;矩阵A地址
lea di,Buffer ;数据缓冲区地址
mov bp,5 ;矩阵B列数
mov cx,3 ;矩阵C行数
@@Line_C: push cx
xor bx,bx ;矩阵B元素下标初值
mov cx,5 ;矩阵C列数
@@Column_C: push cx
xor dx,dx ;累加和初值
mov cx,4 ;元素相乘项数
push si
push bx
@@Multiple: lodsb
mul Matrix_B[bx]
add dx,ax ;累加
add bx,5 ;矩阵B元素下标增值
loop @@Multiple
pop bx
inc bx ;矩阵B元素下一列下标
pop si
pop cx
mov ax,dx
call Dec_ASCII
cmp cx,1
jz $+5
mov al,20h ;空一格
stosb
loop @@Column_C
add si,4 ;矩阵A元素下一行下标
mov ax,0a0dh ;回车、换行
stosw
pop cx
loop @@Line_C
mov bx,Handle_File[4] ;第三个文件代号
call @@Write_File ;写第三个文件,即矩阵C
; -------------------------------------
Output Press_Key ;提示操作完成,按任意键结束程序
mov ah,1
int 21h
Exit_Proc: mov ah,4ch ;结束程序
int 21h
Even
Buffer db ? ;数据处理缓冲区
Code ENDS
END Start ;编译到此结束