PROTEUS-8086实验指导书
1、Proteus仿真
a.在Proteus中新建工程“8位数码管_SH.pdsprj”,绘制实验电路图; b.添加自己编写的汇编代码,编译直至成功; c.如不能正常工作,打开调试窗口进行调试。
汇编语言参考程序:
2、实验板验证
a.通过USB线连接实验箱; b.按连接表连接电路;
c.运行PROTEUS仿真,检查验证结果。
七、 实验结果和体会
八、 建议
第44页
PROTEUS-8086实验指导书
附录:DEBUG调试程序的使用及其上机过程
利用DEBUG调试程序,可以将一个可执行程序(如.EXE、.COM等)装入内存中,并接管对程序运行的控制权,通过采取如反汇编、断点运行、单步执行、寄存器内容修改等方法,对可执行程序进行跟踪、调试,以找出其中的设计错误,然后再对源程序进行相应修改,重新生成正确的可执行程序。
(1)准备被调试程序:
假定所有有关文件均在当前路径C:\\DUAN>下,按照实验一的步骤生成一个被调试的可执行程序(如TEST.EXE),参考程序如下:
DATA SEGMENT ;定义数据段
STR DB ‘HelloWorld’,’$’ ;定义提示信息 DATA ENDS ;定义代码段
CODE SEGMENT ASSUME CS:CODE,DS:DATA
START:MOV AX,DATA ;装入数据段的首地址
MOV DS,AX
MOV DX,OFFSET STR ;取STR的偏转地址送入DX MOV AH,09H
INT 21H
MOV AH,4CH
;返回DOS
INT 21H CODE ENDS END START
(2)进入DEBUG环境:(其中斜体部分由键盘输入。)
C:\\ DUAN>DEBUG TEST.EXE↙ -
其中,短线‘-’作为DEBUG环境的操作提示符,在此提示符下,可以输入各种DEBUG
命令,对可执行程序TEST.EXE进行跟踪调试。
(3)主要调试命令: 1) 反汇编命令U
将存储器中的二进制数据翻译成较有意义的助记符形式,以帮助理解。一般常用以下格式 a) -U↙:从当前IP处开始,对连续约32字节内容反汇编。如对TEST.EXE,刚装入
DEBUG时的IP=0000,则在输入U命令后有如下显示: -U↙
第45页
PROTEUS-8086实验指导书
12B7:0000 12B7:0003 12B7:0005 12B7:0008 12B7:000A 12B7:000C 12B7:000E 12B7:0010 12B7:0012 ?? 12B7:001F
-
B8B612 MOV 8ED8 MOV BA0000 MOV B409 MOV CD21 INT B44C MOV CD21 INT EB51 JMP 8B867AF MOV ?? 8B4604 MOV AX,12B6 DS,AX DX,0000 AH,09 21
AH,4C 21 0063
AX,[BP+FF7A] ??
AX,[BP+04]
在上例中,12B7:0000表示CS:IP的内容(其中CS的值是动态值);B8B612代表该处存放的二进制数据,亦即指令MOV AX,12B6的机器代码;当连续约32字节的数据反汇编完后,重新回到DEBUG提示符“-”下,如果再键入U命令,则将继续对后面的内存区反汇编。 特别应该注意的是,由于反汇编命令针对内存区的二进制数据,而被调试程序仅占内存区的某一部分,故反汇编出来的内容并非全是被调试程序的代码,如上例中的JMP 0063以后的部分,显然不是TEST.EXE的内容。另外还需注意,DEBUG默认使用十六进制。
b) –U 0123↙:从指定的IP=0123处开始,对连续约32字节内容反汇编。
c) –U 0123 0143↙:从指定的IP=0123处开始反汇编,直至指定的0143处结束。 2)
显示寄存器命令
R:显示或修改寄存器的内容。一般常用以下形式:
TEST.EXE,在程序
a) -R↙
-R↙:显示所有寄存器当前的内容及当前将执行的指令。如对
运行之前,键入R命令:
AX=0000 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12A6 ES=12A6 SS=12B6 CS=12B7 IP=0000 NV UP EI PL NZ NA PO NC 12B7:0000 B8B612 MOV AX, 12B6 -
在显示寄存器内容时,标志寄存器F(或程序状态字寄存器PSW)表示成各个分离的标志位,其意义如下表所示: 0 1 溢出 NV OV b)
-R
方向 UP DN 中断 DI EI 符号 PL NG 零 NZ ZR 辅助进位 NA AC 奇偶 PO PE 进位 NC CY AX↙:显示指定的AX寄存器当前的内容,并等待键入新值;如果不作修改,可直接回车。如:
-R AX↙
第46页
PROTEUS-8086实验指导书
AX 0000 :1234↙ - c)
-R
F↙:显示标志寄存器F各个标志位的内容,并等待键入新的标志位;如果不作修改,可直接回车。如:
-R F↙
NV UP EI PL NZ NA PO NC -ZR↙ (键入的ZR表示修改ZF标志值,可同时修改多个标志值。) -
3) 运行命令G:使程序在DEBUG控制下运行,一般有全程、断点运行两种方式。 a) -G↙:控制程序由当前IP处运行,直至程序结束。如果当前IP为初始值,其作用
则相当于直接在DOS下运行程序,一般用于快速观察程序的运行情况。 b) -G 0123↙:控制程序由当前IP处运行,直至指定的断点IP=0123H处,程序暂停,
显示各个寄存器的当前值及断点处指令,然后返回DEBUG提示符“-”下。如对TEST.EXE,若想观察字符串显示的入口参数是否设置好,则可以断点运行至000A处: -G 000A↙
AX=09B6 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12B6 ES=12A6 SS=12B6 CS=12B7 IP=000A NV UP EI PL NZ NA PO NC 12B7:000A CD21 INT 21 -
断点一般选取在需要观察的地方,当程序停下来后,可以根据各方面的情况(如寄存器、缓冲区、标志等)来判断程序是否运行正确。
4) 单步命令T:控制程序运行一条指令后暂停,显示各个寄存器的当前值及断点处指令,
然后返回DEBUG提示符“-”下。如对TEST.EXE,若当前IP为初始值,则键入T命令后有如下显示: -T↙
AX=12B6 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000 DS=12A6 ES=12A6 SS=12B6 CS=12B7 IP=0003 NV UP EI PL NZ NA PO NC 12B7:0003 8ED8 MOV DS,AX -
单步命令一般用于需对程序运行作仔细分析的地方,如判断分支转移、观察运算结果等。若能综合运用断点及单步指令,则可大大提高DEBUG 调试的速度及效率。但应注意,当IP指针位于INT 21H一类指令处时,执行T命令将会使程序进入该功能调用子程序中,因此,这种情况下最好不用T命令,而用断点运行命令跳过该类功能调用指令。
5)
显示内存命令
D:以十六进制及ASCII两种方式显示内存区的二进制数据,通常用来
第47页
PROTEUS-8086实验指导书
观察数据段内的缓冲区内容。一般常用以下二种形式:
a) -D↙:从0000单元开始,连续显示128个内存单元的内容,如果继续键入D命令,
则继续显示后128个单元内容。如对TEST.EXE,若想观察字符串显示时的字符串内容是否正确,则可在程序断点运行至000A处,键入D命令: -D DS:0↙
12B6:0000 48 65 6C 6C 6F 2C 57 6F-72 6C 64 21 24 00 00 00 Hello,World!$... 12B6:0010 B8 B6 12 8E D8 BA 00 00-B4 09 CD 21 B4 4C CD 21 ...........!.L.! 12B6:0020 EB 51 8B 86 7A FF 2B C6-40 50 8A 46 08 98 50 8B .Q..z.+.@P.F..P. ?? ??
12B6:0070 83 C4 02 8B 5E 04 8A 07-2A E4 89 86 7A FF 3B C6 ....^...*...z.;. -
在上例中,128个单元分成8行,每行16个单元,每个单元的内容分别以十六进制形式和ASCII码形式显示。如果该单元的内容不是可显示字符,则在ASCII区内显示为“.”。
b) –D 0123 0143↙:从指定的0123单元开始显示,直至指定的0143单元结束。 6) 汇编命令A:用于在DEBUG环境下直接键入汇编语言语句、生成较简单的可执行代码
而不必经过完整的汇编语言编程步骤,或者用来在调试过程中临时修改某条指令。如:
-A↙
127D:0100 MOV 127D:0102 MOV 127D:0104 INT 127D:0106 ↙ -A 0102↙
127D:0102 MOV 127D:0104 ↙ -
AH,02↙ AL,6A↙ 21↙
DL,6A↙
当键入汇编命令A后,将从当前IP或指定地址处提示输入汇编语句,每输入一条语句,DEBUG将其汇编成机器码,并存入相应的存储单元中,然后地址自动增加,继续提示输入下一条语句;如果直接回车,则结束汇编命令。特别应注意的是,DEBUG默认使用十六进制,故在输入时不能使用H。
7) 装载命令L:用来将被调试程序重新装载进内存中,一般用于程序运行结束后需继续调
试程序时,或需从头开始调试程序时。如对TEST.EXE:
-G↙
Hello,World!
Program terminated normally -L↙- 8)
退出命令
Q:键入此命令,即退出DEBUG状态,返回DOS。
第48页