请编制程序PROG1.ASM,其功能是:将内存中的20个有符号字节数据依次除以5,并按照四舍五入原则(即余数绝对值的2倍小于除数,则舍去)将商存入指定的内存区域。 例如: 内存中有:10H,01H,27H,00H,FFH,FSH,…… 结

admin2009-02-15  19

问题 请编制程序PROG1.ASM,其功能是:将内存中的20个有符号字节数据依次除以5,并按照四舍五入原则(即余数绝对值的2倍小于除数,则舍去)将商存入指定的内存区域。
   例如:
   内存中有:10H,01H,27H,00H,FFH,FSH,……
   结果为:03H,00H,08H,00H,00H,FEH,……
   部分程序已给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件 OUTPUT1.DAT中。
   填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处,请加以修改。
    试题程序:
             EXTRN     LOAD:FAR,SAVE:FAR
   N         EQU       20
   X         EQU       5
   DSEG      SEGMENT
   SOURCE    DB        N DUP(?)
   RESULT    DB        N DUP(0)
   NAME0     DB        ’INPUT1.DAT’,0
   NAME1     DB        ’OUTPUT1.DAT’,0
   DSEG      ENDS
   SSEG      SEGMENT    STACK
             DB         256 DUP (?)
   SSEG      ENDS
   CSEG      SEGMENT
             ASSUME      CS:CSEC, SS:SSEC, 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,NAME0
             MOV         CX,N
             CALL        LOAD
   ; *** BEGIN ***
             LEA         SI,SOURCE
             LEA         DI,RESULT
   CONT:     LODSB
             CBW
             MOV         DL,X
             IDIV        DL
               (1)                  ; 余数为负数吗
             JNS         PLUS
               (2)                  ; 求绝对值
             ADD         AH,AH
             CMP         AH,DL
             JB            (3)   
             SUB         AL,1
             JMP         NEXT
   PLUS:     ADD          (4)   
             CMP         AH,DL
             JB          NEXT
               (5)   
   NEXT:     STOSB
             CMP         SI,N
             JB          CONT
   ; *** END ***
             LEA         DX,RESULT
             LEA         SI,NAME 1
             MOV         CX,N
             CALL        SAVE
   RET
   START     ENDP
   CSEG      ENDS
             END       START

选项

答案(1)CMP AH,0 (2) NEG AH (3) NEXT(4) AH,AH (5) ADD AL,1

解析 每个数除以5之后首先判断余数是否为负,即比较AH与零;如果为负,要将AH中的值用NEG指令取绝对值后再执行后续操作,即计算余数绝对值的两倍,若小于商直接舍去(四舍),跳至NEXT(第3空)执行存储操作,否则加一(第五空,五入)后存储。
转载请注明原文地址:https://jikaoti.com/ti/JlV7FFFM
0

最新回复(0)