文档库 最新最全的文档下载
当前位置:文档库 › 实验5熟悉汇编环境,掌握DEBUG各类常用指令指导书

实验5熟悉汇编环境,掌握DEBUG各类常用指令指导书

实验5熟悉汇编环境,掌握DEBUG各类常用指令指导书
实验5熟悉汇编环境,掌握DEBUG各类常用指令指导书

实验一熟悉汇编环境,掌握DEBUG各类常用指令

一、实验目的:

1、掌握8086/8088基本指令的使用方法和功能。

2、初步了解汇编语言程序设计的基本结构和利用DEBUG调试

程序的方法。

3、进一步熟悉汇编语言的上机过程。

二、上机实验指导:

DEBUG是一个DOS实用程序,是供程序员使用的程序调试工具,可以用它检查内存中任何地方的字节以及修改任何地方的字节。它可以用于指令执行某个程序以验证程序运行的正确性,也可以追踪执行过程、比较一个指令执行前后的值以及比较与移动内存中数据的范围,读写文件与磁盘扇区。

常用命令有:

a (Assemble) 逐行汇编 a [address]

c (Compare) 比较两内存块 c range address

d (Dump) 内存16进制显示 d [address]或 d [range]

e (Enter) 修改内存字节 e address [list]

f (fin) 预置一段内存 f range list

g (Go) 执行程序 g [=address][address...]

h (Hexavithmetic) 制算术运算 h value value

i (Input) 从指定端口地址输入 i pataddress

l (Load) 读盘 l [address [driver seetor]]

m (Move) 内存块传送 m range address

n (Name) 置文件名 n filespec [filespec...]

o (Output) 从指定端口地址输出 o portadress byte

q (Quit) 结束 q

r (Register) 显示和修改寄存器 r [register name]

s (Search) 查找字节串 s range list

t (Trace) 跟踪执行 t [=address] [value]

u (Unassemble) 反汇编 u [address ]或range

w (Write) 存盘 w [address[driver sector secnum]]

? 联机帮助 ?

备注:d (Dump) 内存16进制显示时:

DEBUG显示的单元内容,左边用十六进制表示每个字节,右边用ASCII字符表示每个字节,·表示不可显示的字符。这里没有指定段地址,D命令自动显示DS段的内容。如果只指定首地址,则显示从首地址开始的80H个字节的内容。如果完全没有指定地址,则显示上一个D 命令显示的最后一个单元后的内容。

调试程序Debug的主要命令如下:

(一)显示内存单元内容的命令D

格式(1):-D 地址

从指定地址开始,显示128个字节的内容,每一行的左边显示段内偏移地址,接着显示16个单元的内容,最右边区域则显示这一行的16个单元所对应的可显示的字符。若无可显示的字符,则用圆点(小数点)填充。

D命令中的地址可为段内偏移量,也可为段基址和段内偏移量两部分,中间用冒号隔开,如1680:0110,即指段基址为1680H,段内偏移量为0110H。Debug中所显示的数据均为十六进制数,且省去了后面的H标志。

格式(2):-D 范围

将显示指定地址范围内的内存单元的内容,起始地址可由段基址及段内偏移量两个部分组成,中间用冒号“:”隔开,也可以只指出段内偏移量,而此时的段基址在DS中。这里所说的范围包含起始地址和结束地址。

比如–D DS:1000 1020

将显示数据段偏移地址为1000H到1020H的内容。

(二)修改内存单元内容的命令E

格式(1):-E 地址按回车

再输入更改后的内容

它的功能是用给定的内容表去代替所指定的内存单元的内容。

例如:

-E DS:0110 (回车的意思)

0B01:0110 CD. ee (此处DS为数据段寄存器,其内容为0B11是段基地址,这可能与你计算机中的DS的值不同)

接着用d命令查看ds:0110中的内容

格式(2):E 地址

连续改变地址中的内容。

改完一个字节中的内容,继续按空格键,完成后续字节的更改。

若指定单元的内容需要修改,则将新的内容的十六进制数输入,再按空格键,修改便告完成,然后显示下一个存储单元的地址及内容,若需要修改,可进行同样的操作。若某一个单元的内容不需要修改,而操作又要进行下去,则可直接按空格键。

(三)检查和修改寄存器内容的命令R

格式(1):R

此时将显示所有寄存器的内容和全部标志位的状态,以及现行CS:IP所指的机器指令代码和反汇编符号。

格式(2):R 寄存器名

该格式可用于检查和修改指定寄存器的内容。若不修改其内容,可按键,若需要修改其内容,可以输入1-4 个十六进制数,再按键。

格式(3):RF

该格式可用于显示标志和修改标志位状态。

当系统给出标志位状态后,可采取下列办法:

①若不需要修改任一标志位,可按键。

②若需要修改一个或多个标志位,可输入其相反的值。各标志位之间可以无空格且与顺序无关,修改后按键。

由于标志位状态显示时,是用下列特殊符号表示的,因而修改时,只要输入规定的符号即可。下面是标志名和状态符号的对照表:

标志名置位符号复位符号

溢出标志OF(是/否) OV NV

方向标志DF(减/增) DN UP

中断标志IF(允许/禁止) EI DI

符号标志SF(负/正) NG PL

零标志ZF(是/否) ZR NZ

辅助进位标志AF(是/否) AC NA

奇偶校验标志PF(偶/奇) PE PO

进位标志CF(是/否) CY NC

只有追踪标志TF,不能用指令直接修改。

例如:输入RF命令,系统可能作出如下响应:

OV DN EI NG ZR AC PE CY -

若现在要修改奇偶、零、中断和溢出标志位,可在光标处输入:

