请编制程序,其功能是:将内存中由SOURCE指示的40个字节有符号数组成的数组分成正数和负数两个数组,并求这两个数组的数据个数,结果存放在RESULT指示的内存区域,存放形式为正数个数在前,其后跟正数数组元素,然后是负数个数及负数数组元素。 例如:
3 p( y# l/ ~6 [$ p) l! f% T8 D 内存中有 1EH,91H,74H,91H,42H,30H,81H,F3H,18H,25H
5 w0 Y/ I( b/ y" k8 N8 Z 结果为 06H,1EH,74H,42H,30H,18H,25H,04H,91H,91H,81H,F3H% L' p8 d: u( q& X }3 o
部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
% F: o& k! ^- z+ P7 C& y 填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。
( B+ w& \1 ]4 Q5 U* o" v( y 对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
: I% ~4 v& U- @$ Q- t0 K 试题程序:+ }. i" O4 @9 \5 D" w
EXTRN LOAD:FAR,SAVE:FAR
& S7 z& M2 ^3 [" P( {6 {% o N EQU 40; ]0 m5 G2 n# j) }9 K7 V$ }
STAC SEGMENT STACK
) n2 I, X$ X: [3 I DB 128 DUP(?)
( `7 j8 i% U- x' O& u5 m4 j STAC ENDS
Z4 [9 c! @1 F0 o DATA SEGMENT& q3 X' L( M4 e+ {! u" {
SOURCE DB N DUP(0)
* _0 z$ d- c8 y RESULT DB N+2 DUP(0)% Q$ s$ I/ d8 v: W
NAME0 DB 'INPUT1.DAT',0
0 R8 H6 Q+ K- d# c( A& } NAME1 DB 'OUTPUT1.DAT',0) b8 i0 u. d2 ]2 A5 k5 J; W
NDATA DB N DUP(0)
6 o: e- `0 y- E" y7 S PDATA DB N DUP(0)
) Z: u/ p* s) ^3 ]. y7 E DATA ENDS& }4 P, L2 e3 v: d' i6 v4 v& O
CODE SEGMENT
) W" ~2 S7 ~( ]0 \# S6 ` ASSUME CS:CODE,DS:DATA,SS:STAC
2 N5 f5 v) M8 `- d! G: t6 X START PROC FAR, H7 B6 Q8 B$ l6 D( ~: w
PUSH DS4 `- L m* N0 y9 a0 s: D# s; p8 U
XOR AX,AX
5 }: D0 {8 j1 }+ M PUSH AX2 g. G$ c% {9 ^+ h! l
MOV AX,DATA* x/ Y2 R. n3 Y* C0 t; `
MOV DS,AX
* F7 F* i. \) h, U MOV ES,AX ;置附加段寄存器
. e+ c9 f7 v) i0 a" ?2 e5 A6 I LEA DX,SOURCE ;数据区起始地址5 b. N9 M0 H" W/ ?6 a, q; _; L
LEA SI,NAME0 ;原始数据文件名
4 P+ a, @+ ^; D# m7 f: R1 j9 r' H# V MOV CX,N ;字节数
$ Y/ ^& h$ ]! F l4 q6 l" F' c CALL LOAD ;从'INPUT1.DAT'中读取数据. [# A: N b, j3 `
;****BEGIN****: ~$ W k4 `4 e' z0 a3 s8 @
LEA SI,SOURCE j3 s) h6 x! K- _
MOV DI,OFFSET PDATA ;PDATA为正数数组存放缓冲区首址
% G) O- N& {/ i' i( t# V MOV BX,OFFSET NDATA ;NDATA为负数数组存放缓冲区首址
$ l, G. ]' ~$ V9 F" j4 }: Q/ ~ XOR DX,DX4 j! @; ?& C# _& R+ u7 t
MOV CX,N5 h! e( D& f v
CLD) c4 J9 o1 h% L0 r5 M
MAIN1: LODSB: q' g) C6 B9 R( d
TEST AL,_______________
* c( N2 f# G, H# D( A! I0 v+ v JZ MAIN2# b) x4 A1 G9 K1 d! f
INC DH ;-) N" e# L7 E3 H2 Y6 ?2 _
MOV [BX],AL+ G4 j% p0 b1 e2 q, F
INC BX
E0 @( h( L$ @! R8 H8 y* N/ x _______________! [5 `' k! W% |
MAIN2: INC DL8 e6 R* g- k% [8 c+ B& i
MOV [DI],AL ;+
- d4 M2 c; p' U$ ? INC DI4 `3 z6 _, c( R1 U( \4 D
MAIN3: _______ MAIN1
/ x; t1 f# }, e- w# S LEA SI,PDATA
" k5 M, @7 G7 Z, @; } LEA DI,RESULT
; b4 m( i* e3 Z8 |+ H& P; N) ] MOV [DI],DL+ `& P) g0 B+ x& ?& _" ?, ~9 h: X
INC DI$ T+ o$ t2 J5 J; l# ]
XOR CX,CX
5 h" l' o4 f ]6 g/ }( F MOV CL,DL) P6 T0 ?; T, |7 q2 {' L
MAIN4: MOV AL,_______________6 |1 g1 I, N w2 ~+ u% K
MOV [DI],AL( T0 o4 ]8 U$ F2 m
INC DI. t5 h% ^. {) U
INC SI8 @; F9 V3 Y3 p* U& r6 D
LOOP _______________1 Y) {) U% [6 Z6 U
MOV [DI],DH9 M4 s9 l' Q, l9 j9 q' g. n
INC DI ?% {6 m# l/ w* X& ^& _
XOR CX,CX
s! {; c- I2 W5 S) G( c MOV CL,DH
% d# x6 A. y) B$ ? MOV BX,OFFSET NDATA+ i& D h' Q1 z# p. x# p4 r1 I
MAIN5: MOV AL,[BX]0 @! h& ^4 n( j, e
MOV [DI],AL. g' K2 `+ r6 P, p- f
INC DI
Z/ T/ R1 o! h" T0 L6 y3 S' j( W _______________
) U/ f* K( h' }9 Z4 n LOOP MAIN5- |+ D, x$ u) x; j7 H
;****END****, V- C- I' `- T; `9 z
LEA DX,RESULT ;结果数据区首址6 B8 E; ?$ J. _: R
LEA SI,NAME1 ;结果文件名" q& V4 o' X, ~( s0 C2 w
MOV CX,N+2 ;字节数
* f2 n2 X6 ^$ B$ { j$ a6 F CALL SAVE ;保存结果到文件
/ B2 j7 J$ ?% U3 _3 G RET' N0 }4 o/ E3 y. O( O7 ^
START ENDP
7 h- {" Y: P; i* @4 v, P' _ CODE ENDS. W8 T7 t# Z& W: H$ \. P# O, q2 U
END START |