编制一个程序,其实现的功能为:计算10个带符号字节数据的绝对值之和(和为字型),并且找出绝对值最小的数及其所在的偏移地址,将结果依次存入指定的内存区中,结果以0FH结束。 例如: 内存中有:23H, 14H,00H,08H,PEH, 87H

admin2009-02-15  45

问题 编制一个程序,其实现的功能为:计算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
   DSEG        SEGMENT
   SOURCE      DB        N  DUP(?)
   RESULT      DB        6  DUP(0)
   MIN         DB        ?
   NAME0       DB        ’INPUT.DAT’,0
   NAME1       DB        ’OUTPUT.DAT’,0
   DSEG        ENDS
   SSEG        EGMENT    STACK
               DB        256  DUP(?)
   SSEG        ENDS        
   CSEG        SEGMENT     
               ASSUME    CS:CSEG,DS:DSEG,SS:SSEG
   START       PROC      FAR
               PUSH      DS
               XOR       AX,AX
               PUSH      AX
               MOV       AX,DSEG
               MOV       DS,AX
               LEA       DX,SOURCE
               LEA       SI,NAME0
               MOV       CX,N
               CALL      LOAD
   ;    ********  BEGIN  ***********
               LEA       SI,SOURCE
               LEA       DI,RESULT
               MOV       DX,SI
               MOV       CX,N-1
               MOV       AL,[SI]
               SUB       AX,0
               JNS       NEXT
               NEG       AL
   NEXT:      MOV       MIN,AL
               ADD       [DI],AL
                 (1)  
   AGAIN:     INC       SI
               MOV       AL,[SI]
               ADD       AL,0
               JNS       NEXT1
                 (2)  
   NEXT1:     ADD       [DI],AL
                 (3)  
               CMP       MIN,AL
               JBE       NEXT2
               MOV       MIN,AL
                 (4)  
   NEXT2:     LOOP      AGAIN
               ADD       DI,2
               MOV       AL,MIN
               MOV       [DI],AL
               INC       DI
               MOV       [DI],DX
               ADD       DI,2
               MOV        (5)   ,0FH
   *********** END  *************
               LEA       DX,RESULT
               LEA       SI,NAME1
               MOV       CX,6
               CALL      SAVE
               RET         
   START       ENDP
   CSEG        ENDS
               END        START

选项

答案(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。
转载请注明原文地址:https://jikaoti.com/ti/cPV7FFFM
0

最新回复(0)