汇编语言程序设计教案.docx
- 文档编号:11180638
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:40
- 大小:37.47KB
汇编语言程序设计教案.docx
《汇编语言程序设计教案.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计教案.docx(40页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计教案
《汇编语言程序设计》教案
编号:
1
第一章基础知识
教学目的:
(1)了解机器语言
(2)理解汇编语言的涵义
(3)理解8086CPU硬件系统结构
教学重点及难点:
汇编语言的涵义,CPU对存储器的读写原理,内存地址空间的分配
教学方法:
讲授、示例、练习
教学过程:
1.提出三个问题
⏹什么是汇编语言
⏹为什么学汇编语言
⏹如何学习汇编语言
2.介绍本书内容结构及特点
3.教学内容
引言
⏹汇编语言是直接在硬件之上工作的编程语言,首先要了解硬件系统的结构,才能有效的应用汇编语言对其编程。
1.1机器语言
⏹机器语言是机器指令的集合。
⏹阐述机器语言的原理,发展及弊端。
1.2汇编语言的产生
⏹汇编语言的主体是汇编指令。
⏹汇编指令是机器指令的助记符(两者一一对应)。
1.3汇编语言的组成
⏹汇编语言由以下3类组成:
⏹1、汇编指令(机器码的助记符)
⏹2、伪指令(由编译器执行)
⏹3、其它符号(由编译器识别)
⏹汇编语言的核心是汇编指令,它决定了汇编语言的特性。
1.4存储器
⏹CPU是计算机的核心部件.它控制整个计算机的运作并进行运算,要想让一个CPU工作,就必须向它提供指令和数据。
⏹指令和数据在存储器中存放,也就是平时所说的内存。
1.5指令和数据
⏹指令和数据是应用上的概念。
⏹在内存或磁盘上,指令和数据没有任何区别,都是二进制信息。
1.6存储单元
⏹存储器被划分为若干个存储单元,每个存储单元从0开始顺序编号;
⏹例如:
一个存储器有128个存储单元,编号从0~127。
⏹存储器的计量单位B、KB、MB、GB、TB
1.7CPU对存储器的读写
⏹CPU要想进行数据的读写,必须和外部器件(标准的说法是芯片)进行三类信息的交互:
⏹存储单元的地址(地址信息)——地址总线
⏹器件的选择,读或写命令(控制信息)——数据总线
⏹读或写的数据(数据信息)——数据总线
⏹CPU在内存中读或写的数据演示:
读演示、写演示
Ø机器码:
10
Ø对应的汇编指令:
MOVAX,[3]
Ø含义:
传送3号单元的内容到AX
1.8地址总线
⏹CPU是通过地址总线来指定存储单元的。
⏹一个CPU有N根地址总线,则可以说这个CPU的地址总线的宽度为N。
⏹这样的CPU最多可以寻找2的N次方个内存单元。
1.9数据总线
⏹CPU与内存或其它器件之间的数据传送是通过数据总线来进行的。
⏹数据总线的宽度决定了CPU和外界的数据传送速度。
1.10控制总线
⏹CPU对外部器件的控制是通过控制总线来进行的。
在这里控制总线是个总称,控制总线是一些不同控制线的集合。
⏹有多少根控制总线,就意味着CPU提供了对外部器件的多少种控制。
所以,控制总线的宽度决定了CPU对外部器件的控制能力。
1.11内存地址空间(概述)
⏹什么是内存地址空间
⏹不同的计算机系统的内存地址空间分配情况是不同的。
⏹讲解8086PC机内存地址空间分配的基本情况
作业:
《汇编语言程序设计》教案
编号:
2
第二章寄存器
教学目的:
(1)理解通用寄存器的逻辑结构及其存储原理
(2)理解物理地址、段地址及偏移地址的本质含义
(3)理解8086CPU读取执行指令的工作原理,及代码段寄存器CS和指令指针寄存器IP的含义,并掌握其使用方法
教学重点及难点:
8086CPU读取执行指令的工作原理,及代码段寄存器CS和指令指针寄存器IP的使用方法
教学方法:
讲授、示例、练习
教学过程:
1.CPU概述
⏹一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连。
⏹内部总线实现CPU内部各个器件之间的联系。
⏹外部总线实现CPU和主板上其它器件的联系。
2.寄存器概述
⏹8086CPU有14个寄存器它们的名称为:
AX、BX、CX、DX、SI、DI、SP、BP、
IP、CS、SS、DS、ES、PSW。
3.教学内容
2.1通用寄存器
⏹8086CPU所有的寄存器都是16位的,可以存放两个字节。
⏹AX、BX、CX、DX通常用来存放一般性数据被称为通用寄存器。
⏹讲解寄存器的逻辑结构。
⏹为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。
2.2字在寄存器中的存储
⏹一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。
2.3几条汇编指令
汇编指令不区分大小写
注意:
在进行数据传送或运算时,要注意指令的两个操作对象的位数应当是一致的。
2.4物理地址
⏹CPU访问内存单元时要给出内存单元的地址。
所有的内存单元构成的存储空间是一个一维的线性空间。
每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。
2.516位结构的CPU
⏹概括的讲,16位结构描述了一个CPU具有以下几个方面特征:
⏹1、运算器一次最多可以处理16位的数据。
⏹2、寄存器的最大宽度为16位。
⏹3、寄存器和运算器之间的通路是16位的。
2.68086CPU给出物理地址的方法
⏹8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
⏹地址加法器合成物理地址的方法:
物理地址=段地址×16+偏移地址
2.7“段地址×16+偏移地址=物理地址”的本质含义
⏹用两个比喻说明
2.8段的概念
⏹错误认识:
内存被划分成了一个一个的段,每一个段有一个段地址。
⏹其实:
内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。
⏹两点需要注意
(1)段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;
(2)偏移地址为16位,16位地址的寻址能力为64K,所以一个段的长度最大为64K。
⏹结论:
CPU可以用不同的段地址和偏移地址形成同一个物理地址。
2.9节~2.12节
⏹1、段地址在8086CPU的寄存器中存放。
当8086CPU要访问内存时,由段寄存器提供内存单元的段地址。
8086CPU有4个段寄存器,其中CS用来存放指令的段地址。
⏹2、CS存放指令的段地址,IP存放指令的偏移地址。
8086机中,任意时刻,CPU将CS:
IP指向的内容当作指令执行。
⏹3、8086CPU的工作过程:
(1)从CS:
IP指向内存单元读取指令,读取的指令进入指令缓冲器;
(2)IP指向下一条指令;
(3)执行指令。
(转到步骤
(1),重复这个过程。
)
⏹4、8086CPU提供转移指令修改CS、IP的内容。
作业:
《汇编语言程序设计》教案
编号:
3
第三章寄存器(内存访问)
教学目的:
(1)掌握汇编指令访问内存的方法
(2)理解汇编指令mov、add、sub的格式及含义,并掌握其使用方法
(3)理解CPU的堆栈机制,掌握汇编指令push、pop的含义及其使用方法
(4)理解数据段、代码段、栈段的内涵
教学重点及难点:
汇编指令访问内存的方法,汇编指令格式,及堆栈机制
教学方法:
讲授、示例、练习
教学过程:
1.引言
在第2章中,我们主要从CPU如何执行指令的角度讲解了8086CPU的逻辑结构、形成物理地址的方法、相关的寄存器以及一些指令。
这一章中,我们从访问内存的角度继续学习几个寄存器。
2.教学内容
3.1内存中字的存储
结论:
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和低位字节单元。
3.2DS和[address]
CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址;
在8086PC中,内存地址由段地址和偏移地址组成。
8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。
问题:
如何用mov指令从10000H中读取数据?
结论:
movbx,1000H
movds,bx
moval,[0]
注意:
8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器。
(硬件设计的问题)movds,1000H是非法的。
3.3字的传送
因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是一次性传送一个字。
3.4mov、add、sub指令
已学mov指令的几种形式:
mov寄存器,数据
mov寄存器,寄存器
mov寄存器,内存单元
mov内存单元,寄存器
mov段寄存器,寄存器
根据已知指令进行推测:
mov段寄存器,寄存器
mov寄存器,段寄存器(验证)
mov内存单元,寄存器
mov内存单元,段寄存器
mov段寄存器,内存单元
注意:
add和sub指令同mov一样,都有两个操作对象。
3.5数据段
定义:
将一组长度为N(N≤64K)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。
访问数据段中的数据:
用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。
示例
3.6栈
栈是一种具有特殊的访问方式的存储空间。
它的特殊性就在于,最后进入这个空间的数据,最先出去。
栈有两个基本的操作:
入栈和出栈。
入栈:
将一个新的元素放到栈顶;
出栈:
从栈顶取出一个元素。
栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。
栈的操作规则:
LIFO(LastInFirstOut,后进先出)
3.7CPU提供的栈机制
8086CPU提供入栈和出栈指令:
(最基本的)
PUSH(入栈)POP(出栈)
pushax:
将寄存器ax中的数据送入栈中;
popax:
从栈顶取出数据送入ax。
注意:
8086CPU的入栈和出栈操作都是以字为单位进行的。
push指令的执行过程:
pushax
(1)SP=SP–2;
(2)将ax中的内容送入SS:
SP指向的内存单元处,SS:
SP此时指向新栈顶。
pop指令的执行过程:
popax
(1)将SS:
SP指向的内存单元处的数据送入ax中;
(2)SP=SP+2,SS:
SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
3.8栈顶超界的问题
当栈满的时候再使用push指令入栈,栈空的时候再使用pop指令出栈,都将发生栈顶超界问题。
栈顶超界是危险的。
我们在编程的时候要自己操心栈顶超界的问题,要根据可能用到的最大栈空间,来安排栈的大小,防止入栈的数据太多而导致的超界;执行出栈操作的时候也要注意,以防栈空的时候继续出栈而导致的超界。
3.9push、pop指令
push和pop指令的格式
(1)
push寄存器:
将一个寄存器中的数据入栈
pop寄存器:
出栈,用一个寄存器接收出栈的数据
push和pop指令的格式
(2)
push段寄存器:
将一个段寄存器中的数据入栈
pop段寄存器:
出栈,用一个段寄存器接收出栈的数据
push和pop指令的格式(3)
push内存单元:
将一个内存单元处的字入栈(栈操作都是以字为单位)
pop内存单元:
出栈,用一个内存字单元接收出栈的数据
3.10栈段
定义:
将长度为N(N≤64K)的一组地址连续、起始地址为16的倍数的内存单元,当作栈来用,从而定义了一个栈段。
访问:
如何使用如push、pop等栈操作指令访问我们定义的栈段呢?
将SS:
SP指向我们定义的栈段。
3、段的综述
我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。
这完全是我们自己的安排。
我们可以用一个段存放数据,将它定义为“数据段”;
我们可以用一个段存放代码,将它定义为“代码段”;
我们可以用一个段当作栈,将它定义为“栈段”;
一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。
关键在于CPU中寄存器的设置,即:
CS、IP、SS、SP、DS的指向。
作业:
《汇编语言程序设计》教案
编号:
4
第四章第一个程序
教学目的:
(1)掌握源程序书写格式
(2)理解一个源程序从写出到执行的过程
(3)掌握程序的执行过程及其跟踪方法
教学重点及难点:
汇编语言源程序的书写格式,执行过程及跟踪方法
教学方法:
讲授、示例、练习
教学过程:
4.1一个源程序从写出到执行的过程
编写源程序——>编译——>链接——>执行
注意:
解释可执行文件
4.2源程序
汇编指令:
有对应的机器码的指令,可以被编译为机器指令,最终为CPU所执行。
1.伪指令
没有对应的机器码的指令,最终不被CPU所执行。
3种伪指令
(1)段定义伪指令segment和ends
(2)汇编结束伪指令END
(3)ASSUME段分配伪指令
2.标号:
一个标号指代了一个地址。
(代表某一存储单元地址的名字)
字母:
A~Z数字:
0~9特殊字符:
?
.@_$
codesg:
放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。
start:
放在某个指令前,作为程序的入口,程序加载到内存后,CS:
IP会指向这个标号,从start指向的指令开始运行。
3.源程序中的“程序”
汇编源程序:
伪指令(编译器处理)、汇编指令(编译为机器码)
程序:
源程序中最终由计算机执行、处理的指令或数据。
4.汇编语言源程序的结构
一般来说,一个完整的汇编源程序应由三个程序段组成,即代码段、数据段和堆栈段,每个段都以SEGMENT开始,以ENDS结束,代码段包含程序要执行的指令;堆栈段用来在内存中建立一个堆栈区;数据段用来在内存中建立一个适当容量的工作区,以存放程序中所需的数据。
注意:
一个源程序中,代码段是必须的,而数据段和堆栈段可以没有或有其中一个。
段定义时一般最后定义代码段。
5.程序返回
我们的程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中,那么,它怎样得到运行呢?
(讨论)
现在,我们知道,一个程序结束后,将CPU的控制权交还给使它得以运行的程序,我们称这个过程为:
程序返回。
应该在程序的末尾添加返回的程序段。
movax,4c00H
int21H
注意:
几个和结束相关的内容:
段结束、程序结束、程序返回
6.语法错误和逻辑错误
语法错误:
程序在编译时被编译器发现的错误;容易发现。
逻辑错误:
程序在编译时不能表现出来的、在运行时发生的错误;不容易发现。
4.3.编辑源程序
使用工具:
可使用各种文本编辑工具(记事本、写字板、WORD等),我们使用notepad++文本编辑器。
功能:
产生一个存储源程序的文本文件。
使用方法:
输入汇编源程序并保存为.asm文件。
4.4对源程序进行编译
使用工具:
使用MASM6.15编译器
功能:
使用编译器对源程序文件进行编译,生成包含机器代码的目标文件(.obj)。
使用方法:
在dos下运行masm.exe程序
对源程序的编译结束,编译器输出的最后两行告诉我们这个源程序有没有警告错误和必须要改正的错误。
4.5对目标文件进行连接
使用工具:
使用LINK.EXE连接器
功能:
对目标文件(.obj)进行连接,从而得到一个可执行文件.EXE。
使用方法:
在DOS下运行link.exe程序:
注意讲解连接的作用
4.6以简化的方式进行编译和连接
用一种较为简捷的方式进行编译、连接。
C:
\MASM\masmXXX;
C:
\MASM\linkXXX;
C:
\MASM\mlXXX.asm;
4.71.exe的执行
提问:
程序到底运行没有?
程序运行了,只是从屏幕上不可能看到任何运行结果。
我们的程序没有像显示器输出任何信息。
程序只是做了一些将数据送入寄存器和加法的操作,而这些事情,我们不可能从显示屏上看出来。
程序执行完成后,返回,屏幕上再次出现操作系统的提示符。
4.8谁将可执行文件中的程序装载进入内存并使它运行?
1.exe的执行过程:
(1)我们在提示符“C:
\masm>ml1.asm”,按Enter键。
(编译连接)
(2)1.exe中的程序运行;问题4.1
(3)运行结束,返回,再次显示提示符“C:
\masm”。
问题4.2
两个问题
问题4.1:
执行第
(2)步操作,有一个正在运行的程序将1.exe中的程序加载入内存,这个正在运行的程序是什么?
它将程序加载入内存后,如何使程序得以运行?
问题4.2:
执行第(3)步操作,程序运行结束后,返回到哪里?
回答问题4.1和4.2
(1)我们在DOS中直接执行1.exe时,是正在运行的command将1.exe中的程序加载入内存。
(2)command设置CPU的CS:
IP指向程序的第一条指令(即程序的入口),从而使程序得以运行。
(3)程序运行结束后,返回到command中,CPU继续运行command。
4.9程序执行过程的跟踪
使用工具:
debug
功能:
观察程序的运行过程(Debug可以将程序加载入内存,设置CS:
IP指向程序的入口,但Debug并不放弃对CPU的控制,这样,我们就可以使用Debug的相关命令来单步执行程序,查看每条指令指令的执行结果。
)
使用方法:
在DOS下运行DEBUG.EXE程序。
C:
\debugxxx.exe(后缀不能省略)
作业:
《汇编语言程序设计》教案
编号:
5
第五章[bx]和loop指令
教学目的:
(1)理解汇编语言的循环结构
(2)掌握[bx]和loop联合使用访问内存实现循环结构的方法
(3)掌握汇编指令loop的格式,理解其工作原理
(4)掌握段前缀的使用
教学重点及难点:
[bx]和loop联合使用实现循环结构,及loop指令的工作原理
教学方法:
讲授、示例、练习
教学过程:
1、几个概念
1.[bx]和内存单元的描述
2.loop:
英文单词“loop”有循环的含义,显然这个指令和循环有关。
3.描述性符号“()”:
为了描述上的简洁,在以后的课程中,我们将使用一个描述性的符号“()”来表示一个寄存器或一个内存单元中的内容。
4.约定符号idata表示常量
2、教学内容
5.1[bx]
下面指令的功能:
movax,[bx]
功能:
bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:
EA处的数据送入ax中。
即:
(ax)=((ds)*16+(bx));
mov[bx],ax
功能:
bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:
EA处。
即:
(ds*16+(bx))=(ax)。
5.2Loop指令(循环控制指令)
格式:
loop标号
CPU执行loop指令的时候,要进行两步操作:
①(cx)=(cx)-1;
②判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
注意:
loop循环中用CX作计数器控制程序的循环次数。
补充:
通用寄存器:
AX:
Accumulator累加器
常用于存放算术逻辑运算中的操作数
BX:
Baseregister基址寄存器
常用来存放访问内存时的基址(段地址)
CX:
Countregister计数器
在循环和串操作指令中用作计数器
DX:
Dataregister一般数据寄存器
在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
5.3在Debug中跟踪用loop指令实现的循环程序
示例:
计算ffff:
0006单元中的数乘以3,结果存储在dx中。
分析:
(1)运算后的结果是否会超出dx所能存储的范围?
(2)我们用循环累加来实现乘法,用哪个寄存器进行累加?
(3)ffff:
0006单元是一个字节单元,ax是一个16位寄存器,数据长度不一样,如何赋值?
5.4Debug和汇编编译器Masm对指令的不同处理
示例任务:
将内存2000:
0、2000:
1、2000:
2、2000:
3单元中的数据送入al,bl,cl,dl中。
(1)在Debug中编程实现
(2)汇编程序实现
5.6段前缀
在访问内存单元的指令中,用于显式地指明内存单元的段地址的“段寄存器:
”(ds:
、cs:
、ss:
或es:
),在汇编语言中称为段前缀。
5.7一段安全的空间
在8086模式中,随意向一段内存空间写入内容是很危险的,因为这段空间中可能存放着重要的系统数据或代码。
汇编语言程序直接面向机器,如果我们要向内存空间写入数据时,要保证所写入的内存中没有重要的数据,否则会影响系统的正常运行,在一般的PC机中都不使用0:
200~0:
2ff(00200h~002ffh)这段256个字节内存空间,所以我们可以放心使用这段安全的空间。
5.8段前缀的使用
将内存ffff:
0~ffff:
b段元中的数据拷贝到0:
200~0:
20b单元中。
作业:
《汇编语言程序设计》教案
编号:
6
第六章包含多个段的程序
教学目的:
(1)理解在代码段中使用数据的原理及不便之处
(2)理解在代码段中使用栈的原理及不便之处
(3)掌握将数据、代码、栈放入不同的段的应用
教学重点及难点:
将数据、代码、栈放入不同的段的应用
教学方法:
讲授、示例、练习
教学过程:
1、引言
前面我们写的程序中,只有一个代码段。
现在有一个问题是:
如果程序需要用其他空间来存放数据,我们使用哪里呢?
我们将以这样的顺序来深入地讨论多个段的问题:
(1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况;
(2)将数据、代码、栈放入不同的段中。
6.1在代码段中使用数据
(将数据定义在代码段中)
示例:
编程计算以下8个数据的和,结果存在ax寄存器中:
0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。
6.3将数据、代码、栈放入不同的段
在前面的内容中,我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。
我们在编程的时候要注意何处是数据,何处是栈,何处是代码。
这样做显然有两个问题:
(1)把它们放到一个段中使程序显得混乱;
(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。
但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。
所以,我们应该考虑用多个段来存放数据、代码和栈。
作业:
《汇编语言程序设计》教案
编号:
7
第七章更灵活的定位内存地址的方法
教学目的:
(1)掌握汇编逻辑运算指令and和or的格式及含义
(2)理解字符串大小写转换问题,并掌握其实现方法
(3)掌握内存的寻址方式,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 教案