PO NZ DI NV

(四)运行程序命令G

格式:G [=地址][地址[地址…]]

该命令可以在程序运行中设置断点。它是Debug程序进行程序调试的主要命令之一。

示例:-g 001a 则执行从当前cs:ip至001a的指令,注意:地址设置必须从指令的第一字节设起。

(五)汇编命令A

若在调试目标程序的过程中,要求改写或增添一段目标程序,则可以用A命令直接在Debug下实现。

格式:A [地址]

该命令可以从指定地址开始,将输入的汇编语言语句立即汇编成机器代码,连续存放在内存单元中。在程序输入完毕后,最后一行不输入内容,直接按回车键,即可返回DEBUG 程序,还可用反汇编命令U对刚输入的内容进行反汇编,以验证输入的程序是否正确。

(七)反汇编命令U

格式(1):U地址

该命令从指定的地址开始,反汇编32个字节。若略去指定地址,则以上一个U命令反汇编的最后一条指令地址的下一条指令地址作为起始地址;若没有用过U命令,则以由Debug初始化的段寄存器的值作段地址,以100作为地址偏移量。

格式(2):U范围这种格式的命令,可以对指定范围的内存单元进行反汇编,范围可以由起始地址、结束地址(只能包含地址偏移量)或起始地址及长度来指定。其命令格式如:U 04BA:100 0108 或U 04BA:0100 L7

两者是等效的。

(一)利用DEBUG的A命令输入指令,做如下实验。

1、比较下面指令的区别:

①MOV AX,2000H ②MOV BX,[2000H]

-D 2000 2001;显示字存储单元DS:2000的内容

3ADC:2000 5A58ZX

-R ;显示指令执行前AX,BX的内容

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3ADC ES=3ADC SS=3ADC CS=3ADC IP=0100 NV UP EI PL NZ NA PO NC 滋出OV(未溢出)NV(未溢出)零位ZR NZ(不等于零)方向DN(减少)UP(增加)辅助进位AC NA(无进位)

中断EI(许可)DI(禁止)奇偶标志PE(偶)PO(奇)

符号NG(负)PL(正)进位CY NC(清除进位)

-A ;利用A命令输入汇编指令

3ADC:0100 MOV AX,2000

3ADC:0103 MOV BX,[2000]

3ADC:0107 INT 3 ;此中断为断点中断,使程序执行暂停

3ADC:0108

-G ;不指定地址,从当前CS:IP处执行

AX=2000 BX=585A CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3ADC ES=3ADC SS=3ADC CS=3ADC IP=0107 NV UP EI PL NZ NA PO NC

3ADC:0107 CC INT3;指令执行后,AX=2000H, BX=585AH

2、以寄存器BX作为地址指针,从BX所指的存储单元开始起,连续存放着两个无符号数(字操作数),编程求它们的和,并将结果存放在这两个数之后。

-R BX;显示BX寄存器中的内容(BX=0000h)

BX 0000

:;回车

-D 0000 0005;显示DS:0000到DS:0005的内容(BX所指的三个字操作数),如BX不为0000H,自己修改范围。3A6B:0000 CD20 FF9F 009A.....

;三个字操作数依次为20CDH,9FFFH,9A00H

-A;输入指令

3A6B:0100 MOV AX,[BX]

3A6B:0102 INC BX

3A6B:0103 INC BX

3A6B:0104 ADD AX,[BX]

3A6B:0106 INC BX

3A6B:0107 INC BX

3A6B:0108 MOV [BX],AX

3A6B:010A INT 3

3A6B:010B

-G;运行此程序

AX=C0CC BX=0004 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=3A6B ES=3A6B SS=3A6B CS=3A6B IP=010A NV UP EI PL NZ NA PO NC

3A6B:010A CC INT3

-D 0000 0005;观察运行结果,检查第三个字操作数是否为前两个字操作数之和

3A6B:0000 CD20 FF9F CCC0.....

3、在屏幕上显示大写字符”A”。

-A

1277:0100 mov ah,2

1277:0102 mov dl,41 ;大写字符”A”的ASCII值为41H

1277:0104 int 21

1277:0106 int 3

1277:0107

-G

A;显示大写字符”A”

AX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1277 ES=1277 SS=1277 CS=1277 IP=0106 NVUPEIPLNZNAPONC 1277:0106CC INT3

4、已知(AL)=50H,(BL)=18H,计算AL-BL,并将存入CL中。

输入指令后,运行调试,观察运行结果。

-a

1277:0100 mov al,50

1277:0102 mov bl,18

1277:0104 sub al,bl

1277:0106 mov cl,al

1277:0108 int 3

1277:0109

-g;观察寄存器AX,BX,CX的内容

AX=0038 BX=0018 CX=0038 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000

DS=1277 ES=1277 SS=1277 CS=1277 IP=0108 NVUPEIPLNZACPONC

1277:0108CCINT3

5、用DEBUG的A命令输入指令,完成以下功能:输入一个大写字母,将其转换为小写字母后输出。编好程序后,用DEBUG调试、运行程序。

-a

1277:0100 mov ah,1

1277:0102 int 21

1277:0104 add al,20

1277:0106 mov dl,al

1277:0108 mov ah,2

1277:010A int 21

1277:010C int 3

1277:010D

-g

Aa;输入一大写字母转换为小写字母后输出

AX=022A BX=0000 CX=0000 DX=002A SP=FFEE BP=0000 SI=0000 DI=0000

DS=1277 ES=1277 SS=1277 CS=1277 IP=010C NVUPEIPLNZNAPONC 1277:010CCC INT 3

相关文档