请编制程序,其功能是:内存中共有30个字节型数据,找出其中的两个ASCII字符串并进行校验。欲寻找ASCII字符串由13个字符组成:#(23H),7个ASCII字符,*(2AH),2个ASCII字符,回车符(0DH),换行符(0AH)。
9 C [" C) s7 X5 i& C 校验方法为:对字符#及字符*之间的7个ASCII字符进行异或操作,若异或操作结果的ASCCII字符表示(异或操作结果高4位的ASCII字符表示在前,低4位的ASCII字符表示在后)与原字符串中字符*之后的两个ASCII字符相同,则将原字符串原样保存;反之,则将原字符串中的所有字符(共13个)均用字符!(21H)代替。* ?" {. @% Z3 c. v7 x
例如:7 P1 D2 ~' X D; @, k5 b( F' R
内存中有 33H,35H,23H('#',第一个字符串开始),46H,41H,30H,2EH,34H,3DH,31H,2AH('*'),32H,31H,0DH,0AH,46H,23H('#',第二个字符串开始),46H,41H,30H,2EH,34H,3DH,30H,2AH('*'),32H,31H,0DH,0AH,55H
4 K( n# X8 X; u( u y# L 结果为 23H,46H,41H,30H,2EH,34H,3DH,31H,2AH('*'),32H,31H(校验正确,该字符串原样保持),0DH,0AH,21H,21H,21H,21H,21H,21H,21H,21H,21H,21H,21H,21H,21H(校验错,整个字符串用字符'!'代替)。* a5 R: X% t* Q- s
部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
, l# X$ [( n# g 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
: U# Y1 o" t( S9 i1 {- [- w 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。1 M! b6 F$ d1 I0 f
试题程序:* x+ [6 D2 B& K- K# w5 H
EXTRN LOAD:FAR,SAVE:FAR+ H5 l9 {+ g& D
N EQU 26. ]! |; K8 Q# H$ P9 e3 m
STAC SEGMENT STACK0 e; M/ e4 ~6 \) u' K
DB 128 DUP(?)
1 S f$ ^7 k/ ~ STAC ENDS6 E7 U3 f7 E4 G; [
DATA SEGMENT
2 Z2 y; T3 x) M- K! S SOURCE DB N+4 DUP(?)
% V8 F' a* A! S2 c RESULT DB N DUP(0)
/ c/ W# x* J# h3 m& F& a HH DB 2 DUP(0)
6 V, W- t5 z3 I! Q! N& d NAME0 DB 'INPUT1.DAT',0) L/ S4 u8 o' J" Z7 ]3 n2 q
NAME1 DB 'OUTPUT1.DAT',0
: M' Y+ Y# G) ?; R4 `3 }8 a DATA ENDS
7 x/ g. {' ~' P) V! q CODE SEGMENT0 u- Q# i) ~( M6 `" v+ C
ASSUME CS:CODE,DS:DATA,SS:STAC
I9 r+ h# L' w% ~: M9 h START PROC FAR
- P! w4 k. |$ i! d4 l9 b PUSH DS
" ]6 K9 g8 t) c0 E3 m XOR AX,AX
5 A% `2 y# n9 j! u& p5 P. d PUSH AX4 ]$ F, c# a0 W: f% r( I
MOV AX,DATA# |* w* i* o; [, t* F
MOV DS,AX
9 Z" A& y# }2 z3 p8 } LEA DX,SOURCE ;数据区起始地址
- o) O2 m: x. F6 |# s- n- k LEA SI,NAME0 ;原始数据文件名3 {5 S* T; [4 _3 B: [& w6 |
MOV CX,N+4 ;字节数
3 }7 w! M: s5 ]) l( C7 o" ~ CALL LOAD ;从'INPUT1.DAT'中读取数据! }/ x9 r& J \+ E9 l
;****BEGIN****! h! \) K$ \2 H' e4 ?: B8 G7 i4 L1 e
MOV SI,07 d6 Y# q- M, }: X; `- V% @
MOV DI,0- u p& t1 B- q
MOV BX,2 ;两个ASCII字符串
) E. x L1 y9 i+ H REPEAT: MOV AH,0
3 [- S6 U! `' c6 y6 c/ Q SEARCH: MOV AL,SOURCE[SI]9 W) i! [% b- A
INC SI: V4 G% A8 s5 N5 w( Y6 q% E
CMP AL,'#'2 W: p9 Y ~7 }! G3 O
________ SEARCH$ X, J3 Y; j3 ~% H+ K/ z0 p+ |
MOV RESULT[DI],AL9 J6 ?% ~7 K0 V Y* z' ~/ v
INC DI
# Z( X, O0 z6 N1 F2 x5 l SEARCH1:MOV AL,SOURCE[SI]6 G& G2 f- F, E- c
INC SI: d6 V' M2 {/ m! ]4 O
CMP AL,____________
' z, s* P0 H1 F4 S JE ASCII9 D: N2 I7 u/ X1 {+ C
MOV RESULT[DI],AL- M6 O$ y# Q! I5 C
INC DI+ Q, n% j1 T2 l
XOR AH,AL
7 ?" f: a% n, Y4 f JMP _______________ _1 u4 f {: k+ u$ s. o
ASCII: MOV RESULT[DI],AL
1 ]' ~# w+ D3 a' j8 W8 l INC DI
" [- _& y1 q; r% Q$ m" e PUSH DI
/ f. {8 t: V! ^# R MOV DI,0. W1 T! h; f2 q" N
MOV DH,2
0 e$ u7 @( Q4 a1 U; Z' ` MOV DL,AH ;异或结果暂存在DL中+ |/ y# t4 t* ^' l+ W
MOV CL,4 ;先将异或结果高4位转换成ASCII字符
5 |1 K7 z- y7 B9 b5 Q SHR AH,CL ;本行开始的4行语句将一个十六进制数转换为ASCII码
' d# o, `2 t1 Z& {! [2 i CHANGE: CMP AH,10' C9 ], q0 B1 S b3 C
JL ADD_0
3 ]. |$ Q1 Z* y; E2 w0 t1 M ADD AH,'A'-'0'-102 I4 g. ^7 }" {
ADD_0: ADD AH,'0'
, r$ k" T( Q \ MOV HH[DI],AH
' Y- ~, e, x/ F INC DI
2 s {. F8 P8 v DEC DH! m3 L: @4 z/ S0 e3 n
JZ EXT, B2 l6 p. m$ O! I' A' B! Q
MOV AH,DL ;再将异或结果低4位转换成ASCII字符* C6 O K5 ^1 b' k
AND AH,0FH
, L; n, W# b. j2 D- x7 m/ b; x+ p JMP CHANGE7 d* b; F, ~8 l2 K
EXT: POP DI! W3 m; E2 w$ P p
MOV AL,SOURCE[SI]! m$ t2 v" J2 X+ m1 s
MOV RESULT[DI],AL
5 j. ~0 {; b$ e T: W INC SI
$ x6 y" v0 x. Q5 m INC DI
- E- L, O+ x% _" M MOV AH,SOURCE[SI]3 ], W% ^7 p+ n8 }
MOV RESULT[DI],AH
8 z# Y# V1 z8 @3 x- I INC SI# g$ j( Y7 O# b6 [
INC DI
$ K5 E4 f0 E6 J MOV DL,HH
1 c2 }: F- K a- L MOV DH,HH+1) G* _- l4 N8 ^* I
CMP AX,DX
6 |( F" X, z$ [ ________ ERR
* M, k+ f5 B9 n5 L' u/ V: ] MOV AL,0DH ;校验正确
8 Q+ l7 I# W9 x6 f- l MOV RESULT[DI],AL E' L f m9 {9 T( f* W" h$ N
INC DI$ O# ~' {1 M3 a8 ]( f; F6 [
MOV AL,0AH
: ^7 i& z6 q/ d: M6 U3 b MOV RESULT[DI],AL
2 O0 T( j, A6 [$ X6 x. t- X t INC DI) p# \& z0 \ F: i
JMP LP9 H" X0 |) T$ z' h
ERR: SUB DI,11 ;校验错误
1 P: W/ h; Y- ^. j7 o8 L MOV AL,'!'8 z( m9 S0 Z% P( s" R# ^1 ]5 ?
MOV CX,____________
! i, P. |; p: q1 a' p# H COVER: MOV RESULT[DI],AL' w3 y) u* N) ]. K
INC DI# d% ~8 j8 u# K$ N ?
LOOP COVER! \) A7 J) p% r8 e$ p& ?2 c% w0 }
LP: ________________________+ L# t, Q! J( L
JZ EXIT
/ _6 ^) D0 f( \0 p9 \6 [0 M9 g JMP REPEAT+ S' l! J, B: C" M' B. ]9 W* @
EXIT: NOP3 Q3 u" C3 F7 n$ T) _' y0 E+ z
;****END****
0 o+ ~& x7 c9 ` LEA DX,RESULT ;结果数据区首址" {4 G7 @) f; d z6 z1 W
LEA SI,NAME1 ;结果文件名
: {8 Q* D; I& G* X5 J MOV CX,N ;字节数
* y" K; O$ e4 z$ L: o CALL SAVE ;保存结果到文件8 z3 R+ k! T8 P' e/ q
RET
( v% Y* x) A3 h START ENDP
5 d8 P/ b: ?* g% p) @+ `1 X9 E6 P K CODE ENDS
9 u' g+ @( y1 X1 ^9 a END START |