汇编语言Word格式文档下载.docx
《汇编语言Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编语言Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
现在举例说明怎样使用DEBUG。
本例是一个查表程序,在TABLE开始的内存单元连续存放0-6的立方值,任给一数X(在0和6之间),在XX单元中,查表求X的立方值,并把结果放入YY单元中。
设这个程序的文件名为YAN.ASM。
DATASEGMENT
TABLEDB0,1,8,27,64,125,216
XXDB3
YYDB?
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
DB50DUP(?
)
STACKENDS
COSEGSEGMENT
ASSUMECS:
CODEG,DS:
DATA,SS:
STACK
STARTPROCFAR
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSETTABLE
MOVAH,0
MOVAL,XX
ADDBX,AX
MOVAL,[BX]
MOVYY,AL
RET
STARTENDP
COSEGENDS
ENDSTART
这个程序经过汇编和连接后得到可执行文件YAN.EXE。
该文件是可执行的,但执行的是否正确是不知道的,因为结果不在屏幕上显示出来。
为了验证本程序设计是否正确可用DEBUG来调试,观察能否得到预期的效果。
设调试程序DEBUG和被调试程序YAN.EXE都在C盘中,则键入
C:
〉DEBUGYAN.EXE
打回车后出现DEBUG的提示标志—。
这时就可以使用各种DEBUG命令(下面详述)对程序进行调试,这里先用U命令进行反汇编得到如下的程序:
-U
0F34:
00001EPUSHDS
0001B8000MOVAX,0000
000450PUSHAX
0005B8330FMOVAX,0F33
00088EDBMOVDS,AX
000ABB0000MOVBX,0000
000DB400MOVAH,00
000FA00700MOVAL,[0007]
001203D8ADDBX,AX
00148A07MOVAL,[BX]
0016A20800MOV[0008],AL
0019CBRETF
这是源程序中的代码段,其中MOVAX,0F33对应源程序中MOVAX,DATA;
MOVBX,0000对应源程序中MOVBX,OFFSETTABLE。
用G命令执行该程序,程序起点在CS:
0000,断点在CS:
0016。
程序执行的预期效果是BX=0003,AL=27。
程序执行如下:
G=0F34:
00000016
AX=001BBX=0003CX=002ADX=0000SP=0000BP=0000SI=0000DI=0000DS=0F33ES=0F23SS=0F36CS=0F34IP=0016NVUPEINZNAPENC
0016A20800MOV[0008],ALDS:
0008=00
由上可见,BX=0003,AX=001B,即AL=27。
得到了预期的效果,说明源程序是正确的。
2、如何调用DEBUG程序
DEBUG程序是DOS盘上一个独立的可执行程序。
有两种启动方法,其格式是(设DEBUG和被调用程序在C盘)
>
DEBUG<
文件名.扩展名>
或C:
DEBUG
第一种方法是DOS把DEBUG.COM调入内存以后把被调试的程序也调入内存。
被调试程序装入内存的地址是,当文件扩展名为.COM时从偏移100H开始装入;
当文件扩展名为.EXE时从偏移0开始装入。
装入后显示DEBUG提示符“-”,在提示符“-”下可执行DEBUG各种命令。
第二种方法是调用DEBUG后,立即显示提示符“-”。
因为DEBUG的后面不带被调用文件名,则DEBUG程序或者与正在内存中的内容打交道;
或可用DEBUG的N命令和L命令,从盘上输入要调用的程序。
如下所示:
〉DEBUG
-N{D:
}{PATH}FILENAME{.EXE}
-L
-
DEBUG把被调试文件装入内存后,也给文件安装了一个程序段前缀(PSP),并为文件的寄存器设置了一些初始值,其情况和在DOS下加载文件类似。
不同的是,系统控制权并未移交给被调试程序,仍为DEBUG拥有,此外BX,CX中有被调试程序的文字长度。
3、关于DEBUG命令的一些说明
DEBUG的主要命令见附录一,下面有一些简单说明:
①DEBUG命令都是一个字母,后面跟一个或多个参数。
②可以按住CTRLBREAK来停止一个命令的执行,返回DOS提示符。
③若一个命令产生相当多的输出行,为了能看清楚它,可以在显示过程中按CTRLNUMLOCK停止翻页,按任意键重新启动。
④每一个命令,只要按了回车键才有效。
实验一汇编语言程序的输入、汇编、连接与运行
一、实验目的
1、掌握在计算机上运行汇编语言程序的整个操作过程。
2、学会将自己编制的源程序用EDIT编辑程序输入计算机并存盘。
3、学会用宏汇编MASM对源程序汇编。
4、学会用LINK连接程序对二进制目标文件连接形成可执行文件。
5、学会运行经汇编和连接后的可执行文件。
二、实验内容
1、熟悉、练习DEBUG的使用。
2、在DEBUG中编写四则运算程序,并记录结果。
(1)加法运算:
编程实现16+32,查看结果。
(2)减法运算:
编程实现A78H-5E9H,查看结果。
(3)乘法运算:
编程实现0057H*1008H,查看结果。
(4)除法运算:
编程实现32H/16H,查看结果。
3、用逻辑尺的方法编制一个程序,在CRT上显示“中”。
三、实验要求
1、在DEBUG下调试程序,观察、记录程序执行过程和结果,并加以说明。
2、编写内容3中的程序,加以汇编、连接生成.EXE文件,观察结果。
四、思考题
如果把“中”改为“王”,则程序应该如何修改?
如果改为阿拉伯数字“8”呢?
五、参考实验程序
RULER1DB10H,0FEH,92H,92H,0FEH,10H,10H
CODESEGMENT
CODE,DS:
DATA
START:
MOVAX,DATA
LEASI,RULER1
MOVCX,7
AA1:
MOVDH,8
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVBL,[SI]
AA2:
MOVDL,20H
SHLBL,1
JNCAA3
ADDDL,21H
AA3:
MOVAH,2
DECDH
JNZAA2
INCSI
LOOPAA1
MOVAH,4CH
CODEENDS
实验二顺序程序的设计
1、掌握顺序、分支程序的设计方法。
2、学会编制顺序、分支程序。
3、掌握上机调试顺序、分支程序。
4、学会用INT功能实现人机对话。
1、编写一个程序,实现32位数的加减运算,其表达式为:
W=X-Y+Z-10。
2、编写一个程序,实现将一个十六进制数转换为十进制数的程序。
1、编写源程序,并经汇编、连接生成EXE文件。
2、在DEBUG下调试程序,观察程序执行过程和结果。
十六进制数转换为十进制数比较容易,如果是把二进制数转换为十六进制数呢,编程实现一下。
五、参考程序
实验内容1的程序请自己设计流程图,自己进行编程。
实验内容2的参考程序如下。
.MODELTINY
.CODE
BEGINPROC
MOVAX,01AA5H
MOVCX,0
MOVBX,10
DISPX1:
MOVDX,0;
字除法,将余数寄存器清零(结果放在AX中)
DIVBX
PUSHDX
INCCX
ORAX,AX;
为什么要自己和自己与?
JNZDISPX1
DISPX2:
POPDX
MOVAH,6
ADDDL,30H
LOOPDISPX2
.EXIT
BEGINENDP
ENDBEGIN
实验三分支程序设计
1、掌握会变语言常用指令。
2、掌握分支程序的编写方法
设计要求:
分别在数据段和附加段各定义一串字符,编写代码判断两者是否相同,如果相同则输出MATCH!
,如果不同则输出NOMATCH!
。
2、调试程序,观察程序执行结果。
1、转移指令分为哪几种,各指令之间有何区别?
操作提示:
STRING1DB'
WORLD!
'
'
$'
A1DB'
MATCH'
$'
A2DB'
NOMATCH'
EXTSEGMENT
STRING2DB'
EXTENDS
STACKSEGMENT'
STACK'
DB100DUP(?
MAINPROCFAR
ASSUMEDS:
CODE,ES:
EXT
PUSHDS
MOVAX,STACK
MOVSS,AX
MOVAX,EXT
MOVES,AX
LEASI,STRING1
LEADI,STRING2
CLD
MOVCX,6
REPZCMPSB
JZMATCH
LEADX,A2
JMPO1
MATCH:
LEADX,A1
O1:
MOVAH,9
MAINENDP
实验四冒泡法程序设计
1、掌握循环程序、子程序的编写方法。
2、掌握循环程序、子程序上机调试技术。
3、学会利用冒泡法对数据进行排序。
1、编写一个程序,实现1到100的累加和,结果存入SUM单元。
2、编写一个程序,利用冒泡法对一字符串进行排序。
要求屏幕有提示信息“PLEASEENTRYSTRING”,当在下一行输入字符串后,结果按ASCII值由小到大排序,在下一行显示。
在实验内容2中,如果要按从大到小排列,程序应该做怎样修改,编写源程序并进行调试。
STACKSEGMENTPARASTACK'
DB64DUP(0)
PROMPTDB0DH,0AH,'
PLEASEENTRYSTRING$'
;
提示信
;
息数据
CRLFDB0DH,0AH,'
回车,换行,显示数据
CHARLABELBYTE;
输入,缓冲区结构
CHARHDB60;
缓冲区大小
CHARNDB?
字符计数
CHARFDB60DUP(?
);
缓冲区空间
BEGINPROCFAR
AGAIN:
LEADX,PROMPT;
以09H号功能显示提示信息
MOVAH,9
LEADX,CHAR;
以0AH功能输入一个以CR为结束
符的字符串,存入缓冲区,否则排序并显示
MOVAH,0AH
MOVCL,CHARN
ORCL,CL
JZDONE
CALLSORT
JMPAGAIN
DONE:
RET
SORTPROCNEAR
XORCH,CH
MOVBX,CX
MOVSI,OFFSETCHARF
MOVBYTEPTR[SI+BX],'
BIGLOOP:
MOVAL,[SI]
DECCX
JCXZEXIT
PUSHCX
PUSHSI
SMALLOOP:
CMPAL,[SI]
JBENEXT
XCHGAL,[SI]
NEXT:
INCSI
LOOPSMALLOOP
POPSI
MOV[SI-1],AL
POPCX
JMPBIGLOOP
EXIT:
MOVDX,OFFSETCRLF
MOVDX,OFFSETCHARF
SORTENDP
实验五循环程序设计
3、掌握BCD码调整原理。
4、掌握用DOS系统调用输出压缩BCD码的方法
用压缩BCD码编程实现从键盘输入n值,然后在屏幕上输出1+2+3+⋯n的值(n<
=99)。
循环程序在编写时有哪些注意点。
编程提示:
1.本程序不用数据段,也不需要段地址装填。
2.两次1号DOS系统调用接收2位十进制数。
拼接成2位非压缩BCD码。
3.用AAD指令转换成二进制数后送CX作为循环次数。
4.只能用AL寄存器作为累加器才能进行DAA调整。
5.用AH接收累加的进位,也需要调整,可以用交换指令与AL交换,处理完成后再换回来。
6.每次循环加数增1也需要调整。
7.运算结果是两字节压缩BCD码,可用循环移位的方法逐位送入DL寄存器后转换成ASCII码,用2号DOS系统调用显示在DOS窗口。
参考程序代码:
CSEGSEGMENT
CSEG
MOVAH,1
ANDAL,0FH
MOVBL,AL
MOVCL,8
SHLBX,CL
MOVAX,BX
AAD
MOVCX,AX
XORAX,AX
MOVBL,0
P1:
XCHGBL,AL
INCAL
DAA
XCHGBL,AL
ADDAL,BL
XCHGAH,AL
ADCAL,0
LOOPP1
MOVBX,AX
MOVAH,02H
MOVDL,0DH
MOVDL,0AH
MOVCX,4
P2:
ROLBX,1
ROLBX,1
MOVDL,BL
ANDDL,0FH
ADDDL,30H
LOOPP2
MOVAH,4CH
CSEGENDS
以下是Debug命令列表:
?
显示Debug命令列表。
a汇编8086/8087/8088记忆码。
c比较内存的两个部分。
d显示部分内存的内容。
e从指定地址开始,将数据输入到内存。
f使用指定值填充一段内存。
g运行在内存中的可执行文件。
h执行十六进制运算。
i显示来自特定端口的1字节值。
l将文件或磁盘扇区内容加载到内存。
m复制内存块中的内容/n为l或w命令指定文件,或者指定正在测试的文件的参数。
o向输出端口发送1个字节的值。
p执行循环、重复的字符串指令、软件中断或子例程。
q停止Debug会话。
r显示或改变一个或多个寄存器。
s在部分内存中搜索一个或多个字节值的模式。
t执行一条指令,然后显示所有寄存器的内容、所有标志的状态和Debug下一步要执行的指令的解码形式。
u反汇编字节并显示相应的原语句。
w将被测试文件写入磁盘。
xa分配扩展内存。
xd释放扩展内存。
xm映射扩展内存页。
xs显示扩展内存的状态。
所有Debug命令都接受参数,除了q命令之外。
可以用逗号或空格分隔参数,但是只有在两个十六进制值之间才需要这些分隔符。
因此,以下命令等价:
dcs:
100110
dcs:
d,cs:
100,110
Debug命令中的address参数指定内存位置。
Address是一个包含字母段记录的二位名称或一个四位字段地址加上一个偏移量。
可以忽略段寄存器或段地址。
a,g,l,t,u和w命令的默认段是CS。
所有其他命令的默认段是DS。
所有数值均为十六进制格式。
有效地址如下:
CS:
0100
04BA:
在段名和偏移量之间要有冒号。
Debug命令中的range参数指定了内存的范围。
可以为range选择两种格式:
起始地址和结束地址,或者起始地址和长度范围(由l表示)。
例如,下面的两个语法都可以指定从CS:
100开始的16字节范围:
cs:
10010f
100l10
Debug子命令
选择Debug命令以获得详细信息。
Debug:
A(汇编)Debug:
C(比较)Debug(转储)Debug:
E(键入)Debug:
F(填充)Debug:
G(转向)Debug:
H(十六进制)Debug:
I(输入)Debug:
L(加载)Debug:
M(移动)Debug:
N(名称)Debug:
O(输出)Debug:
P(执行)Debug:
Q(退出)Debug:
r(寄存器)Debug:
s(搜索)Debug:
T(跟踪)Debug:
U(反汇编)Debug:
W(写入)Debug:
XA(分配扩展内存)Debug:
XD(取消分配扩展内存)Debug:
XM(映射扩展内存页)Debug:
XS(显示扩展内存状态)
***********************Debug子命令******************************
A(汇编)
直接将8086/8087/8088记忆码合并到内存。
该命令从汇编语言语句创建可执行的机器码。
所有数值都是