一、实验目的
1. 熟悉DEBUG提供的调试环境。
2. 学习使用Debug的常用命令,汇编、运行小段程序。
3. 学习8088/8086的寻址方式、指令功能。观察计算机执行简单程序的工作过程。
二、实验内容与操作指导
Debug子命令的功能与使用格式见上章的列表介绍。 下面通过8个程序小段实例,学习其用法。
(一) 由DOS进入DEBUG调试环境
1.点击”开始”→程序→附件→命令提示符→DEBUG 将调试程序装入内存
注意:当机器控制权由DOS成功地转移给调试程序后,将显示“—”号,它是debug的状态提示符,表示可以接受调试子命令了。
2. — R显示CPU中各寄存器当前初始内容。请记录于下列各项,后面实验将用到。
AX= BX= CX= DX= BP= SI= DI=
DS= ES= SS= SP= CS= IP=
FLAG寄存器中的8个标志位状态值(已填入,其含义见下页的介绍)是: OF NV DF UP IF EI SF PL ZF NZ AF NA PF PO CF NC 说明: (1) 此时,调试工作区的4个段值相同,指向同一起点。表明共用一个64KB空间。 (2) SS:SP指向堆栈顶单元。SP为FFFE或FFEE,正好是本段的最高可用地址。
表明堆栈自动使用最高地址,栈区由底往上(低址方向)生长。
(3) CS:IP为约定的调试工作区地点(IP=0100),可由此装入待调试程序代码,或
汇编键入的程序小段。工作区由(低址)往下使用。
(4) Debug用符号给出寄存器中8个标志位的当前状态。其含义如下表所示。 (5) 当运行程序至断点处停下时,或单步多步跟踪执行指令时,Debug均显示各寄
存器的当时内容,便于及时观察结果。
标志位含义 OF 溢出 DF 方向 IF 中断 SF 符号 ZF 全零 AF 辅助进位 PF 奇偶性 CF 进位 (二)汇编运行小段程序 1.1求和运算
“1”的对应符号 OV 有 DN 递减 EI 允许 NG 负 ZR 零 AC 有 PE 偶 CY 有 “0”的对应符号 NV 无 UP 递增 DI 禁止 PL 正 NZ 非零 NA 无 PO 奇 NC 无 给程序1.1人工直接给寄存器赋初值 (1) 给AX、BX赋值
— RAX
AX 显示AX当前内容 :FDAA 键入被加数
— RBX
BX 显示BX当前内容 :FBCE 键入加数
(2) 汇编小段程序。注意:每行指令后用回车结束,机器即进行汇编,出错将有提示。调试状态下操作数的输入和显示均为HEX十六进制,故不必加后缀H。
— ACS:100
:0100 ADD AX,BX ;求和
:0102 MOV CX,AX ;转存和数
:0104 INT 20 ;结束程序(软中断调用) :0106 ;结束汇编
— R 查看各寄存器内容。因程序尚未运行,故无运算结果。 (3) 单步跟踪执行程序。注意观看有关寄存器内容及各标志位值的变化。 —t 从当前地址(CS:0100)处执行加法指令。记录有关结果。
AX= BX= CX= IP= OF DF IF SF ZF AF PF CF — t 再执行传送指令,记下有关结果
AX= BX= CX= IP= OF DF IF SF ZF AF PF CF 分析两步结果,解释内容变化或不变化的原因。
(4) 结束程序,返回Debug
—G 执行软中断指令INT 20,机器将显示“程序正常终止”的信息。并显示“—”,表明仍处在debug的调控控制状态下。注意这里未用t命令,因为我们不想进入到20H中断处理程序中去。
程序1.2 让机器通过指令给寄存器送立即数 (1) 汇编小段程序
— ACS:106
:0106 MOV AX,1234 ;被加数 :0109 MOV BX,2345 ;加数 :010C MOV CX,0 ;清0 :010F ADD AX,BX ;求和
:0111 MOV CX,AX ;转存结果 :0113 INT 20 ;结束程序
:0115 ;结束汇编
(2) 运行程序。注意:必须先修改指令指针IP,使其指向本程序的首条指令。然后才
能执行程序。当然也可在t或G命令中指出程序起点地址。 —RIP
IP 0100 显示当前值
:0106 指向本程序入口
—R 显示各寄存器当前内容及首条指令
—T3 跟踪执行三条赋值传送指令,看有关寄存器及标志值 —T2 跟踪执行相加及送和数指令,看有关寄存器及标志值 —G 执行20H号中断,结束程序
程序1.3 采用直接寻址方式从内存区读写数据 (1)汇编程序
—ACS:116
:0116 MOV AX,[0125] :0119 MOV BX,[0127] :011D ADD BX ,AX :011F MOV [0129],BX :0123 INT 20 :0125 DW 2222 :0127 DW 8888
:0129 DW 0 ;和单元
:012B
注意:①由于当前DS=CS,故直接寻址从内存取存的数据,可与指令代码接在一起。
②A命令能汇编处理DB及DW两条伪指令定义的变量数据,但不得用变量符号。 (2) 设置断点(观察点)分段运行程序
—G=CS:116 11D ;从指定入口运行程序,至断点11D停。可见了;两个数已 取至AX,BX,但还没有求和。
—G123 ;从上一断点运行至新断点停。已完成求和并存入指定结果单元。 —G ;结束程序。 (3) 用两种方式观看内存内容
—DCS:116 12B 显示本程序小段目标代码和数据单元内容 —UCS:116 123 反汇编指定范围的内存区内容。 机器码 0AF5:0116 A12501 0AF5:0119 8B1E2701 0AF5:011D 01C3 0AF5:011F 891E2901 0AF5:0123 CD20
2.求n*10的运算
程序 MOV AX,[0125] MOV BX,[0127] ADD BX ,AX MOV [0129],BX INT 20 程序1.4 用移位指令实现乘法运算 (1)汇编小段程序
—ACS:0130
:0130 MOV AL ,08 ;设n=08h :0132 SHL AL ,1 ;得AL=10h :0134 MOV BL,AL :0136 MOV CL,2
:0138 SHL AL,CL ;得AL=40h :013A ADD AL,BL ;得AL=50h :013C INT 20
:013E
(2) 运行程序。可用单步跟踪,多步跟踪,设断点或连续运行等方式来监控程序的执
行。
程序1.5 用乘法指令运算且显示结果
—ACS:140
:0140 MOV AL,06 ;设n=06h :1042 MOV CL,0A
:0144 MUL CL ;06h*0Ah :0146 MOV DL,AL
:0148 MOV AH,02 ;用2号功能调用显示结果 :014A INT 21 :014C INT 20
:014E
运行程序。请注意观看结果数据如何求出及表示的。还可更改n值,重新运行程序。
3. 向指定内存区置数(程序1.6)
(1)汇编小段程序。
—ACS:150
:0150 MOV AX,1000 ;置数据段值 :0153 MOV DS,AX
:0155 MOV AL,42 ‘B’=42h
:0157 MOV SI,0 ;置偏移地址初值 :015A MOV [SI],AL ;填写字符B :015C INC SI ;指向下一单元 :015D CMP SI,10 ;已填完吗? :0160 JNZ 015A ;否,继续循环 :0162 INT 20 ;是,结束程序
(2)运行程序。注意:这是循环程序。由此较指令和条件转移指令控制循环。到底循环了多少次呢?请先用D命令观看待置数内存区的原内容(—D1000:0 2F)。然后单步或多步执行程序,看程序循环填数的控制过程。最后再用D命令看数据区内容,检查填数效果(—DDS:0 2F 为什么此处可用ds指定段值呢?) (3)用F命令向内存区填数
—FDS:10 2F‘C’ 用C字符填写1000:10~2F内存区
—FDS:30 L20‘*’ 用*字符填写1000:30~4F内存区 —FDS:50 L10‘0123456789ABCDEF’ 填写字节串 —DDS:0 观看数据区的内容(显示128个字节单元)
4. 接收、显示从键盘输入的字符(遇空格符则退出)
(1) 汇编小段程序(程序1.7)
—ACS:170
:0170 MOV AH,1 ;1号功能调用,等待键盘输入 :0172 INT 21
:0174 CMP AL,20 ;是空格符吗? :0176 JZ 0180 ;是,退出循环 :0178 MOV DL,AL
:017A MOV AH,2 ;2号功能调用,显示一个字符 :017C INT 21
:017E JMP 0170 ;继续循环 :0180 INT 20 ;结束程序
:0182
(2) 运行程序。这也是条件控制的循环程序。利用了两个功能调用。可连续运行
程序,观看循环控制过程,观看程序效果。请问:为什么屏幕显示的是双字符呢?按回车键,有什么现象出现?按其它键呢?
5.在屏幕上显示字符串信息
(1) 汇编小段程序(程序1.8) —ACS:190
:0190 PUSH CS ;使DS=CS :0191 POP DS
:0192 MOV DX,19B ;字符串入口地址
:0195 MOV AH,9 ;9号功能调用,显示字符串 :0197 INT 21 :0199 INT 20
:019B DB‘Welcome to use the DEBUG!$’
:01B6
(2) 连续运行程序,观看显示效果。你可以从19B处重新汇编,改变字符串内容,再运行程序。
(三)文件存取操作
1. 文件存盘
大家或许注意到:上列8个程序小段在内容空间上没有彼此覆盖。目前,仍保存在 CS:100~1B5的调试工作区内。我们可以把这段代码作为一个文件(取名MYABC)写入磁盘保存起来。其操作步骤是: (1) 文件长度送入BX:CX。这里要存盘的内存信息长度是1B5-100+1=B6请用R命
令将0写入BX,将B6写入CX。
(2) 定义文件名后写入磁盘
—NA:MYABC 定义文件标识符
—W 将约定的工作区起点(CS:100)至算出的终点(B6为长度)
的信息写入指定盘文件中。
2. 装入磁盘文件
让我们先将调试工作区的起始256个单元清0。并检查清0效果,再将刚才在盘上生成的实验程序文件,装入工作区,看它是否真的又回调到内存。所用的命令串如下: —FCS:100 1FF 0 ;清0
—DCS:100 1FF ;检查是否为0
—NA:MYABC ;定义待装入的文件标识符 —L ;从工作区起点装入文件
—DCS:100 1FF ;检查装入内容。你还可按前面实验程序汇编的起始地址,用反汇编命令查看这几个程序小段。 (四)退出Debug返回DOS
—Q 返回DOS后,可用DIR命令查看文件MYABC的目录注册情况。
因篇幅问题不能全部显示,请点此查看更多更全内容