A-A+

请编制程序PROG1.ASM 其功能是:对一个由可打印ASCII字符(ASCII码20H-7

2022-08-05 20:12:13 问答库 阅读 171 次

问题详情

请编制程序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
_____ _____
请帮忙给出正确答案和分析,谢谢!

参考答案

正确答案:;* * * * BEGIN * * * *LEA SISOURCELEA DIRESULTCLDLO:LODSB ;从源数据区取一个字节放入ALCMP AL0 ;判断AL中是否是可打印ASCII字符JE QUIT ;若不是则退出CMP ALESC_CODE 判断是否是ESCJZ EXPAND ;若是则进行解压MOV [DI]AL ;若不是则保存接着取下一个字节INC DIJMP LOEXPAND:MOV AL[SI] ;解压取出该字符的个数放入CX中XOR CXCXMOV CLALINC SIAGAIN:MOV AL[SI]MOV [DI]ALINC DILOOP AGAININC SIJMP LOQUIT:STOSB ;STORE THE '00H';* * * * END * * * *输入数据41 1B 03 42 65 1B 19 42 43 1B 03 44 45 1B 23 4849 4A 4C 1B 0C 47 1B 0E 4D 00 00 00 00 00 00 0000 00 000000 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 000000 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 0000 0000 00输出结果:41 42 42 42 65 42 42 42 42 42 42 42 42 42 42 4242 42 42 42 42 42 42 42 42 42 42 42 42 42 43 4444 44 45 48 48 48 48 48 48 48 48 48 48 48 48 4848 48 48 48 48 48 48 48 48 48 48 48 48 48 48 4848 48 48 48 48 48 49 4A 4C 47 47 47 47 47 47 4747 47 47 47 47 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D4D 4D 4D 00
;* * * * BEGIN * * * *LEA SI,SOURCELEA DI,RESULTCLDLO:LODSB ;从源数据区取一个字节放入ALCMP AL,0 ;判断AL中是否是可打印ASCII字符JE QUIT ;若不是,则退出CMP AL,ESC_CODE 判断是否是ESCJZ EXPAND ;若是,则进行解压MOV [DI],AL ;若不是,则保存,接着取下一个字节INC DIJMP LOEXPAND:MOV AL,[SI] ;解压,取出该字符的个数,放入CX中XOR CX,CXMOV CL,ALINC SIAGAIN:MOV AL,[SI]MOV [DI],ALINC DILOOP AGAININC SIJMP LOQUIT:STOSB ;STORE THE '00H';* * * * END * * * *输入数据41 1B 03 42 65 1B 19 42 43 1B 03 44 45 1B 23 4849 4A 4C 1B 0C 47 1B 0E 4D 00 00 00 00 00 00 0000 00 000000 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 000000 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 0000 0000 00输出结果:41 42 42 42 65 42 42 42 42 42 42 42 42 42 42 4242 42 42 42 42 42 42 42 42 42 42 42 42 42 43 4444 44 45 48 48 48 48 48 48 48 48 48 48 48 48 4848 48 48 48 48 48 48 48 48 48 48 48 48 48 48 4848 48 48 48 48 48 49 4A 4C 47 47 47 47 47 47 4747 47 47 47 47 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D 4D4D 4D 4D 00

考点:字符,功能