请编制程序,其功能是:内存中共有30个字节型数据,找出其中的两个ASCII字符串并进行校验。欲寻找ASCII字符串由13个字符组成:#(23H),7个ASCII字符,*(2AH),2个ASCII字符,回车符(0DH),换行符(0AH)。! ^ Q! a6 i' P5 {' m- `- A2 F
校验方法为:对字符#及字符*之间的7个ASCII字符进行异或操作,若异或操作结果的ASCCII字符表示(异或操作结果高4位的ASCII字符表示在前,低4位的ASCII字符表示在后)与原字符串中字符*之后的两个ASCII字符相同,则将原字符串原样保存;反之,则将原字符串中的所有字符(共13个)均用字符!(21H)代替。
* u: k; ^7 n J. x8 {9 @+ |! ~ 例如: ]& q+ N8 h U) w7 L1 ^
内存中有 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$ n. [) x; {2 v* l6 b; i. x6 D
结果为 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(校验错,整个字符串用字符'!'代替)。; t6 a# A5 c. q
部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。/ p6 p9 U9 r, S% k
填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。" `! B( h1 f" o0 {. V V" D
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
( P7 L) Z* c4 z4 v* g8 z9 `8 r 试题程序:; d% ~" k4 a1 D* Q5 v! v
EXTRN LOAD:FAR,SAVE:FAR/ V) i/ q/ ^; c. I- D* X/ ]
N EQU 26
" P" C( D: n1 ^+ f7 V1 e STAC SEGMENT STACK
: A Z' K6 L2 R* i) _6 E! [; r DB 128 DUP(?)
* o' ~4 Z: E i1 ?3 [& P* s STAC ENDS. S+ S X( W+ U& ?1 U
DATA SEGMENT
- v! `% K" n+ Y: J. t SOURCE DB N+4 DUP(?), {# a/ `% y* J1 ]6 f) @; A
RESULT DB N DUP(0)
! o, H8 {$ d( O/ w% ]' E HH DB 2 DUP(0), r# t' }( U. x- }( j
NAME0 DB 'INPUT1.DAT',0
5 ?+ ?( q3 n+ K NAME1 DB 'OUTPUT1.DAT',0. l; l3 S$ N: f6 A( \# S" ~
DATA ENDS% B9 R2 l: H! K0 I! i
CODE SEGMENT* I2 c! T- F! c# k& X
ASSUME CS:CODE,DS:DATA,SS:STAC5 M9 u0 u7 b% w
START PROC FAR
: _; ]# m" {( v3 ?# I8 F PUSH DS
# l7 w b3 w M# w' ?4 A8 u XOR AX,AX
0 I' [7 g3 {, ^" P! b/ c PUSH AX) B a& i: m& B( k2 Z* s
MOV AX,DATA
' y( u- a9 p b5 O8 @ MOV DS,AX
/ `0 \/ m, l3 P" X& {( x, E LEA DX,SOURCE ;数据区起始地址
$ [5 o/ k d) E6 Q( ] LEA SI,NAME0 ;原始数据文件名( X* m% g' Q. X7 E8 v, f
MOV CX,N+4 ;字节数
) W) t4 V% h1 \$ E CALL LOAD ;从'INPUT1.DAT'中读取数据3 M0 B" m/ F. `
;****BEGIN****8 o f) Z5 \& s- m
MOV SI,0
; F* z% n4 z+ T; U$ v1 n$ ?2 |3 c( j MOV DI,0% O! n/ x. |. h
MOV BX,2 ;两个ASCII字符串
% c& M+ v( H$ r REPEAT: MOV AH,04 k8 ^. y& [4 n. {2 ]! `
SEARCH: MOV AL,SOURCE[SI]
: u( r! X* Q% H G6 ]$ x INC SI5 W7 O; \8 j8 R' r
CMP AL,'#', _0 }9 I& l6 b K9 G9 C
________ SEARCH0 Z, y' r' K; R. c
MOV RESULT[DI],AL- o/ H# `$ b4 E. ^. X5 R" _' u# o
INC DI: j, n, _; V, K3 b) i5 s
SEARCH1:MOV AL,SOURCE[SI]
% e' Y" N7 K0 }. q* c6 j( b INC SI
; D' I N5 e: F. g; L/ a/ j CMP AL,____________
: O x4 c+ g, I JE ASCII( h9 h: s1 ]" e
MOV RESULT[DI],AL4 h5 {+ v- f& l2 `3 ^- i
INC DI8 ^1 ?0 t4 ^, `+ v7 H$ G6 f4 F/ d
XOR AH,AL
* t% _8 s9 ~ e4 u, _ JMP _______________2 v i; @% S, C/ ?) |
ASCII: MOV RESULT[DI],AL2 h6 |0 {; ]5 l3 q8 Y
INC DI Z! G# J( j5 F
PUSH DI
7 _# Y* o- P7 N, @8 h. j! D MOV DI,0
/ B. X$ I% S) ~2 o% h4 r MOV DH,2
% @; L8 G% k: D) Q MOV DL,AH ;异或结果暂存在DL中
! p' e, r! x5 E% t( ~; t3 }# t MOV CL,4 ;先将异或结果高4位转换成ASCII字符9 Y' {$ s4 ]0 z
SHR AH,CL ;本行开始的4行语句将一个十六进制数转换为ASCII码
9 V4 S7 g/ v+ I4 j) u, Z( d& o: M CHANGE: CMP AH,109 B6 C7 K; q+ _2 p r9 s
JL ADD_08 h& F6 U- K/ V
ADD AH,'A'-'0'-104 w3 [: x: y2 k$ P
ADD_0: ADD AH,'0'( n+ L8 y4 o3 J6 T2 q% v' ]
MOV HH[DI],AH3 w1 ?8 Z$ c2 v% H0 [" g* z9 k
INC DI
% B$ e( M5 @# K, B. l0 e DEC DH
7 S; |5 w/ S' \* F! F JZ EXT: Y& ~# D! R$ T, J! M2 k
MOV AH,DL ;再将异或结果低4位转换成ASCII字符
& m6 |6 |% |0 f6 J+ b$ n AND AH,0FH
% S1 |& w& c* d- j* f: H5 T* t9 d- E: w JMP CHANGE
# Z5 O' L" Z' ?) S2 V: p EXT: POP DI P8 M8 ^( l5 D$ f" X1 E
MOV AL,SOURCE[SI]. t% h8 o* Z2 |& r3 f. g: A
MOV RESULT[DI],AL" K6 Q6 D' H# K% u; r" L9 t
INC SI
! j( D9 N4 R* Y! d. Q INC DI5 \2 k- @9 k* h0 s. p
MOV AH,SOURCE[SI]
7 y1 g9 o/ l8 B! w6 f/ h0 s MOV RESULT[DI],AH2 i6 q) Y b9 ?8 }
INC SI
6 G$ O/ e8 x8 l& U INC DI
7 b3 X3 h7 g- s7 w0 O: O MOV DL,HH
# b$ D$ q8 D. {3 @3 D' R- K: q MOV DH,HH+14 B/ F& y. A G( J6 V
CMP AX,DX
' z- s- C/ t0 q0 y& J ________ ERR2 |7 h7 S- S, b2 v" t
MOV AL,0DH ;校验正确$ _: k8 Z" }2 @8 L* U, m' M
MOV RESULT[DI],AL _2 B/ P- j- Q0 p; B
INC DI) z3 v0 V; [/ a
MOV AL,0AH: P/ { \3 _1 i0 g: {* S9 W
MOV RESULT[DI],AL/ j1 j, R( s+ R6 i: u- G
INC DI
; x9 V2 K1 L+ ]+ J5 l JMP LP6 s- R0 ?7 S7 ~& |8 `! ?' w
ERR: SUB DI,11 ;校验错误; F& Q# R' _3 i, f
MOV AL,'!'
- h7 [- J( Y! J% [9 | MOV CX,____________
; C! `$ j) c/ U, r- K* X COVER: MOV RESULT[DI],AL
' o! w+ a$ Q! ^ S0 Q INC DI* C4 q" d7 ~9 v9 k4 F# Y" ^
LOOP COVER
5 T4 |$ f' L3 P) p1 C LP: ________________________
7 Q( ]5 o- I: L& I6 ` JZ EXIT
6 O- p% S0 R X. j3 V JMP REPEAT1 n& N) Q5 z! X4 |6 ^, ]3 ?' X" ]
EXIT: NOP
. }+ S) u4 W* q+ q! @- l ;****END****
9 w' |9 d% B3 M7 Y8 p% R LEA DX,RESULT ;结果数据区首址
% {0 U% [/ c% ?/ ?. S1 k LEA SI,NAME1 ;结果文件名2 I# _7 D$ C, T' l% |4 T* M/ b
MOV CX,N ;字节数
, B2 _# o# V7 v5 E7 O' x CALL SAVE ;保存结果到文件
' Q+ B) \0 S/ G RET
9 Y6 c S% h. Y" H, W/ f, j2 r; f START ENDP% @7 Y6 [5 K `! m$ A' s" w
CODE ENDS+ R4 f0 k; d& z+ P4 [
END START |