请编制程序,其功能是:以SOURCE开始的内存区域存放着多个字节的数据,其中有压缩BCD码和其他数据。现按下列编码规则进行编码:在第每个压缩BCD码前面加两个字节前缀代码BEH和CCH,并在其后加两个字后缀代码DDH和EDH;如果不是压缩BCD码,则该数据前后均加两个代码0DH和0EH。编码后的数据存放到RESULT指示的内存区域。 例如:
^# Q/ z# Q+ O! R' l6 i+ C( D 内存中有 12H,D9H,86H,54H…
7 U+ H% |% z L 结果为 BEH,CCH,12H,DDH,EDH,0EH,D9H,0DH,0EH,BEH,
* \5 K0 C; h! b5 @ CCH,86H,DDH,EDH,BEH,CCH,86H,DDH,EDH…
/ Q) ^" U" `$ l5 x2 _6 f 部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。) C3 f" @7 i" G& G
填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。8 M {# @% ]- e" D& ?: b! q
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
) x: O1 C, s9 v+ I 试题程序:4 e8 K7 i; D0 c) Q3 P W3 V& Q4 _
EXTRN LOAD:FAR,SAVE:FAR
7 h9 ?" u9 v% ^ N EQU 10, Q2 N# |8 \# e! N# `: G/ H: v L, r
STAC SEGMENT STACK$ G7 [# r4 u) E
DB 128 DUP(?)
% V0 q' u- m1 F4 [& p STAC ENDS# T, X: [. k8 a9 o: e, B; N
DATA SEGMENT, N* \+ X$ ]8 r1 V0 \
SOURCE DB N DUP(?)
5 H6 i& Q/ u8 Q$ p" g7 C5 D# S/ l RESULT DB 5*N DUP(0)
! S0 z: N+ k/ A2 C* E% Z l NAME0 DB 'INPUT1.DAT',04 }5 u+ y" z+ ^5 X$ e3 Z
NAME1 DB 'OUTPUT1.DAT',0( D" L* Z; }1 c; Y$ z
DATA ENDS
- `! k& {" s; w: m CODE SEGMENT
0 Y& j% ?0 `; A6 T ASSUME CS:CODE,DS:DATA,SS:STAC ^- L' ?& I' y3 D7 t2 o
START PROC FAR
1 j9 C& Q3 z1 f. ~ PUSH DS- A& n* `/ S6 }& U+ Q
XOR AX,AX) i: R$ e, G! r3 c; ~3 O
PUSH AX/ T2 L3 g1 {7 _ ~, l
MOV AX,DATA/ F# B8 P* u6 ~- a
MOV DS,AX z& g ?8 H' t7 J) p2 c
MOV ES,AX ;置附加段寄存器
' b- a6 \ I: ^+ u5 V' | LEA DX,SOURCE ;数据区起始地址
% K8 x" t0 ]) K/ }# m1 G LEA SI,NAME0 ;原始数据文件名, c" E( \! s3 t6 q! T$ W! w+ i
MOV CX,N ;字节数
1 D5 S) l& N0 L: y* c CALL LOAD ;从'INPUT1.DAT'中读取数据
' g7 a, p5 m. B- c8 o ;****BEGIN****' G$ \# p4 ?5 T7 T& P: p$ \. j
LEA SI,SOURCE" e0 g; r( g9 E% {
MOV DI,OFFSET PDATA ;PDATA为正数数组存放缓冲区首址
) }# v/ g0 _9 {$ J0 b& H* S MOV CX,N
$ x8 \) M l# w6 z CLP1: MOV AL,[SI]8 j. n1 r) n6 i& I
MOV BL,AL# _0 G: Y s! [& F
MOV AH,AL& R6 f1 h" d1 L/ U
________________________
/ x5 d7 B% h; T3 {( b0 p- @7 j$ ^ AND AL,0F0H f' {* G+ @8 C! |$ r
_________________________
9 O- @$ a$ o j6 Z MOV CL,4
2 Z5 j6 O. Z$ U1 I: r3 m1 {4 \ _________________________
7 r6 i6 b: F9 |+ w1 n' U) F POP CX
8 {1 K: z$ V6 s+ x CMP ________________1 K( }0 v/ i) x5 E
JA CLP2: B ?7 b5 Q" s/ {
CMP AH,9
, Y5 ?( B3 N( s& o& m% C JA CLP2
* K1 n+ a& r# M1 L8 @ MOV ________________" e% o* o0 y. v
INC DI
2 \# O* A, \7 C6 r& H MOV BYTE PTR[DI],0CCH& F1 h" A1 h# g3 V# h
INC DI
+ A2 [6 z# y1 l' j' T0 s4 s MOV BYTE PTR[DI],BL( M8 P) [. M; n% \9 A' ^( ~
INC DI
8 V* s$ d& ^% F. Q# ]& a: P6 c MOV BYTE PTR[DI],0DDH" u! J/ o& G) ^9 t9 y0 N/ ~$ c: @
INC DI
$ {9 f6 A8 I& p- x8 M MOV BYTE PTR[DI],0EDH
' V- Y/ s6 W$ L. G* o: f8 Z JMP CLP3
& t5 F% j9 t5 O$ T4 @ CLP2: MOV BYTE PTR[DI],0DH
# m0 E% @! [6 E t* i% q INC DI4 s- g2 Z0 f. K2 Y" Y& v
MOV BYTE PTR[DI],0EH
# l$ K8 W3 \' j6 B1 Z' Y INC DI a1 n0 I4 u# R
MOV BYTE PTR[DI],BL# [- B. U- i8 M1 H
INC DI2 c; o2 [( F- _# W1 p k
MOV BYTE PTR[DI],0DH
* |3 T! f+ G1 ^ INC DI
$ J% B# Y' G" P MOV BYTE PTR[DI],0EH2 T! A- |& g. Y" c9 N" {
CLP3: INC SI
8 T) g% `( S2 y3 x; j; W INC DI
4 A/ h* ?! p$ j _________________________
/ z" G3 O4 F6 f( l5 ?8 q0 ]: a ;****END****
, F6 C6 Y: @1 ~6 H& e: P LEA DX,RESULT ;结果数据区首址8 f/ ]5 I* p5 B9 e4 G7 V2 Y% m$ K
LEA SI,NAME1 ;结果文件名* i& J8 s5 ]* W) M, `
MOV CX,N+2 ;字节数6 ?. r, C/ ?4 f' _+ ?; O4 m
CALL SAVE ;保存结果到文件
, v8 x* q9 K! ^. r. A4 t6 | RET- T1 X, q8 Y* w+ R' R3 N$ m9 g
START ENDP
8 A9 K9 q" N" j! S+ I4 ] CODE ENDS
! X; _2 \$ B. E; l5 `" @1 r END START |