请编制程序,其功能是:对一个由可打印ASCII字符(ASCII码20H~7FH)组成的字符串可采用下列方法进行压缩:从串首开始向后扫描,如某字符单独出现该字符不变,如某字符连续出现n次,则该字符用ESC(1BH),n,三个字节来代替(假定n不超过255)。 例如:1 p" m S* ]$ o7 p) ]
设内存中从SOURCE开始有一用上述方法压缩的字符串,其以00H结束,长度不超过100。试编程对其进行解压缩,结果存入RESULT开始的内存单元。+ A( c7 \1 u4 w9 E
原串: 41H,1BH,06H,43H,61H,00H( t; u2 U" Q1 u+ P3 N: f8 l
解压后: 41H,43H,43H,43H,43H,43H,43H,61H,00H("ACCCCCCa")
( q+ g. w9 D. f# N: `8 T" g+ P; V 部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
0 V5 i) d/ j# J 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。# ?* }. `) H/ A8 z3 J/ g
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。+ k) ~, E5 u0 |- i4 G: M
试题程序:& z7 w$ o6 `# Z; D3 Q% p7 F
EXTRN LOAD:FAR,SAVE:FAR
0 C+ b6 T6 }2 ^# ]0 N" ? N EQU 100: a2 O' @3 I; f5 [7 Q
ESC_CODE EQU 271 w3 B* O7 u( @. h, O$ m: J
STAC SEGMENT STACK
* B9 }& \) F, W( Q( | DB 128 DUP(?)
) J0 C1 o2 C3 [! g6 V6 A) [ STAC ENDS
$ v# ~' i8 P4 P! p: E4 r; t4 y4 S DATA SEGMENT: u7 |* C2 e' o
SOURCE DB N DUP(?)* v; l$ Z* o5 W& G ~
RESULT DB N DUP(0)
: K! P$ W0 u$ d- g+ [ NAME0 DB 'INPUT1.DAT',04 i) }7 R& z, B' d9 U$ C; C9 `
NAME1 DB 'OUTPUT1.DAT',0
- t: z2 z9 T" e7 L DATA ENDS& X7 n: C9 f' U3 I, f
CODE SEGMENT
1 W! m r& s/ Z. O. P7 l ASSUME CS:CODE,DS:DATA,SS:STAC
8 p/ a# {; Z$ F0 H; R3 J START PROC FAR+ I0 \' O" E; Y& D: |$ [
PUSH DS
% J* _5 F: a& X XOR AX,AX
( o6 i% P( V* b/ m( e2 e& P$ U, A PUSH AX( X) i* l$ C, r2 N+ g
MOV AX,DATA6 ]7 N4 c& `, \5 l+ x* K5 d
MOV DS,AX; w- W8 h, y! |' [! U) \
MOV ES,AX ;置附加段寄存器, G s, f1 V$ t; R/ K2 t- i
LEA DX,SOURCE ;数据区起始地址" J2 g# A) O7 N1 o' ?
LEA SI,NAME0 ;原始数据文件名
! x7 I$ U; n5 M: ~0 n) Q MOV CX,N ;字节数
4 @4 `4 S" D- i( {- | CALL LOAD ;从'INPUT1.DAT'中读取数据
3 t0 X6 S3 p# ?: k! h/ d( F ;****BEGIN****
9 @* z. E H7 {: v$ ~+ g' j/ ]: d LEA SI,SOURCE
' N+ K& L8 m" P- u: P5 a! B LEA DI,RESULT
+ h0 Q' z5 i; H& U! p. | CLD
8 ^$ [, a7 o7 e7 j+ } L0: LODSB+ K: v2 p% q) m H$ x' |" H
CMP AL,09 J/ a( d3 a$ F7 ?3 A$ n' h: o
JE QUIT9 K2 b6 u2 H! s
CMP AL,ESC_CODE4 o3 l% p9 Q0 x
J_______ EXPAND
" e) w# @+ r. e) K ___________________________3 E' O4 {8 u* H5 }+ e& c
JMP L0
9 F2 c- x/ I/ b g2 v6 b2 n! G& Y. P EXPAND: ___________________________ ;解压
$ ^3 i: D, C2 h1 N XOR CX,CX2 @2 V9 s) o: H6 m6 G3 B0 y
___________________________- ?+ { G$ E0 z1 z" @7 c
___________________________
& K& S G0 H! `& x ___________________________
1 W: r7 t$ @: c0 h' w ___________________________% t/ k$ X# G' _6 P8 F$ F! ]
JMP L0
7 q+ c* Z% O; D+ v QUIT: STOSB ;STORE THE '00H'
3 z. ]' q8 i; I* w( w. U( x ;****END****
8 \3 J: j# y& }/ N LEA DX,RESULT ;结果数据区首址
" u# D# Y3 t% E8 d w5 Y LEA SI,NAME1 ;结果文件名
7 Y# s, Q9 k8 F7 Q' C" Y/ c% f MOV CX,N ;字节数( i8 O- n& g4 |1 V% u9 n
CALL SAVE ;保存结果到文件: \: e z' D( ?8 q! G+ }
RET2 q9 b" F3 \+ X' F
START ENDP. x& e1 H" {/ h n# |
CODE ENDS. X7 S7 [' y8 e( C
END START |