曲江池馆 发表于 2020-5-28 20:26:31

求助,求大佬看一看这段代码为何不对

最近学习汇编,最后要求写一个矩阵乘法的大作业,两个矩阵分别用文件里的数据,结果矩阵存入第三个文件
用vs自带的masm编译,总是出错。
严重性        代码        说明        项目        文件        行        禁止显示状态
错误        MSB3721        命令“ml.exe /c /NOlogo /Zi /Fo"Debug\123.obj" /W3 /errorReport:prompt/Ta..\..\123.asm”已退出,返回代码为 1。        Project1        C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\masm.targets        50
求教!!!
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
; -------------------------------------
; 功能:建立文件,保存文件代号
; 入口参数e799bee5baa6e78988e69d8331333239303866:dx=文件名地址,bx=文件代号保存地址
Create_File Proc Near
push cx
push ax
xor cx,cx ;新建文件属性
@@Create: mov ah,3ch ;建立文件
int 21h
jc @@Create ;建立不成功,尝试再建
mov ,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
cld
@@Divide: xor dx,dx
div bx
or dl,30h
mov ,dl
dec di
test ax,0ffffh
jnz @@Divide
mov si,di
inc si
lea cx,@@Temp_Save
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 ,0
pop cx
lea di,Buffer
push di
mov al,20h
repnz scasb
mov byte ptr ,0
pop dx
push di
lea bx,Handle_File
call Create_File ;建立第一个文件
repnz scasb
mov byte ptr ,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 ;第二个文件代号
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
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 ;第三个文件代号
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 ;编译到此结束


wp231957 发表于 2020-5-28 20:37:54

这是16位代码,你得在16位dos环境下编译

CodingCat_k 发表于 2020-5-28 20:55:19

首先要明确程序运行环境,比如:8086汇编就用DOSBOX编译,WIN32就用MASM32.
理论上X86存在向下兼容,但是现在都是保护模式了不是实模式;
所以,建议楼主下载DOSBOX进行16位程序模拟运行。
页: [1]
查看完整版本: 求助,求大佬看一看这段代码为何不对