请编制程序,其功能是:内存中连续存放着两个有符号字节数序列AK和BK(k=0,…,9),求序列CK,CK=AK+BK(CK以有符号字的形式按C0,…,C9的顺序连续存放)。 例如:
! d. R9 j6 E" _+ o/ C3 l" c/ U; Y 序列AK为 80H(-128D),31H(+49D),61H(+97D),7FH(+127D)…
- _9 k- l/ T- w3 S/ } 序列BK为 80H(-128D),01H(+1D),F1H(-15D),7FH(+127D)…
* G1 ?/ O7 R$ f, E, O 则结果CK为 FF00H(-256D),0032H(+50D),0052H(+82D),00FEH(+254D)…5 P5 L Q/ c7 f0 z9 E/ z
部分程序已给出, 其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中。运算结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。2 S6 X* G0 b8 {
填空BEGIN和END之间已给出的一段源程序使其完整(空白已用横线标出,每行空白一般只需一条指令, 但采用功能相当的多条指令亦可),或删除BEGIN和END之间原有的代码并自行编程来完成要求的功能。& W4 K) f8 M' J8 y7 ~0 ]: W
对程序必须进行汇编,并与IO.OBJ链接产生PROG1.EXE执行文件,最终运行程序产生结果(无结果或结果不正确者均不得分)。调试中若发现整个程序中存在错误之处, 请加以修改。
9 Z$ C' E* M& \% M {" |2 ~ 试题程序:
* y( v( i+ {& M+ M& \ EXTRN LOAD:FAR,SAVE:FAR* C/ z3 h, [! B1 C9 ]
N EQU 10 ;每个序列的长度
( K$ H5 n! T. _. _* x: y0 x STAC SEGMENT STACK
( \6 r# a: S9 P( r7 T3 V6 P DB 128 DUP(?)
8 E# Z6 I' a4 h* d, _ STAC ENDS
' J* c# k9 A1 S' ?" |7 d DATA SEGMENT
. s0 f) e; |9 A7 q* m; } SOURCE DB N*2 DUP(?) ;顺序存放A0,…,A9,B0,…,B9
: g; t$ h% h! [" ^5 Q2 U RESULT DB N DUP(0) ;顺序存放C0,…,C92 q1 Y b9 b1 y' j
NAME0 DB 'INPUT1.DAT',0: V# i6 _* n3 c+ U( k. l
NAME1 DB 'OUTPUT1.DAT',0" y/ n+ k( n' C ^
DATA ENDS
, m9 w( O5 X' N$ e M CODE SEGMENT- }1 ]* b# I* B( d8 ~! d+ |
ASSUME CS:CODE,DS:DATA,SS:STAC
) u4 G6 Z/ ^" M2 {" y9 e% j3 W START PROC FAR5 h3 \, }8 l/ b
PUSH DS
3 K h- M6 T5 f5 ~1 d2 { XOR AX,AX
5 o- G* v7 z: v- |! p PUSH AX' U) J# z% F7 d- @
MOV AX,DATA; c/ n% `+ U6 W8 N
MOV DS,AX
/ r# i: V* j" j1 q' Y5 Z8 c LEA DX,SOURCE ;数据区起始地址! p8 P4 W. i2 W" Y! W: U9 |" u6 u
LEA SI,NAME0 ;原始数据文件名
4 m, p; ]0 x- f2 ~$ q* n# L. g- k. H MOV CX,N*2 ;字节数
0 E1 q' ^6 t, X0 D CALL LOAD ;从'INPUT1.DAT'中读取数据. g/ x7 a4 p& q
;****BEGIN****
' p, r: o& k7 M9 G9 b+ C6 | MOV DI,OFFSET RESULT ;结果从RESULT开始存放1 V2 {1 Z. d3 i5 ~. j. L
MOV BX,0
) `, H& ?- j( | MOV CX,N- T. L/ G# c7 _; j r! D
PRO: MOV AH,0
- G, M" F. e5 d8 j MOV AL,_______________ ;序列Bk中的一个字节8 U9 W- B$ ?$ }( c, q# E
MOV DL,AL ;暂存Bk# S7 w0 w! {) q$ a3 ~" ^( F: ]* U
________ AL,SOURCE[BX] ;Ck=Bk+Ak
% w1 ~: u; U9 C* u; p JNO STAY ;无溢出转STAY
2 f% i7 S' ~1 E7 z3 T+ k* b- _ JUMP1: MOV AH,00 ;有溢出
+ D7 t& h7 p0 Q. I ADD DL,0* Z3 I1 N$ z6 A9 O. b
JNS JUMP ;Bk为正数(为一个正数加上一个正数,结果为
6 c) L; I, z$ m8 W ;负数的溢出情况)转JUMP(AH已为00H)% K i( a+ X# Z
MOV AH,_______________ ; Bk为负数(为一个负数加上一个负数,结果为) k# p( Y8 p: T9 x; y i9 `
;正数的溢出情况)将结果变为有符号字的形式
- @" x* f# e7 W# I) k ;(为负)" `, ^: P0 j$ x t7 T
JMP __________________' t C2 h5 ~" u+ L4 [
STAY: _________ ;AL中数的符号扩展到AH,无符号字节变成无符
% _( m* B) ~) s [ ;号字,有符号字节变成有符号字5 Q( G; V7 ]* {4 I- [/ [
JUMP1: MOV [DI],AX
2 o9 \9 l0 x! t/ m$ G ADD DI,26 [# [, Q- h" K+ P4 c) y: E2 D
INC BX
" \6 O+ _4 j' n8 q8 o6 G DEC CX( o& k2 p" c, Q( {1 w
JNZ PRO% R, G h+ w, y$ [% ^
;****END****
8 K' D+ w( N4 ? LEA DX,RESULT ;结果数据区首址
+ h$ ^" S% p% D: Q3 a4 ~( n8 F LEA SI,NAME1 ;结果文件名
3 o [) S$ d: |* Z P. Q# R MOV CX,N*2 ;字节数( t0 |. A# s# b! r
CALL SAVE ;保存结果到文件
& O) }5 [( p6 F0 Z9 ^ RET" M; P0 n& @& I3 ?& h% u& j; }
START ENDP
- w2 i5 b( N/ Z3 w CODE ENDS
" r+ G1 O' ~6 B* q END START |