实验一DEBUG的使用.docx
《实验一DEBUG的使用.docx》由会员分享,可在线阅读,更多相关《实验一DEBUG的使用.docx(21页珍藏版)》请在冰点文库上搜索。
实验一DEBUG的使用
实验一DEBUG的使用
实验目的:
1.学习使用DEBUG程序的各种命令。
2.掌握8088/86指令系统---算数指令。
3.掌握用DEBUG调试自编程序的方法。
4.掌握8088/8086CPU寄存器的用途和存储器组织及它们之间的关系。
5.掌握内存操作数及寻址方法。
6.掌握汇编语言伪操作:
BYTEPTR,WORDPTR。
内容及步骤:
一、DEBUG命令使用:
1、敲DEBUG进入DEBUG环境,显示提示符'_'。
2、用命令D10010F观察内存中的16进制码及屏幕右边的ASCII字符。
3、用命令E100303132……3F将30H~3FH写入地址为100H开始的内存单元中,再用D命令观察结果,看键入的16进制数是什么字符的ASCII码?
4、用命令F10010F'A'将'A'的ASCII码填入内存,用D命令查看结果。
5、用命令F11011F41将41H填入内存,用D命令观察结果并比较。
6、用R命令检查各寄存器内容,特别注意AX,BX,CX,DX,IP及标志位中ZF,CF和AF的内容。
7、用R命令将AX,BX内容改写为1234H及5678H。
8、用H命令检查下列各组16进制数加减结果并和你的手算结果比较:
(1)34H,22H
(2)56H,78H(3)A5,79H(4)1284H,5678H(5)A758,347FH
二、8088常用指令练习
1、传送指令
1)用A命令在内存100H处键入下列内容:
MOVAX,1234
MOVBX,5678
XCHGAX,BX
MOVAH,34
MOVAL,56
MOVCX,75AB
XCHGAX,CX
2)用U命令检查键入的程序,特别注意左边的机器码。
3)用T命令逐条运行这些指令,每运行一行检查并记录有关寄存器及IP的变化情况。
并注意标志位有无变化。
2、加减法指令:
1)用A命令在内存200H处键入下列内容:
MOVAH,34
MOVAL,2E
ADDAL,AH
SUBAL,78
MOVCX,1234
MOVDX,5678
ADDCX,DX
SUBCX,AX
SUBCX,CX
2)用U命令检查键入的程序及对应的机器码。
3)用T命令逐条运行这些指令,检查并记录有关寄存器及ZF情况。
思考题:
这次运行还是打入T,行不行?
如何单步运行上述小程序?
用R命令检查一下IP的内容。
注意T命令与IP的关系。
3、带进位加减法:
1)用A命令在内存300H处键入下列内容,并用U命令检查:
MOVAH,12
MOVAL,89
MOVCH,56
MOVCL,98
ADDAL,CL
ADCAH,CH
MOVDH,A7
MOVDL,58
SUBDL,7F
SBBDH,34
2)用T命令逐条运行这些指令,检查并记录有寄存器及CF内容。
3)上面这段程序若改用16位操作指令达到同样结果,怎么改?
试修改并运行之。
4、BCD码加减法
1)内容:
MOVAL,58
ADDAL,25
DAA
2)要求:
用A命令键入,U命令检查,T命令逐条运行并记录有关寄存器及AF内容。
三、内存操作数及各种寻址方式使用:
1)用A命令在内存400H处键入下列内容,并用U命令检查:
MOVAX,1234
MOV[1000],AX
MOVBX,1002
MOVBYTEPTR[BX],20
MOVDL,39
INCBX
MOV[BX],DL
DECDL
MOVSI,3
MOV[BX+SI],DL
MOV[BX+SI+1],DL
MOVWORDPTR[BX+SI+2],2846
2)用T命令逐条运行这些指令,每运行一条有关内存操作数的指令,要用D命令检查并记录有关内存单元的内容并注明是什么寻址方式。
注意:
D命令显示结果中右边的ASCII字符及双字节数存放法。
思考题:
有关指令中BYTEPTR及WORDPTR伪操作不加行不行?
试一试。
四、DEBUG下汇编运行程序方法
用A命令汇编程序,编程完成将DS:
1000开始的10个字节的内存单元的内容相加,并把相加结果存放在DS:
200A内存单元中,用DEBUG调试运行该程序,并察看运行结果。
内容:
MOVCX,0AH
MOVAL,0
MOVBX,1000
LL:
ADDAL,[BX]
INCBX
DECCX
JNZLL
MOV[BX],AL
INT3
步骤:
1)用A命令将程序键入到100H开始的内存中,在键入时记下标号LL的实际地址,在键入JNZ指令时LL用实际地址值代替。
2)用U命令检查键入的程序及对应的机器码。
3)用E10000102030405060708090A将1000H开始的前10个内存单元的内容修改为01,02,03,04,05……0A,用D命令查看修改结果。
4)用T命令逐条运行上述小程序指令,检查并记录有关寄存器、存储单元内容及ZF情况。
5)用F2000l0A02030405……0B将1000H开始的10个内存单元的内容修改为02,03,04,05……0B。
用D命令查看修改结果。
6)用G=100全速运行上述小程序,用D1000100F查看运行结果。
思考题:
可否随意在DEBUG提示符“-”后不带参数发出命令G?
什么情况下使用命令G时,可不用“=”给出执行的首地址?
实验报告:
1、列出8088常用指令练习部分的逐条运行记录。
2、列出DEBUG下调式运行小程序的运行步骤和运行结果。
3、回答思考题。
附:
DEBUG使用:
1、打DEBUG进入DEBUG,显示提示苻'_'。
2、退出DEBUG命令:
Q
3、显示内存命令:
D起始地址结束地址
4、修改内存命令:
E起始地址,连续修改打空格键。
打回车键退出E命令。
5、检查寄存器命令:
R
标志位显示10
CFCYNC
ZFZRNZ
SFNGPL
AFACNA
OFOVNV
PFPEPO
DFDNUP
IFEIDI
6、修改寄存器命令:
R寄存器名
7、小汇编命令:
A起始地址,不输入指令打回车键退出A命令。
8、反汇编命令:
U起始地址结束地址
9、文件命名命令:
N盘号:
文件名
10、读文件命令:
L内存地址
11、写文件命令:
W内存地址
10、读扇区命令:
L内存地址盘号(0--A:
1--B:
)扇区号扇区数
11、写扇区命令:
W内存地址盘号扇区号扇区数
12、运行命令:
G=起始地址结束(断点)地址
13、单步命令:
T=起始地址运行指令数,进入子程序内部。
14、单步命令:
P=起始地址运行指令数,不进入子程序内部。
15、内存搬家命令:
M起始地址结束地址目的地址
实验二数码转换程序
实验目的:
1、掌握二进制和十进制数转换程序的编制和调试。
2、掌握批处理文件的编制及使用。
3、熟悉双字节乘法的编程方法。
实验内容及步骤:
一、数码转换程序
1、将一个十六位二进制数转换成十六进制数显示。
CODESEGMENT
ASSUMECS:
CODE
BEGIN:
MOVBX,1011000101010111B
MOVCH,4
MOVCL,4
ROLT:
ROLBX,CL
MOVDL,BL
ANDDL,0FH
CMPDL,9
JLEL
ADDDL,7
L:
ADDDL,30H
MOVAH,2
INT21H
DECCH
JNZROTL
MOVDL,’H’
MOVAH,2
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEG
进入汇编集成环境,输入、汇编、连接和运行此程序,观察结果。
2、将一个十六位二进制数转换成十进制数并显示输出。
<参考程序>
DATASEGMENT
BUF0DW2768H
BUF1DB5DUP(0)
BUF2DW10000,1000,100,10,1
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEG:
MOVAX,DATA
MOVDS,AX
MOVAX,BUF0
MOVBX,OFFSETBUF1
MOVSI,OFFSETBUF2
MOVCX,5
L:
MOVDX,0
DIVWORDPTR[SI]
ADDAL,30H
MOV[BX],AL
INCBX
ADDSI,2
MOVAX,DX
LOOPL
MOVAH,9
MOVDX,OFFSETBUF1
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEG
进入汇编集成环境,输入、汇编、连接和运行此程序,观察结果。
二、自动汇编,连接及转换的批处理文件:
1、用EDIT或COPYCONALK.BAT命令将下列程序输入:
echooff
masm%1;
echoifyoudonotlink,strikeCtrl-Breakforquit;andeither:
pause
link%1;
del*.obj
echoifthefileis.exe,pleasstrikeCtrl-Breakforquit。
andeither:
pause
exe2bin%1、exe%1、com
del%1、exe
2、利用ALK.BAK文件汇编连接二个以前通过的源文件(COM型及EXE型)。
三、双字节乘法程序:
<参考程序>
dispmacromess
leadx,mess
movah,9
int21h
endm
stacksegmentstack
db256dup(0)
stackends
datasegment
bufdb7
db?
db15dup(?
)
messadb'pleasinputnumberA!
:
$'
messbdb0dh,0ah,'pleasinputnumberB!
:
$'
linefddb0dh,0ah,'$'
bcddd1000000000,100000000,10000000
dd1000000,100000,10000,1000
dd100,10,1
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
mainprocfar
pushds
xorbx,bx
pushbx
movax,data
movds,ax
dispmessa
callget
pushbx
dispmessb
callget
displinefd
popax
mulbx
movcx,10
leasi,bcd
leadi,buf
lop:
callbinec
looplop
movbyteptr[di],'$'
dispbuf
ret
mainendp
getproc
leadx,buf
movah,0ah
int21h
leasi,buf+1
xorbx,bx
movah,bh
movcl,[si]
next:
incsi
addbx,bx
movdx,bx
addbx,bx
addbx,bx
addbx,dx
moval,[si]
andal,0fh
addbx,ax
deccl
jnenext
ret
getendp
binecproc
movbl,0
again:
subax,wordptr[si]
sbbdx,wordptr[si+2]
incbl
jncagain
addax,wordptr[si]
adcdx,wordptr[si+2]
addbl,2fh
mov[di],bl
incdi
addsi,4
ret
binecendp
codeends
endmain
步骤:
1、输入,汇编并连接此程序。
2、在DOS下运行此程序,根据提示输入二个乘数,检查并记录结果。
思考题:
本程序的输入范围是多少?
若超过范围,会产生什么现象?
试一试!
四、根据上题,按下列要求选做一个修改程序:
1、带符号数16位乘法。
2、无符号数16位乘法,输入超过范围时能告警并要求重输。
实验报告:
1、列出实验记录。
2、列出调试通过程序清单并加注释。
3、回答思考题.
4、写出心得体会。
实验四子程序
实验目的:
1、掌握一般子程序的调用和返回,熟悉定义过程的伪指令。
2、掌握利用堆栈传递参数的子程序调用方法。
3、掌握子程序递归调用方法。
实验内容及步骤:
一、利用堆栈传递参数的子程序调用。
(求累加和)
<参考程序>
stacksegmentstack
db256dup(0)
stackends
datasegment
ary1db1,2,3,4,5,6,7,8,9,10
count1equ$-ary1
sum1dw?
ary2db10,11,12,13,14,15,16,17,18
count2equ$-ary2
sum2dw?
dataends
mainsegment
assumecs:
main,ds:
data,ss:
stack
startprocfar
pushds;PSP段基址压栈
xorax,ax
pushax;双字节0压栈
movax,data
movds,ax
movax,count1
pushax
leaax,ary1
pushax
callfarptrsum
movax,count2
pushax
leaax,ary2
pushax
callfarptrsum
ret;返回DOS
startendp
mainends
procesegment
assumecs:
proce
sumprocfar
movbp,sp
movcx,[bp+6]
movbx,[bp+4]
xorax,ax
adn:
addal,[bx]
adcah,0
incbx
loopadn
mov[bx],ax
ret4
sumendp
proceends
endstart
步骤:
1、输入,汇编并将此程序连接成EXE文件。
2、用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用及进出栈指令前后(带';'的语句)的SP和堆栈内容。
3、记录最后结果:
SUM1,SUM2的段及偏移地址和它们的内容。
思考题:
1、sum子程序结尾为什么要用ret4返回?
2、什么是程序段前缀PSP?
二、完成一个四位十进制数相加的程序设计,形式为:
2345+7869=?
要求:
1设计一个子程序,完成从键盘输入一个四位十进制数的操作。
2设计一个子程序,完成将缓冲区数送屏幕显示功能。
3设计一个子程序,完成两个数相加操作。
三、子程序递归调用(求阶乘)。
<参考程序>
stacksegmentstack
db100hdup(?
)
stackends
datasegment
resuldw?
dataends
codesegment
mainprocfar
assumecs:
code,ds:
data,ss:
stack
start:
pushds
subax,ax
pushax
movax,data
movds,ax
movax,5
callfact
movresul,ax
ret
factproc
andal,al
jneiia
moval,1
ret
iia:
pushax
decal
callfact
x2:
popcx
mulcl
ret
factendp
mainendp
codeends
endstart
步骤:
1、将程序输入,汇编并连接成EXE文件。
2、用DEBUG的断点和T命令检查并记录每层递归嵌套过程的堆栈和AL内容。
3、修改源程序,将阶乘数3改为本程序的最大允许值(是多少?
),重新汇编连接之。
用DEBUG运行并记录RESUL单元内容。
4、若要在DOS命令下直接运行并显示阶乘结果(16进制形式),试修改程序并
调试运行。
(机动)
四、自编程序:
用递归方法编程实现两个正整数M和N相乘。
编程说明:
正整数M和N相乘可看作如下形式的递归函数:
MULT(M)=
若设N=15,M=4,则
MULT(4)=MULT(3)+15=MULT
(2)+15+15=MULT
(1)+15+15+15=15+15+15+15=60=3CH
实验报告:
1、列出实验记录。
2、列出自编程序清单并加注释。
3、回答思考题.
4、写出心得体会。
实验五宏指令及宏调用
实验目的:
1、熟悉宏定义的一般结构。
2、掌握宏指令的编写方法和调用方法。
3、能区别宏调用和子程序调用的不同之处。
4、了解LOCAL伪操作的用法。
5、熟悉无参数宏指令和有参数宏指令的定义与调用。
实验内容:
一、无参数宏指令的定义与调用
<参考程序>
CRLFMARCO;宏定义
MOVAH,02H
MOVDL,0DH
INT21H
MOVAH,02H
MOVDL,0AH
INT21H
ENDM
DATASEGMENT
STR1DB‘PLEASEINPUTSTRING1:
$’
STR2DB‘PLEASEINPUTSTRING2:
$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVCX,10
AGAIN:
MOVAH,09H
LEADX,STR1
INT21H
CRLF;宏展开
MOVAH,09H
MOVDX,OFFSETSTR2
INT21H
CRLF;宏展开
LOOPAGAIN
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验六综合程序设计
实验目的:
掌握系统程序设计的方法,全面巩固所学知识内容,提高实际应用能力和应用水平。
实验内容:
题目一、学生成绩管理程序
题目二、员工工资管理程序
实验报告:
1、给出调试通过的程序清单,并附文档说明书。
2、调式中所遇到的问题及解决办法及体会。
实验六综合程序设计
实验目的:
掌握系统程序设计的方法,全面巩固所学知识内容,提高实际应用能力和应用水平。
实验内容:
题目一、学生成绩管理程序
题目二、员工工资管理程序
实验报告:
1、给出调试通过的程序清单,并附文档说明书。
2、调式中所遇到的问题及解决办法及体会。