您好,欢迎来到星星旅游。
搜索
您的当前位置:首页实验二 DEBUG使用方法

实验二 DEBUG使用方法

来源:星星旅游
实验二 DEBUG使用方法

一、实验目的

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的目录注册情况。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务