请编制程序PROG1.ASM,其功能是:对一个由可打印ASCII字符(ASCII码20H-7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现则该字符不变,如某字符连续出现n次,则该字符用ESC(1BH),n,〈原字符〉三个字节

admin2009-02-15  33

问题 请编制程序PROG1.ASM,其功能是:对一个由可打印ASCII字符(ASCII码20H-7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现则该字符不变,如某字符连续出现n次,则该字符用ESC(1BH),n,〈原字符〉三个字节来代替(假定n不超过255)。
   设内存中从SOURCE开始有一用上述方法压缩的字符串,其以00H结束,解压后长度不超过 100。试编程对其解压缩,结果存入RESULT开始的内存单元。
   例如:
   原串:41H,1BH,06H,43H,61H,00H
   解压后:41H,43H,43H,43H,43H,43H,43H,61H,00H("ACCCCCCa")
   部分程序已在PROG1.ASM中给出,请填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令,但功能相当的多条指令亦可)或删除BEGIN和 END之间原有的代码并自行编写程序片段来完成要求的功能。
   原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,结果要求从 RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
   对程序必须进行汇编,并与IO.OBI链接产生PROG1.EXE执行文件,最终运行程序产生结果 (无结果或结果不正确者均不得分)。
   PROG1.ASM文件内容如下:
                EXTRN        LOAD:FAR,SAVE:FAR
   N            EQU          100
   ESC_CODE     EQU          27
   STAC         SEGMENT      STACK
                DB           128DUP(?)
   STAC         ENDS
   DATA         SEGMENT
   SOURCE       DB           N  DUP(0)
   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
                MOV          ES,AX      ;置附加段寄存器
                LEA          DX,SOURCE    ;数据区起始地址
                LEA          SI,NAME0     ;原始数据文件名
                MOV          CX,N         ;字节数
                CALL         LOAD          ;从’input1.DAT’中读取数据
   ;*  *  *  * BEGIN *  *  *  *
                LEA          SI,SOURCE
                LEA          DI,RESULT
                CLD
   LO:          LODSB
                CMP          AL,0
                JE           QUIT
                CMP          AL,ESC_CODE
                _____        EXPAND
                _____        _____
                JMP          LO
   EXPAND:     _____        _____         ;解压
                XOR          CX,CX
                _____        _____
                _____        _____
                _____        _____
                _____        _____
                JMP          LO
   QUIT:
                STOSB                ;STORE THE ’00H’
   ;*  *  *  *  END  *  *  *  *
                LEA          DX,RESULT    ;结果数据区首址
                LEA          SI,NAME1     ;结果文件名起始地址
                MOV          CX,N         ;字节数
                CALL         SAVE          ;保存结果到’OUTPUT1.DAT’文件中
                RET
   START        ENDP
   CODE         ENDS
                END          START

选项

答案;* * * * BEGIN * * * * LEA SI,SOURCE LEA DI,RESULT CLD LO:LODSB ;从源数据区取一个字节放入AL CMP AL,0 ;判断AL中是否是可打印ASCII字符 JE QUIT ;若不是,则退出 CMP AL,ESC_CODE 判断是否是 ESC JZ EXPAND ;若是,则进行解压 MOV [DI],AL ;若不是,则保存,接着取下一个字节 INC DI JMP LO EXPAND:MOV AL,[SI] ;解压,取出该字符的个数,放入CX中 XOR CX,CX MOV CL,AL INC SI AGAIN:MOV AL,[SI] MOV [DI],AL INC DI LOOP AGAIN INC SI JMP LO QUIT: STOSB ;STORE THE ’00H’ ;* * * * END * * * * 输入数据 41 1B 03 42 65 1B 19 42 43 1B 03 44 45 1B 23 48 49 4A 4C 1B 0C 47 1B 0E 4D 00 00 00 00 00 00 00 00 00 000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0000 00 输出结果: 41 42 42 42 65 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 43 44 44 44 45 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 49 4A 4C 47 47 47 47 47 47 47 47 47 47 47 47 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 00

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

最新回复(0)