湘南学院级汇编教案2.docx
《湘南学院级汇编教案2.docx》由会员分享,可在线阅读,更多相关《湘南学院级汇编教案2.docx(97页珍藏版)》请在冰豆网上搜索。
湘南学院级汇编教案2
要求:
1、在汇编语言之前,首先要熟悉一些常见术语、概念以及硬件知识等等。
2、学习内容
第1~2章 数制、码制、硬件组成及原理
第3~4章 编程工具:
指令系统、寻址方式、伪操作、汇编语言格式
第5~9章 编程方法:
循环、分支、子程序、宏汇编、中断、I/O程序设计方法、BIOS和DOS系统功能调用方法、多模块连接技术等等。
第10~11章 实际应用:
图形显示、发声、磁盘文件存取
注:
第1~9章授课,10~11章则结合实验由学生自学并上机。
本讲义主要针对8086/8088(包含8位、16位寄存器,不包含32位寄存器),
所需课时数:
课内:
理论课:
48学时
上机课:
16学时
课内:
课外=1:
1.5
汇编语言与机器语言相比较,优点为:
1)程序易编制,出错机会少,容易调试
2)算法刻画细致
3)程序紧凑,占用内存空间少,执行速度快
4)能充分发挥计算机的硬件功能
缺点:
1)计算机不能直接认识、执行,须经汇编变为机器语言程序。
2)通用性差(即在某一类型机上能运行的汇编程序可能不能在别的类型机上运行,因为不同系列机的指令系统不一样,硬件结构也可能有差别)。
汇编语言的学习方法:
1)要对计算机硬件组成及原理有一定的了解,比如:
80X86寄存器组(寄存器的名称、作用及用法)、内存的编址及分段技术、
2)从模仿开始,注重上机实践。
汇编语言不同于其它高级语言,汇编语言的程序结构(模式)和指令格式有其独特性。
开始接触汇编语言,难免会感到陌生和困难。
不妨先阅读一些经典程序,从模仿(编程)开始,慢慢熟悉汇编语言的上机过程、它的程序模式和指令格式的特点,等到掌握了80x86的指令系统(总共一百多条常用指令)后,就可以随心所欲地用汇编语言进行编程了。
3)注重学习能力的培养
编程过程中遇到什么问题,要尝试自己去调试,并不断总结经验。
另外,不可拘泥教材,要多参考其它版本的汇编语言教材。
4)从量变到质变
学习汇编语言,必须有意识地编写一定数量的程序,必须认真调试大量的程序,有量变才有质变,除此之外,别无它法。
需要提醒同学们的是,我们的上机课时总共只有16课时,这是远远不够的。
课外多去416机房进行编程练习是有益且必要的。
冰冻三尺,非一日之寒
水滴石穿,非一日之功
先来看几个源程序:
例1
Copy40a.asm
把从源地址(DS:
SI)开始的40个‘a’,复制到目标地址(ES:
DI)开始的40个字节中。
程序如下:
datasegment
s_bufferdb40dup('a')
dataends
extrasegment
d_bufferdb40dup(?
)
extraends
codesegment
assumecs:
code,ds:
data,es:
extra
start:
movax,data
movds,ax
movax,extra
moves,ax
leasi,s_buffer
leadi,d_buffer
cld
movcx,40
repmovsb
ret
int21h
movah,4ch
codeends
endstart
例2计算y=5x-2(令x=7)
5x-2.asm
程序如下:
dsegsegment
xdb7
ydw?
dsegends
ssegsegmentstack
stkdb20dup(0)
ssegends
csegsegment
assumecs:
cseg,ds:
dseg,ss:
sseg
start:
movax,dseg
movds,ax
movax,sseg
movss,ax
movsp,sizestk
moval,x
movbl,5
imulbl
subax,2
movy,ax
int21h
movah,4ch
csegends
endstart
以上程序中每条指令的功能,等我们学习完指令系统后,自然就明白了。
汇编语言的上机环境:
为运行汇编语言程序,磁盘里至少要有如下文件:
1)编辑程序,如edit.exe。
当然如果没有这个文件,用记事本编辑汇编语言源程序也是可以的,只不过源程序的扩展名为.asm,切记。
2)汇编程序,如masm.exe
3)连接程序,如Link.exe
4)调试程序,如Debug.exe(或)
我们使用的是masm5.0,masm5.0中有masm.exe和Link.exe,但不包含edit.exe、Debug.exe(或),为此,可以在自己的计算机上搜索Debug.exe,找到后把Debug.exe备份与masm.exe、Link.exe放在一起。
比如,我们可以把masm.exe、Link.exe、Debug.exe等等环境文件放在C:
>\masm5\目录下。
汇编语言的上机过程:
汇编语言并不能被计算机直接识别和执行,为此,用汇编语言编写的源程序(后缀为.asm)必须先汇编成目标文件(二进制文件,后缀为.obj),再连接形成可执行文件(二进制文件,后缀为.exe),才能被计算机识别和执行。
如前面所述,假设把masm.exe、Link.exe、Debug.exe等环境文件放在C:
>\masm5\目录下。
上机步骤为:
编辑源程序、汇编、连接、运行(或调试)
1)编辑源程序
DOS状态:
edit 例editcopy40a.asm↙(注:
扩展名.asm不可少)
在Windows操作系统中调用DOS的方法:
‘开始’->‘程序’->‘附件’->‘C:
\命令提示符’
C语言状态:
TC 例TCcopy40a.asm↙
Windows状态:
用记事本即可编辑,但要保存为扩展名为.asm的文件。
(注:
如果masm.exe、Link.exe、Debug.exe等环境文件放在C:
>\masm5\目录下。
源程序编辑完成后,也最好保存到C:
>\masm5\目录下。
)
2)汇编(使用masm命令)
例 对copy40a.asm进行汇编
C:
>\masm5\masmcopy40a↙
3)连接(使用link命令)
例 对copy40a.asm进行汇编
C:
>\masm5\linkcopy40a↙
4)运行(或调试)
运行
在DOS状态下,键入文件名回车即可。
例:
C:
>\masm5\copy40a↙
如果程序有显示结果的语句,则结果会显示到屏幕上。
发现有问题,可进一步调试。
(copy40a没有输出语句,所以屏幕上看不到什么东西,)
调试(使用一些常用的debug命令,关于debug命令,后面有介绍)
如例1:
(把从源地址(DS:
SI)开始的40个‘a’,复制到目标地址(ES:
DI)开始的40个字节中。
)
C:
>\masm5\debugcopy40a.exe↙
在短‘-’后可输入debug命令,下图是输入u命令(参见debug命令介绍),回车后的情形。
显示内容为:
代码段段基址:
偏移量 机器指令 机器指令对应的汇编指令
下图是在短‘-’后输入t=0,33(参见debug命令介绍),回车后的情形。
T为单步执行命令,表示从代码段下面偏移量为0处开始执行,执行33h(相当于十进制的51)条指令后停止,并显示当前寄存器的状态和下一条将要执行的指令。
在‘-’提示符后输入t=0,33时,为什么是33h(即十进制的51)条指令呢?
我们返回源程序去看看就清楚了。
循环指令‘repmovsb’前面共有11条指令要执行,而movsb总共要重复执行40次(次数由循环计数器cx指定)。
所以执行51条指令后,任务完成。
输入t命令时,要执行指令的数目用16进制数表示,所以是33。
任务完成后,可以通过d命令,查看附加段(也是内存的一个存储区域)下面是否已经有了40个‘a’,如下图所示,在‘-’提示符后输入-d0baa:
0,28↙
其中0baa:
0,表示起始地址,即附加段的开始(由上图知附加段段基址es=0baa),28是16进制数,结束地址,由目标变址寄存器DI=0028可知。
意思是查看附加段下面偏移量从0到28h之间的数个单元的内容。
输入d0baa:
0,28↙后如下图所示:
左边显示为ES:
DI形式,中间显示附加段指定单元的ASCⅡ码值(存储的内容为‘a’,61即为‘a’的ASCⅡ码值),右边为‘字符形式’显示,ASCⅡ码值为61的字符为a。
输入q命令可退出debug,返回到DOS命令状态。
以上,就是汇编语言的上机过程。
同学们可以用例2来尝试一下,看能不能用debug命令看到结果。
(提示:
1、可用记事本编写源程序,并以.asm类型文件保存到环境目录下,如C:
>\masm5\
2、用masm命令对源程序进行汇编
3、用link命令进行连接
4、用debug的u命令、t命令、d命令进行调试运行并查看内存单元的内容(因为结果就保存在内存单元))。
Debug(调试)常用命令
C:
>\masm5\debugcopy40a.exe
在键盘上键入如上命令,就将指定的可执行文件从磁盘调入到内存。
Debug将程序装入完毕后,提示短杠‘-’,我们可输入命令进行调试。
Debug常用命令如下:
1)A汇编
功能:
直接输入汇编语句,汇编之后存入到内存中。
格式:
A[地址]
说明:
命令参数[地址]指出汇编之后的机器码存储的起始地址。
地址表示为逻辑地址的形式,即段地址:
偏移量的形式,其中段地址可由DS,ES,CS,SS等表示,缺省为CS,段地址和偏移量都省略时,缺省为CS:
IP。
在进入该命令后,debug用地址提示用户输入程序语句,每输入一句,debug提示下一地址。
在debug的地址提示下按回车即可从该命令退出。
2)U反汇编
功能:
将内存中的机器码程序以指令助记符的形式显示出来。
格式:
U[起始地址,结束地址]
说明:
结束地址省略时,debug则反汇编十几条指令;两地址均省略时,则从上一次u命令结束地址开始反汇编。
若以前没用u命令,则从CS:
IP开始反汇编。
段基址隐含为CS,结束地址只允许用偏移量。
3)T单步执行
功能:
执行一条或数条指令后停止,并将所有寄存器的内容和下一条要执行的指令显示出来。
格式:
T[=地址][,计数]
说明:
[地址]省略时,从CS:
IP开始;[计数]为执行指令的条数(写成16进制数)
4)P单步执行
说明:
P命令的格式与T命令完全相同,功能亦基本相同,只是在遇到call,int指令时,p命令不跟踪到子程序(中断服务程序)中去,在遇到loop,loopz/loope,loopnz/loopne,rep等与重复有关的指令时,一次执行完毕。
5)G执行
功能:
连续执行指令直至遇到断点后停止,并将所有寄存器的内容和下一条要执行的指令显示出来。
格式:
G[=地址][,断点][,断点][,断点][,……]
说明:
[地址]省略时,从CS:
IP开始执行,段基址隐含为CS;[断点]为G命令执行停止的地址。
6)R显示或修改寄存器内容
功能:
显示或修改寄存器内容
格式:
R[寄存器]
说明:
[寄存器]为16位寄存器名,省略时,显示所有寄存器内容及下一条要执行的指令。
当R带有参数时,则只显示指定寄存器的内容,显示之后,等待用户输入新值替换原值。
对标志寄存器f的显示和修改较为特殊,显示格式为:
标志位名称
状态
标志位名称
状态
标志=1
标志=0
标志=1
标志=0
溢出标志OF
OV