请编制程序PROG1.ASM,其功能是:计算10×3矩阵中每一行元素(八位二进制数)之和,并将其存放在指定的内存区中。
例如:
内存中有0,0,0,(第1行),1,1,1,(第2行),……,9,9,9(第10行)
结果为0000H,0003H,…,001BH
部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。填空BEGIN和END之间已经给出的一段源程序使其完整,填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),考生也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成要求的功能。
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。
PROG1.ASM文件内容如下:
EXTRN LOAD: FAR, SAVE: FAR
N EQU 30
DSEG SEGMENT
SOURCE DB N DUP( )
RESULT DW N/3 DUP(0)
I EQU 10
J EQU 3
NAME0 DB ’INPUT1. DAT’ ,0
NAME1 DB ’OUTPUT1. DAT’ ,0
DSEG ENDS
SSEG SEGMENT STACK
DB 256 DUP()
SSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, SS: SSEG, DS: DSEG
START PROC FAR
PUSH DS
XOR AX, AX
PUSH AX
MOV AX, DSEG
MOV DS, AX
MOV ES, AX
LEA DX, SOURCE
LEA SI, NAMEO
MOV CX, N
CALL LOAD
; * * * BEGIN * * *
LEA SI, SOURCE
LEA DI, RESULT
MOV BX, 1
LPI: MOV DX,O
MOV CX, 1
LPJ: MOV AL, [SI]
_____
ADD DX, AX
INC _____
INC CX
CMP CX,_____
JBE LPJ
MOV [DI],_____
ADD DI,_____
INC BX
CMP BX, I
JBE LPI
; * * * END * * *
LEA DX, RESULT
LEA SI, NAME1
MOV CX, N/3
CALL SAVE
RET
START ENDP
CSEG ENDS
END START
参考答案:;* * * BEGIN * * *
LEA SI,SOURCE
LEA DI,RESULT
MOV BX,1 ;设置BX,BX用于行处理计数
LPI:MOV DX,0 ;LPI用于每行处理前的设初值;DX用于每行累计求和
MOV CX,1 ;CX用于每行求和计数
LPJ: MOV AL,[SI]
CBW ;将AL字节的符号扩展到AH中
ADD DX,AX ;求和
INC SI ;SI指向下一个存储单元
INC CX ;每加一次CX累加1
CMP CX,3 ;若CX大于3,则此行求和结束
JBE LPJ ;否则此行继续求和
MOV [DI], DX ;和值存入目的存储区
ADD DI,1 ;DI指向目的存储区下一个存储单元
INC BX ;累计处理过的行数
CMP BX,I ;若BX大于I,则整个求和存储过程完成,否则返回LPI继续求和
JBE LPI
; * * * END * * *
输入数据:
0101010202020303030404040
50505060606070707080808090909101010
输出结果:
03 06 09 0C 0F 12 15 18 1B 30