请编制程序,其功能是:分别统计内存中字符串SEGMENT、EQU、DB、MOV、ADD、ENDS、
* s* A! L& V; f2 |0 d/ b0 _4 u* t PROC、ENDP、AL、END的个数,然后将统计的个数以字节类型依次存入指定的内存中。
2 ^( v$ E B0 d+ X. q* T 例如:
0 i- Q. {- R* L2 P( X+ D& q 内存中有 SEGMENT,EQU,DB,DB,MOV,ADD,ENDS,PROC,ENDP,AL,AL,AL,END,SUB,MUL
4 n8 v! B4 Y- A# V 结果为 01H,01H,02H,01H,01H,01H,01H,01H,03H,03H
+ p! }) Z8 g) I5 Z2 ?5 ~5 ^. b 部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。8 b, |8 y# \5 K" v* z' k
填空BEGIN和END之间已给出的源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。5 ~0 z. r$ K% f& Y+ U5 b5 [
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
0 w) X5 K2 f: t: R6 }1 b: y 试题程序:
. ^$ d, T0 `( b: l" |% A MSTR MACRO STRX,NX1,NX2
' F. K. z3 T: T: x4 C4 }0 q5 G LOCAL NEXT,AGAIN,FOUND, t1 C8 j. ]1 d, T+ Q2 t. B. K
CLD2 {9 o W8 C. j8 V. J/ t# ^" r
LEA SI,SOURCE' t9 O& ]: ^; D- J; @& B( t; x
NEXT: CMP [SI],'$$'
0 v3 h5 u! m |* [8 F JE AGAIN; \! l& i9 i: _$ |* g
MOV CX,NX1
) \& e( o% A: Q3 m. l9 [' f1 {1 D LEA DI,STRX) Z+ B$ [- E1 Y M: l5 m% O
REPE CMPSB
8 c: S, K2 m3 Y: r0 {/ M JNE NEXT, E: e% D3 O6 s( L5 E2 J& p6 \
FOUND: INC BYTE PTR NX2
/ s3 M: E9 f0 L) |* q3 `9 U$ t JMP NEXT
% y% g7 I0 q7 t1 B AGAIN: ENDM4 {, _, ^6 T$ w6 T/ s% \, H/ Y0 |1 Q
EXTRN LOAD:FAR,SAVE:FAR
9 U* G d A8 y7 s' Z N1 EQU 277
9 T# @+ m7 k5 `6 M% W0 c; t4 o+ e; E N2 EQU 10; F q9 W9 O6 m; C% Z
DSEG SEGMENT1 o- s# ]- F9 I! Q
SOURCE DB N1 DUP(?)7 K3 O$ p: s; m; a9 ~. G) Z7 \
RESULT DB N2 DUP(0)
( @, }& e* ~! ?5 Q0 v3 l! b9 W STR0 DB 'SEGMENT'* K( R0 A+ V& q3 }( o$ t
STR1 DB 'EQU'! l9 M( j/ t' s$ G0 U: O
STR2 DB 'DB'' A) I7 [ N3 H2 T5 S, B6 n
STR3 DB 'MOV'
0 l1 b1 P; w% M$ s/ x8 v, x STR4 DB 'ADD'
* L1 J4 m3 i" L# v( N1 L, i STR5 DB 'ENDS'
I' m) I& N3 u, M STR6 DB 'PROC'
2 }& n6 Z2 N7 [ C- F7 [4 K STR7 DB 'ENDP'
. J% ]- |. q4 z) ^9 b1 l STR8 DB 'AL'9 M/ l+ U( J" F# x0 N! S" q: a
STR9 DB 'END'
2 s5 K0 H/ `; N# i" S! H) m NAME0 DB 'INPUT1.DAT',0# U9 d1 O( M6 ^& @7 D1 p- n
NAME1 DB 'OUTPUT1.DAT',0
}9 N# r. W2 k( o3 Q+ U DSEG ENDS. Q; K/ C( ?5 D: N- l
SSEG SEGMENT STACK
; x3 t6 h! S2 Z1 m2 r/ a; t DB 256 DUP(?) v! `, Z/ _3 u
SSEG ENDS
0 ?2 R" D2 Q) u$ c# k6 y7 M4 v& i CSEG SEGMENT7 R' ^1 X8 y4 ?
ASSUME CS:CSEG,SS:SSEG,DS:DSEG,ES:DSEG
' ?7 S! O/ ]6 [( F* R* d, q& V START PROC FAR
p! l, U# d5 h0 P& ^9 e3 h PUSH DS
% \. A# e3 S; ]+ h. K XOR AX,AX1 b" r, B9 J" Y$ G! I
PUSH AX3 Q4 l2 x6 S/ ^1 o0 I4 c
MOV AX,DSEG
# e( R, L& P& X4 F, P. Q) E MOV DS,AX4 i, p% j5 U. h: R! k; v F
LEA DX,SOURCE ;数据区起始地址
5 `: X: i6 S N! o LEA SI,NAME0 ;原始数据文件名8 e# C( V* W! N) z' I, L
MOV CX,N1 ;字节数
/ F$ V# t$ R& F" o CALL LOAD ;从'INPUT1.DAT'中读取数据' q" B, G, ?5 W
;****BEGIN****! r+ p" I' V5 d% U* J0 W9 R0 ?
MSTR ________________ A7 [+ t) E9 s- n1 c$ z/ [! I. I& U
MSTR ________________
* g; r* S9 v/ \8 q7 t MSTR ________________, S+ J/ X6 d! D. s$ V; e; M
MSTR ________________: T! U' |% W9 |; P! _* t- y
MSTR ________________; W/ i; K# b* w+ o% Z
MSTR ________________* J& `% ~; h/ r
MSTR ________________9 w s$ i) T+ S0 A" f; ^4 G) X
MSTR ________________. Z9 J/ m: j+ w* q
MSTR ________________
5 Z3 b8 M! W) M7 I( k8 Q+ Y MSTR ________________' l8 q: f, `0 x2 v; C- \, a% X
;****END****( V2 M' f1 k O
LEA DX,RESULT ;结果数据区首址
+ B, t* X, _. K+ F LEA SI,NAME1 ;结果文件名. d/ X' _7 }+ C( Y0 y! ~. C# w
MOV CX,N2 ;结果字节数+ g m0 a8 T1 J, C
CALL SAVE ;保存结果到文件
1 T% V8 R* }& Q RET# A! y Y% _9 b s% Z/ ~# @
START ENDP
5 m; {2 F2 r4 N CSEG ENDS( o$ D. g( Q3 S( q$ ]$ |. @
END START |