- 实验目的和要求
- 继续学习使用DEBUG程序的各种命令。
- 利用DEBUG学习了解计算机取指令、执行指令的工作过程。
掌握8086/8088基本指令的使用方法和功能。
- 实验环境
DOSBox 0.74
- 实验内容与过程
1. 按照下列给定步骤完成求累加和程序:
程序:
MOV BX,1000
MOV CX,10
MOV AL,0
LOP: ADD AL,[BX]
INC BX
J: LOOP LOP
INT3
步骤:
1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LOP和J的实际地址,在键入LOOP指令时LOP用实际地址值代替。
2)用命令N AA将此程序命名为文件AA(文件名可任取)。
3)用R命令将BX:CX改为程序长度值(即最后一条指令后面的地址减去开始地址) ,用R命令把BX设为:0000H,CX 设为文件长度。
4)用命令W 100将此程序存到AA命名的磁盘文件中。
5)用命令Q退出DEBUG。
6)用命令DEBUG AA再次调入DEBUG和文件AA,可用U命令检查调入程序。
若调入DEBUG时忘了加AA文件名,可用N命令和L命令将文件调入。
7)用E命令在内存地址1000H处键入16个数字
8)用命令G=100 J(J用实际地址代替),使程序运行并停在断点J上,检查
AX,BX的值是否符合你的预计值。
符合预期值
9)用T命令运行一步,观察程序方向(IP值)和CX值是否与你的估计一样, 若不一样,检查程序是否有错。
没有错
10)重复G J与T,再检查AX是否正确。 (J为断点地址)
正确
11)用G命令使程序运行到结束,检查AX值是否正确。
正确
2.用命令A汇编下列指令,判断指令正误并说明原因。
- LEA DI,[AX]
错误, 因为能够作为偏移地址的寄存器只有BX,BP,SI,DI没有AX。
LEA DI,[BX]
- MOV DS,2010
错误,不能将立即数直接送入段寄存器。
Mov ax,2010
Mov ds,ax
- PUSH AL
错误,应是16位的寄存器
Push ax
- OUT 900,AL
错误,外设端口地址超过255时,应该用DX
MOV DX,900
OUT DX,AL
- MOV [BX],0
错误,不能将立即数直接送入内存 X 正确为:没有指明字操作还是字节操作改为: mov word ptr[bx],0
3.利用T,P,G命令,执行下列指令段,注意它们的不同之处。
MOV DI,300
MOV SI,400
MOV CX,3
CLD
REP MOVSB
INT 3
P:可以看到其直接结束,没有多次循环进入。
G:若没有设置断点直接运行程序结束
MOV AH,2
MOV DL,41
INT 21
INT 3
P:没有进入21号中断
G:可以看到直接执行完毕
总结:T命令一步一步全部执行
P命令不会进入子程序,适合主程序的调试。
G命令适合查看一段命令的执行结果是否有误。
4.程序:
MOV DI,1000
MOV CX,8
MOV SI,2000
CLC
LOP: MOV AL,[SI]
ADC [DI],AL
INC SI
INC DI
LOOP LOP
INT 20
步骤:
1)用A命令键入此程序
2)用E命令在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
3)用G命令运行此程序,并用D命令检查其结果(存放在哪里?),是否正确?
正确
4)将INT 20H指令改为INT 3,有何区别?若这条指令不加,行不行?试
试。
改为INT 3命令程序会停止到此处,若不加,会超出此程序的执行范围,直到遇到中断或者死机。
5)请说明这个程序完成的功能是什么?
完成两个8字节的数相加。
- 实验结果与分析