试题要求如下:
请编制程序,其功能是:计算10×2矩阵中每一行元素(八位二进制数)之和,将其放在指定的内存区中。
例如:
内存中有:0,0(第1行),1,1(第2行),……,9,9(第10行)
结果为: 0000H,0002H,0004H,……,0012H
部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算的结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。补充BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
对程序进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中发现整个程序中存在错误之处,请加以修改。
试题程序:
EXTRNLOAD: FAR, SAVE: FAR
N EQU 20
DATA SEGMENT
SOURCE DB N DUP()
RESULT DB N/3 DUP(0)
I EQU 10
J EQU 2
NAME0 DB ’INPUT1.DAT’, 0
NAME1 DB ’OUTPUT1.DAT’, 0
DATA ENDS
SSEG SEGMENT STACK
DB 256DUP ( )
SSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, SS: SSEG, DS: DATA
START PROCFAR
PUSHDS
XOR AX, AX
PUSHAX
MOV AX, DATA
MOV DS, AX
LEA DX, SOURCE; 数据区起始地址
LEA SI, NAME0 ; 原始数据文件名
MOV CX, N ; 字节数
CALLLOAD ; 从’INPUT1.DAW’中读取数据
; **** BEGIN ****
LEA SI, SOURCE
LEA DI, RESULT
MOV BX, 1
LOP1 MOV DX, 0
MOV CX, I
LOP2 MOV AL, [SI]
(1)
ADD DX, AX
INC (2)
INC CX
CMP CX, (3)
JBE LOP2
MOV [DI], DX
ADD DI, (4)
INC BX
CMP BX, I
JBE (5)
; **** END ****
LEA DX, RESULT ; 结果数据区首址
LEA SI, NAME1 ; 结果文件名
MOV CX, L*2/3 ; 结果字节数
CALLSAVE; 保存结果到文件
RET
START ENDP
CODE ENDS
END START
参考答案:
(A) MOV AH, 0 ; 设初值
(B) SI ; 向下移动地址,对下一个数据进行计算
(C) J ; 判断数据是否超出该行的范围
(D) B ; 保存所求的数据,下移两个单位是因为数据为字的形式
(E) LOOPA
解析:
程序的功能是求出每行所有数据的和,该功能在LOP2中完成。首先从矩阵第一行第一列的数据开始算起,和该行的下一列数据求和,直到判断下个数据的计算个数超过 2时,说明该行结束。然后保存该行计算完的和,注意,保存的数据应该是字的形式。