问题 问答题

编制一个程序,其实现的功能为:计算10个带符号字节数据的绝对值之和(和为字型),并且找出绝对值最小的数及其所在的偏移地址,将结果依次存入指定的内存区中,结果以0FH结束。
例如:
内存中有:23H, 14H,00H,08H,PEH, 87H,02H,01H,PPH,01H
结果为: BFH,00H,00H,02H,00H,0FH
部分程序已经给出,原始数据由过程LOAD从文件INPUT.DAT中读入以SOURCE开始的内存单元中。运算结果要求从 RESULT开始的内存单元存放, 由过程SAVE保存到文件OUTPUT.DAT中。
请填空BEGIN和END之间已给出的源程序使其完整,空白已经用横线标出,每行空白一般只需要一条指令,但采用功能相当的多条指令也行,考生也可以删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
对程序必须进行汇编,并与IO.OBJ链接产生可执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
[试题程序]
EXTRN LOAD:FAR,SAVE:FAR
N EQU 10
DSEGSEGMENT
SOURCE DBN DUP()
RESULT DB6 DUP(0)
MIN DB
NAME0DB’INPUT.DAT’,0
NAME1DB’OUTPUT.DAT’,0
DSEGENDS
SSEGEGMENT STACK
DB256 DUP()
SSEGENDS
CSEGSEGMENT
ASSUME CS:CSEG,DS:DSEG,SS:SSEG
STARTPROC FAR
PUSH DS
XORAX,AX
PUSH AX
MOVAX,DSEG
MOVDS,AX
LEADX,SOURCE
LEASI,NAME0
MOVCX,N
CALL LOAD
; ******** BEGIN ***********
LEASI,SOURCE
LEADI,RESULT
MOVDX,SI
MOVCX,N-1
MOVAL,[SI]
SUBAX,0
JNSNEXT
NEGAL
NEXT: MOVMIN,AL
ADD[DI],AL
(1)
AGAIN: INCSI
MOVAL,[SI]
ADDAL,0
JNSNEXT1
(2)
NEXT1: ADD[DI],AL
(3)
CMPMIN,AL
JBENEXT2
MOVMIN,AL
(4)
NEXT2: LOOP AGAIN
ADDDI,2
MOVAL,MIN
MOV[DI],AL
INCDI
MOV[DI],DX
ADDDI,2
MOV (5) ,0FH
*********** END *************
LEADX,RESULT
LEASI,NAME1
MOVCX,6
CALL SAVE
RET
STARTENDP
CSEG ENDS
ENDSTART

答案

参考答案:(1)ADC BYTE PTR [DI+1],0 (2)NEG AL (3)ADC BYTE PTR [DI+1],0 (4)MOV DX,SI (5)BYTE PTR [DI]

解析:
程序的整体结构是:先对数据进行判断,若是正数,则直接求和,否则求补以后再进行相加。并且对每个数的绝对值进行比较,绝对值最小的数放在MIN中,绝对值最小数的偏移地址放在DX中。
程序开始进行的是指针的初始化,SI中为SOURCE的偏移地址,DI中为RESULT的偏移地址,并将SOURCE中第一个存储单元的数据和地址分别放在AL和DX中。第一个数装入以后,需要对其进行判断,如果为正数的话,可以接着执行下面的程序段,否则就求出它的绝对值(即对其进行求补操作)。完成操作以后,就可以把第一个数当成比较对象和其他值的绝对值进行比较。首先将AL中的数放入MIN中,然后将其加到RESULT的第一个单元中(即DI所指的地址单元中),在执行加法运算时,要将其进位也加进去,所以第一个空白处应该填的内容是对进位进行相加,即ADC BYTE PTR[DI +1],0。
从第二个数据开始,程序进入循环,即后面的数将执行同一操作:判断是否为正数,若是正数,则直接加入DI所指的单元,否则求补以后再加入。同时,把数据的绝对值与MIN中的内容进行比较,如果数据的绝对值小于MIN则将数据放入M1N中,并且把此时的偏移地址SI存入DX中,否则执行下一次加法与比较操作。因此,对于2~4个空缺处来说,需要完成的就是上述的操作。
执行完加法操作和找出绝对值最小的数以后,接下来便是按照要求对结果进行存储。由于题目要求最后一个存储单元为 0FH,所以最后一步操作应该是存入0FH。由于此时DI已经指向RESULT的最后一个单元,因此可以直接存入。但需要注意的是不能使用MOV [DI],0FH的语句,因为这样将不知道是把0FH存入[DI]单元,还是把0FH和00H存入[DI]和[DI+1]单元,所以应该指定操作数的类型,即MOV BYTE PTR [DI],0FH。

单项选择题
判断题