END START
调试程序:
STACK SEGMENT STACK
DB 100 DUP(?)STACK ENDS
DATA SEGMENT
ARRAY DB 65H,76H,78H,54H,90H,85H,68H NEW DB 7 DUP(?) SUM DB 00H,00H AVG DB 0DATA ENDS
BUF1 DW 100 DUP (?) CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKSTART: PUSH DS
MOV AX,DATA
MOV DS,AX MOV CX, 7 MOV SI, 0
MOV SUM, 0 MOV AH, 0
LP1: MOV AL, ARRAY[SI] ADD AL, 05H DAA
MOV NEW[SI], AL ADD AL , SUM DAA
MOV SUM,AL ADC AH, 0 INC SI
MOV SUM+1, AH LOOP LP1
MOV AL, SUM MOV BL,07H DIV BL HLT
MOV AH,SUM+1
MOV AVG, ALCODE ENDS
END START
13. 设CS=1200H, IP=0100H, SS=5000H, SP=0400H, DS=2000H, SI=3000H, BX=0300H, (20300H)=4800H,
9
(20302H)=00FFH, TABLE=0500H, PROG_N标号的地址为1200:0278 H,PROG_F标号的地址为3400:0ABCH。说明下列每条指令执行完后,程序分别转移到何处执行?JMP指令
(1)JMP PROG_N(2)JMP BX
段内直接近转移,目的地址为1200H:0278H(或12278H)
段内寄存器间接转移,目的地址为1200H:0300H(或12300H) (3)JMP [BX]
物理地址=DS×10H+BX=2000H×10H+0300H=20300H (20300H)=4800H→IP(4)JMP FAR PROG_F
段内存储器间接转移,目的地址为1200H:4800H(或16800H)
段间直接转移,目的地址为3400H:0ABCH(或34ABCH)(5)JMP DWORD PTR[BX]
物理地址=DS×10H+BX=2000H×10H+0300H=20300H (20300H)=4800H→IP, (20302H)=00FFH→CS
JMP改为CALL后,目的地址与JMP相同。 (1)CALL PROG_N
段间存储器间接转移,目的地址为00FFH:4800H(或057F0H)
段内直接调用,3字节指令,目的地址为1200H:0278H(或12278H),0103H入栈,SP=03FEH
(2)CALL BX
段内寄存器间接调用,2字节指令,目的地址为1200H:0300H(或12300H) ,0102H入栈,SP=03FEH
(3)CALL [BX]
段内存储器间接调用,2字节指令,目的地址为1200H:4800H(或16800H),0102H入栈,SP=03FEH
(4)CALL FAR PROG_F SP=03FCH
段间直接调用,5字节指令,目的地址为3400H:0ABCH(或34ABCH),1200H和0105H分别入栈,
(5)CALL DWORD PTR[BX] SP=03FCH
部分调试程序:
段间间接调用,2字节指令,目的地址为00FFH:4800H(或057F0H),1200H和0102H分别入栈,
STACK SEGMENT STACK
DB 100 DUP(?)STACK ENDS
DATA SEGMENT BUF DW 12 ORG 300H
BUF1 DW 100 DUP (?)
DB 00H,48H,0FFH,00H
10
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACKSTART: PUSH DS
MOV AX,DATA
MOV DS,AX MOV BX,0300H CALL PROG_N CALL BX ORG 0278
CALL [BX] PROG_N:RET ORG 0300H RET RET HLT
ORG 4800H
CODE ENDS
END START
14. 如在下列程序段的括号中分别填入以下指令:(1)LOOP NEXT
(2) LOOPE NEXT
(3) LOOPNE NEXT
试说明在这三种情况下,程序段执行完后,AX, BX, CX, DX寄存器的内容分别是什么
START: MOV AX, 01H
MOV BX, 02H
MOV DX, 03H MOV CX, 04HNEXT: INC AX
ADD BX, AX~ SHR DX, 1 ( ) 解:
DX
LOOP过程: AX BX CX
初始值
01H
循环1次 02H 循环3次 04H 循环4次 05H 结果:
04H 0BH 10H
02H 04H
03H 01H 01H 00H
DX
03 H
循环2次 03H 07H 02H 00H
00H
00H
AX BX CX (1)
05H
10H
00H
00H
11
(2) (3)
02H 03H
04H 07H
03H 02H
01H00H
执行一次,ZF=0,退出循环。执行两次,ZF=1,退出循环。
20. 设8086CPU的时钟频率为5MHz,请编写延时5ms的子程序。解:微机的主频率为5MHz
则:时钟周期=主频率的倒数=1/(5×10-6)=0.2μs
延时5ms需要的时钟周期数= 5ms/ 0.2μs=25000延时子程序如下:
DELAY5:MOV CX,N 4
DLY1:NOP 3 ×N RET 16
LOOP DLY1 17 ×(N-1)+ 5
应该有25000=4+ 3 ×N+ 17 ×(N-1)+ 5+16,才能实现要求的延时。则:
N=1250=04E2H延时子程为:
DELAY5:MOV CX,04E2H DLY1:NOP RET
LOOP DLY1
第4章作业
P153
5. 阅读下列程序,说明每条指令执行后的结果是什么?
X1 DB 65H, 78HX3 DD ?
X2 DW 06FFH, 5200HGO: MOV AL, TYPE X1 MOV BL, TYPE X2 MOV CL, TYPE X3 MOV BH, SIZE X2解:
MOV AH, TYPE GO
MOV CH, LENGTH X3
(1)前三条语句的功能是设置数据于数据段中,从数据段偏移地址0000H开始存放。
变量 X1 X2
偏移地址 0000H 0001H 0002H 0003H
数据 65H 78H FFH 06H 12
相关推荐: