请编制程序,其功能是:对一个由可打印ASCII字符(ASCII码20H~7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现该字符不变,如某字符连续出现n次,则该字符用ESC(1BH),n,三个字节来代替(假定n不超过255)。 例如:
3 V! |% o# L3 G2 L& r5 T 设内存中从SOURCE开始有一用上述方法压缩的字符串,其以00H结束,长度不超过100。试编程对其进行解压缩,结果存入RESULT开始的内存单元。
; P, k, Q, @, m; Y 原串: 41H,1BH,06H,43H,61H,00H
5 g1 o- o' B# j' Z+ v 解压后: 41H,43H,43H,43H,43H,43H,43H,61H,00H("ACCCCCCa"): c+ j; y2 ^9 @5 P0 L
部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。, }5 K; O9 U' L0 |, U
填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
8 r! {5 x1 Y3 n 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
/ \$ J& V9 m4 u1 J' w 试题程序:$ Z7 R G( t+ u* X5 W
EXTRN LOAD:FAR,SAVE:FAR7 D$ b3 ^% H2 p6 U9 s" X. T
N EQU 1008 b; _4 n# f' [+ J% S* ^* X
ESC_CODE EQU 275 y7 B/ l! D/ P, k D
STAC SEGMENT STACK' I! r" G5 B. d b
DB 128 DUP(?)
" v n; a5 w" n* } STAC ENDS8 I. I' Y1 G# h% E& z' \- g5 p
DATA SEGMENT
2 O. A) x3 m6 w5 M; h8 y$ U SOURCE DB N DUP(?)
) c, c0 w# p/ H7 A& O0 x RESULT DB N DUP(0)
0 N) @1 G3 Y$ M% F" u( z NAME0 DB 'INPUT1.DAT',0
1 Z' h. N! C7 t NAME1 DB 'OUTPUT1.DAT',0+ I6 ]4 e) Z: P! v9 a. A% e
DATA ENDS0 }/ Z6 W2 o$ r
CODE SEGMENT
5 f9 \* }4 v* U2 u3 }8 t) c ASSUME CS:CODE,DS:DATA,SS:STAC
( {! T6 f/ W- w0 t/ M START PROC FAR
/ x% X! p, h# x: h* K PUSH DS' `* O: n- q5 X6 j3 l* `. g
XOR AX,AX1 i6 G" t( M; \6 t6 I
PUSH AX. C; V. v2 E6 f2 a
MOV AX,DATA3 r. z/ m: Q+ B/ j
MOV DS,AX4 G8 Q% X7 s- M8 j% ~, G. ~
MOV ES,AX ;置附加段寄存器+ t( f3 T d3 w5 m# X) E8 h
LEA DX,SOURCE ;数据区起始地址" k+ f3 M t& F/ n2 l4 q6 ]1 a
LEA SI,NAME0 ;原始数据文件名
2 a( u1 N8 i7 q% x" x- j K4 x MOV CX,N ;字节数' d- ^; z3 |" n0 ~" ?$ n
CALL LOAD ;从'INPUT1.DAT'中读取数据- B* x# O3 s% E5 B; _4 i9 ~
;****BEGIN****, X2 _+ z" Y8 ~
LEA SI,SOURCE- ]/ W+ n4 J; F- U( D2 ^3 y0 Y# F3 G
LEA DI,RESULT
U2 g- J' v8 x$ Q CLD
) `9 T* R9 U" J- D# z L0: LODSB! Y/ Z; E8 ^( Y9 h; o# @, t2 y
CMP AL,03 Z! t* R1 \9 j! x# n9 y
JE QUIT
$ x0 G5 B1 q+ _1 F. A CMP AL,ESC_CODE6 H- _7 C' M$ T! E/ b" b2 `
J_______ EXPAND
) y: [" n% ~% [4 F, _4 J3 g( O ___________________________
7 K$ C: u% y7 H7 {+ x JMP L08 o5 M, v* @4 r$ ?, `) ~$ s
EXPAND: ___________________________ ;解压
% }: _" N7 n: O0 b! H: M; L6 h XOR CX,CX
8 g0 G% ~) P P5 X- r ___________________________# F. C) ^& ]' \2 [' D- R
___________________________) e" }8 |6 ?" F7 K$ `0 t
___________________________* e$ [: {1 v. j
___________________________
2 t( X+ C. R: o6 u; N JMP L0
- l0 m8 Y$ y6 g a# m" _ QUIT: STOSB ;STORE THE '00H'5 P- c) w7 }* @+ x& g' p8 t! c
;****END****
d2 C( b5 }5 N0 z9 y. D/ @ LEA DX,RESULT ;结果数据区首址, H' o2 T6 Y9 x5 I+ ]
LEA SI,NAME1 ;结果文件名
$ X5 \3 J& {- W MOV CX,N ;字节数; m# N1 S! h. I# e$ J6 T( G& |* m0 Z
CALL SAVE ;保存结果到文件
. o. R5 [- T: x8 ]& n: P* p RET
0 b3 T2 x# [# Q8 Z0 Q START ENDP7 B, a. v- [1 A5 Q5 i
CODE ENDS
1 I3 M- j5 @2 A* B8 Y4 O END START |