请编制程序PROG1.ASM,其功能是:将连续20个字节的ASCII码(30~39之间)顺序转换成10个压缩BCD码。 例如:原始数据 31H,33H,35H,38H……(后面依次有16个ASCII码) 转换后为 13H,58H,……(后面

admin2009-02-15  64

问题 请编制程序PROG1.ASM,其功能是:将连续20个字节的ASCII码(30~39之间)顺序转换成10个压缩BCD码。
   例如:原始数据  31H,33H,35H,38H……(后面依次有16个ASCII码)
   转换后为  13H,58H,……(后面依次有8个压缩BCD码)
   部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,运算结果(要求从RESULT开始存入)由SAVE过程保存到OUTPUT. DAT中。请在BEGIN和END之间补充一段源程序,完成要求的功能。
   原有数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从RESULT开始存放,由SAVE保存到OUTPUT1.DAT文件
   对程序必须进行汇编,并与IO.OBJ连接产生PROG1.EXE执行文件,最终产生运行结果(无结果或结果不正确均不得分)。
   部分程序如下:
       EXTRN    LOAD:FAR,SAVE:FAR
       N        EQU   20
                        
       STAC     SEGMENT STACK
                DB    128 DUP(?)
       STAC     ENDS
                           
       DATA     SEGMENT
       SOURCE   DB    31H,32H,33H,34H,35H,36H,37H,38H
       RESULT   DB    N DUP(0)
       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          ; 字节数
       CALL     LOAD          ; 从 "INPUT1. DAT"中读取数据
**** BEGIN ****

**** END ****
       LEA    DX,RESULT     ; 结果数据区首地址
       LEA    SI, NAME1     ; 结果文件名
       MOV    CX,N          ; 结果字节数
       CALL   SAVE          ; 保存结果到文件
       RET         
START   ENDP      
CODE    ENDS           
       END    START
   相关知识:
   ●BCD码和压缩BCD码
   BCD码就是以二进制数表示十进制数,以4位二进制数表示1位十进制数,0000~1001表示0~9,1010~1111六个状态无意义。非压缩BCD码以一个字节表示一位BCD码,压缩BCD码一个字节表示两位BCD码。
   ●ASCII码与压缩BCD码之间的转换
   0~9的ASCH码为30H~39H,从数字的ASCII码求数字本身,只要用他的ASCII码减去30H即可。由两位非压缩BCD码构成一个字节的压缩BCD码可将高位的BCD码移到高四位,然后与低位的BCD码进行逻辑或(OR)操作即可完成。
   编程思路:
   第一步:分析本程序要求完成的功能。
   本程序要求完成以下功能:
   (1)从数据文件INPUT1.DAT中读取20个字节的ASCII码存放在SOURCE开始的内存单元中。
   (2)将SOURCE开始的20个ASCII码求出其对应的数值,然后转换成压缩的BCD码,依次放在RESULT开始的内存单元中。
   (3)将处理之后的字符串存入到OUTPUT1.DAT。
   第二步:用相应汇编程序来实现其功能。
   (1)数据的读取和存入题目中已经给出,只要完成20个ASCII码到压缩BCD的转换即可。
   (2)由ASCII码到压缩BCD码的转换过程如下:
   由于20位ASCII码正好转换成10个字节压缩BCD码,不存在某个字节的BCD码只有一位。因此依次从SOURCE开始的内存单元取两个ASCII码,前一个转换成压缩BCD码的高位,后一个转换成压缩BCD码的低位来构成压缩BCD码;每两个ASCII码转换成一个字节的压缩BCD码,直至转换完毕。

选项

答案 LEA SI,SOURCE LEA DI,RESULT MOV CX,N/2 LO: MOV AL,[SI] SUB AL,30H ;将ASCII码转换成10进制数 INC SI MOV AH,[SI] SUB AH,30H ;将第二个数转换成10进制数 SHL AH,1 SHL AH, SHL AH,1 SHL AH,1 ;将第二个数移到高4位中 OR AL,AH ;将两个BCD码,压缩到一个字节中,成为压缩 BCD码 MOV [DI],AL INC SI INC DI LOOP LO

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

最新回复(0)