请编制程序PROG1.ASM,其功能是:内存中连续存放着二个有符号字节序列Ak和Bk,求序列Ck(Ck=Ak+Bk)。例如: 源数Ak:0lH,02H,02H,02H,04H,05H… 源数Bk:01H,02H,02H,02H,04H,05H…

admin2009-02-15  22

问题 请编制程序PROG1.ASM,其功能是:内存中连续存放着二个有符号字节序列Ak和Bk,求序列Ck(Ck=Ak+Bk)。例如:
   源数Ak:0lH,02H,02H,02H,04H,05H…
   源数Bk:01H,02H,02H,02H,04H,05H…
   结果Ck:02H,04H,04H,04H,08H,0AH…
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUTl.DAT中读入SOURCE开始的内存元中,运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   请在BEGIN和END之间补充一段源程序,完成要求的功能。
   对程序必须进行汇编,并与IO.OBJ链接产生执行文件,最终运行程序产生结果。调试中若发现整个程序中存在错误之处,请加以修改。
   PROG1.ASM文件内容如下:
             EXTRN         LOAD: FAR, SAVE: FAR
   N         EQU           10          ;每个序列的长度
   STAC      SEGMENT       STACK
             DB            128 UP(?)
   STAC      ENDS
   DATA      SEGMENT
   SOURCE    DB            N * 2DUP(?)    ;顺序存放AO, ..., A9 ,BO,.. ,B9
   RESULT    DW            N DUP(0)       ;顺序存放CO,...,C9
   NAME0     DB            ’INPUT1. DAT’,0
   NAME1     DB            ’OUTPUT1. DAT’ ,0
   DATA      ENDS
   CODE      SEGMENT
             ASSUME        CS: CODE, DS: DATA, SS: STAC
   START     PROC          FAR
             PUSH          DS
             XOR           AX, AX
             PUSH          AX
             MOV           AX, DATA
             MOV           DS, AX
             LEA           DX, SOURCE     ;数据区起始地址
             LEA           SI, NAME0      ;原始数据文件名
             MOV           CX, N*2        ;字节数
             CALL          LOAD           ;从INPUT1.DAT文件中读取数据
   ; * * * * BEGIN * * * *
             MOV           DI,OFFSET RESULT ;结果从RESULT开始存放
             MOV           BX,0
             MOV           CX,N
   PRO:      MOV           AH ,0
             MOV           AL,_____        ;序列Bk中的一个字节
             MOV           DL, AL          ; 暂存Bk
             _____         AL, SOURCE [BX] ; Ck = Bk + Ak
             JNO           STAY            ; 无溢出转STAY
   JUMP1:    MOV           AH ,00          ; 有溢出
             ADD           DL,O
             JNS           JUMP            ; Bk是正数(为一个正数加上
                                           ; 一个正数,结果为负数的溢出
                                           ; 情况)转JUMP(AH已为OOH)
             MOV           AH,_____        ; Bk是负数(为一个负数加上
                                           ; 一个负数,结果为正数的溢出
                                           ; 情况)将结果变为有符号字的
                                           ; 形式(为负)
             JMP           _____
   STAY:     _____                         ; AL中数的符号扩展到AH,
                                           ; 符号字节变成无符号字,有符
                                           ; 号字节变成有符号字
   JUMP:     MOV          [DI], AX
             ADD          DI,2
             INC          BX
             DEC          CX
             JNZ          PRO
   ;* * * * END * * * *
             LEA          DX, RESULT       ; 结果数据区首址
             LEA          SI,NAME1         ; 结果文件名
             MOV          CX,N * 2         ; 结果字节数
             CALL         SAVE             ; 保存结果到文件
             RET
   START     ENDP
   CODE      ENDS
   END       START

选项

答案;* * * * BEGIN * * * * MOV DI,OFFSET RESULT ;结果从RESULT开始存放 MOV BX,0 MOV CX,N PRO:MOV AH,0 MOV AL,source[bx+n] ;序列Bk中的一个字节 MOV DL,AL ;暂存BK ADD AL,SOURCE[BX] ;Ck=Bk+Ak JNO STAY ;无溢出转STAY JUMP1:MOVAH,00 ;有溢出 ADD DL,0 JNS JUMP ;Bk是正数(为一个正数加上一个正数,结果为负数的溢出情况)转JUMP(AH已为OOH) MOV AH,0FFH ;趾是负数(为一个负数加上一个负数,结果为正数的溢出情况)将结果变为有符号字的形式(为负) JMP JUMP STAY: CBW ;AL中数的符号扩展到AH,无符号字节变成无符号字,有符号字节变成有符号字 JUMP: MOV [DI],AX ADD DI,2 1NC BX DEC CX JNZ PRO ; * * * * END * * * *

解析
转载请注明原文地址:https://kaotiyun.com/show/myrZ777K
0

最新回复(0)