微机原理4.docx
- 文档编号:26387360
- 上传时间:2023-06-18
- 格式:DOCX
- 页数:40
- 大小:83.13KB
微机原理4.docx
《微机原理4.docx》由会员分享,可在线阅读,更多相关《微机原理4.docx(40页珍藏版)》请在冰豆网上搜索。
微机原理4
第四章汇编语言程序设计
红河学院工学院
教学重点、难点:
●汇编程序的基本格式,常用运算符(如取值、属性)的使用方法
●定义数据,定义符号、段定义、过程定义、设定段寄存器、定位、汇编结束和开始
●分支程序和循环程序设计
●循环程序设计和子程序设计
教学方法、手段:
●多媒体教学
●动画演示
●讲授
●课外作业
教学基本内容:
第四章汇编语言程序设计
4汇编语言程序设计
4.1汇编语言的基本元素
汇编语言的语句格式、汇编语言的运算符、表达式、汇编语言程序汇编步骤
4.2伪指令
定义数据伪指令、符号定义伪指令、段定义伪指令、设定段寄存器伪指令、定义过程的伪指令、宏、ORG、END
4.3汇编程序设计简单程序设计
分支程序设计和循环程序设计
4.3汇编程序设计简单程序设计
子程序设计
教学目标:
●了解汇编的概念及其方法
●掌握汇编程序的基本格式,常用运算符的使用方法,汇编的步骤
●要求学生了解伪指令的功能,掌握定义数据,定义符号、段定义、过程定义指令的使用方法,能编写格式正确的汇编程序
●要求学生掌握汇编程序设计的方法
●能编制常用的汇编程序
●要求学生掌握汇编程序设计的方法
4.1汇编语言的基本语法
4.1.1汇编语言程序的格式
例:
功能:
求10个字节数据a1-a10之和。
DATASEGMENTAT2000H
ARRAYDBa1,a2,a3,……,a10
CountEQU$-ARRAY
SUMDW
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
STAKDB10DUP(?
)
TOPEQULENGTHSTAK
STACKENDS
备注
红河学院工学院
教学基本内容:
CODESEGMENT
ASSUMENTCS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,0
MOVDI,OFFSETSUM
MOVBX,OFFSETARRAY
MOVCX,COUNT
LOP:
ADDAL,[BX]
ADCAH,0
INCBX
LOOPLOP
MOV[DI],AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
●基本格式和特点
8088汇编语言的源程序是由多个段组成的,一个可执行的汇编程序一般至少有一个代码段,其中包含可执行的语句。
其基本格式如右所示。
其特点如下:
1)分段结构
指令性语句
2)使用语句行
指示性语句
3)必须使用ASSUME语句完成段的指认
4)必须完成段地址寄存器及相关寄存器的初始化。
a)用户初始化:
DS、ES
b)系统初始化:
CS:
IP、SS:
SP
5)有保证正常返回DOS的处理。
●每个段是由语句行构成的。
一个语句行的基本格式为:
a)指令性语句:
[标号:
]操作码[操作数1,操作数2][;注释]
例:
lop:
addal,[bx]
b)指示性语句
[名字/变量]命令参数表[;注释]
例:
datasegmentat2000h
1.标识符
标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。
备注
红河学院工学院
教学基本内容:
2.保留字
保留字是汇编语言中预先保留的特殊字串,只能用于特殊用途,所有8086/8088的指令、伪指令和寄存器名都是保留字。
如AX、MOV、DB、INT、EQU等等。
保留字不能用作标识符
3.界符
界符是用于一个程序或一条指令中不同部分的分隔符,如MOVAX,0010H中的“,”就是界符。
其内容见下表:
8086/8088汇编语言的界符
’;><*,:
[]+-=()$&?
./
4.常量
常量就是指令中的一些不变的数据。
它可以用二进制、十六进制、十进制和八进制表示,也可以用引号引起来的字串。
例如:
二进制:
00011101B
十六进制:
0C5AAH
十进制:
9856D
八进制:
237O
字串:
’The2Xmeans2multipleX’
其中的B、H、D和O为数制的结尾符。
5.注释
注释是用于使程序易于理解的句子,用来表示某行或某段语句的作用或与其它部分的关系,一般写在某语句的后面或某段的开始处,注释的前面由“;”前导,表示后面的内容为注释。
如果一行写不下,换行后也要使用“;”前导。
4.1.2常量、标识符和表达式
1.常量
数字常量例:
10100110B,166Q,6AH,0F3H
字符常量例:
‘dhjkshd’(带单引号的ASCII字符表示)
符号常量例:
ONE=11111111B
MOVAL,ONE;等价于MOVAL,11111111B
2.标识符
标识符由一串字符构成,用于一段程序、一组(或一个)数据或一个段的开头。
使用时要注意以下3点:
●标识符可由数字、字母和下划线、?
、@、$组成;
●不能以数字开头,数字可用在非开头的其它位置;
●?
不能单独作为标识符
●其最大长度为31个字符。
备注
红河学院工学院
教学基本内容:
表达式中的运算符和优先级
3.表达式
表达式由操作数和运算符组成,如3+2、77AND55、NOT5AH等。
1).操作数
操作数用于代表一个数据或一个地址。
2).运算符
运算符包括算术、逻辑、关系、分析、综合五类运算符(p136见表4-1)。
①算术运算符包括+、-、*、/、MOD
参加运算的内容可以是数据,也可以是地址,但在一个算术运算符的两边不能都是地址。
②逻辑运算符包括AND、OR、NOT、XOR
③关系运算符包括相等:
EQ大于:
GT
不等:
NE小于或等于:
LE
小于:
LT大于或等于:
GE
●关系运算结果只有两个——真、假。
如果关系是真,则结果为0FFH(0FFFFH);
如果关系是假,则结果为0。
例如MOVBX,DATA1LT0010HMOVBX,0FFFFH
MOVBX,DATA1LT0010HMOVBX,0
备注
红河学院工学院
教学基本内容:
④分析运算符
分析运算在汇编语言程序设计中很重要。
它包括
取存储单元偏移:
OFFSET
取存储单元段:
SEG
取类型:
TYPE
取字节数:
SIZE
按类型取长度:
LENGTH
TYPE变量/标号变量/标号类型为:
字节(DB)1
字(DW)2
双字(DD)4
8字节(DQ)8
10字节(DT)10
NEAR-1
FAR-2
LENGTH变量只有当数据用DUP定义时,LENGTH才等于数组
的元素个数
SIZE变量SIZE=LENGTH*TYPE
例1:
设有数据段中使用
DATA1DB?
定义了一个单元,则
MOVAL,DATA1
可将DATA1中的数传送到AL中,AL=05
MOVAX,SEGDATA1
可将DATA1的所在段地址传到AX中,AX=2000
MOVAX,OFFSETDATA1
可将DATA1的偏移地址传入AX中,AX=1500
例2:
设有数据段中使用
DATA1DW100DUP(?
)
定义了100个字单元,则
MOVAX,TYPEDATA1AX=2
MOVAX,SIZEDATA1AX=200
MOVAX,LENGTHDATA1AX=100
例3设该段的段地址为2000H
DATASEGMENT
BUF1DBN1,N2,…,N10
BUF2DB10DUP(0)
备注
红河学院工学院
教学基本内容:
BUF3DW10DUP(?
)
DATAENDS
……
MOVAX,SEGBUF1;
MOVDS,AX
MOVSI,OFFSETBUF1
MOVCX,LENGTHBUF2
MOVBL,SIZEBUF3
MOVAL,BUF1
MOVAH,BUF1+2
⑤综合运算符
综合运算符包括两个地址操作符:
PTR、THIS和LABEL。
格式:
类型PTRexp;类型允许WORD、BYTE、DWORD、NEAR、FAR
●PTR——改变存储器地址操作数的操作类型,但其段地址和偏移地址不变。
例1:
重新指定类型:
DATA1DW1234H,5678H
MOVAL,DATA1
MOVAL,BYTEPTRDATA1;(AL)=34H
MOVAX,DATA1;(AX)=1234H
例2:
指定操作数的类型
INC[BX];操作数类型不明确
改为:
INCBYTEPTR[BX]
INCWORDPTR[BX]
例3:
重新定义一个新变量
DATA1DW1234H,5678H
BDATA1EQUBYTEPTRDATA1
●THIS——用来建立新的存储器地址操作数,且不分配存储单元。
新的操作
数类型在THIS中指定,而其段地址和偏移量就是汇编时的当前值。
格式:
THIS类型
例:
DATA1SEGMENT
WBUFFEREQUTHISWORD两语句必须相邻,
BUFFERDB12H,34H,00H,91H且THIS必须在前
DATA1ENDS
CODE1SEGMENT
ASSUMECS:
CODE1,DS:
DATA1
START:
MOVAX,DATA1
MOVDS,AX
备注
红河学院工学院
教学基本内容:
MOVAL,BUFFER
MOVBX,WBUFFER
……
CODE1ENDS
ENDSTART
●LABEL——用来定义其语句中的变量(标号)的类型属性为语句中设定的
类型,此时变量(或标号)的段属性和偏移地址属性由该语句
的位置确定。
格式:
标号/变量LABEL类型
例:
BUFBLABELBYTE两语句必须相邻,
BUFWDW1234H,5678H且LABEL语句必须在前
MOVAX,BUFW;(AX)=1234H
MOVAL,BUFB;(AL)=34H
小结:
1、在使用或访问变量时,必须指定变量的类型属性,即源操作数与目的操作数的类型属性一致,操作合法。
2、可以有多种方法指定、改变变量的类型属性:
PTR可在访问时指定变量属性
THIS,LABEL在变量定义时,指定变量属性
4.1.3指示性语句(伪指令)
在8086/8088汇编语言中伪指令是用于诸如数据定义、存储区分配等功能。
所谓伪指令是非机器指令,它是在汇编期间进行操作的。
一、程序开始和结束语句
在程序的开始可以用NAME或TITLE为程序取名字。
格式为:
NAME程序名
TITLE程序名
整个程序的结束使用END标出,当汇编器读到END时,它认为程序到此就结束了。
在程序中,首条被执行的语句有一个标号,在程序的结尾使用END后跟上这个标号,用以标出这个程序的开始执行处。
注:
NAME、TITLE操作不是必须的。
END则必不可少。
二、段的定义
分段结构是8086/8088的特点,程序和存储器都是按段来组织的,语句有:
SEGMENT、ENDS、ASSUME、ORG。
1.段定义语句
在段定义中,SEGMENT和ENDS总是成对使用的,它们将数据和程序分为多个段,如数据段、栈段和代码段。
2.命令ORG、ASSUME
ASSUME语句紧跟在SEGMENT语句之后,是汇编时进行操作的,它用于在汇编时告诉汇编器,哪个是数据段,哪个是代码段,哪个是栈段。
ORG用于指定目标程序存放单元的起始偏移地址,通常写在第一条源程序的前面,用于指定这段程序的首地址。
如使用了:
ORG1000H
MOVAL,BL
备注
红河学院工学院
教学基本内容:
则程序执行时就从CS:
1000H处开始执行其后面的程序。
(MOV指令所在的内存单元在本段的偏移地址为1000H。
Segment的类型及属性说明——在需要用连接程序将本程序与其它模块相连接时,需要使用这些说明。
Segnamesegment[align_type];定位类型
[combine_type];组合类型
[‘class’];类别
●定位类型:
para:
指定段的起始地址必须从小节边界开始,即段地址的最后1位(十六进制)必须为0。
byre:
该段可以从任何地址开始。
word:
该段必须从字的边界开始,即段地址必须是偶数。
page:
该段必须从页的边界开始,即段地址的最后2位(十六进制)必须为0。
●组合类型:
public:
该段连接时将与有相同名字的其它段连接在一起。
common:
该段在连接时与其它同名分段有相同的起始地址(会产生覆盖)。
atexpression:
使段的起始地址是表达式所指定的16位段地址,但不能指定代码段。
stack:
指定该段在运行时为堆栈段的一部分。
●类别:
连接时用于组成段组的名字。
注意:
①SEGMENT和ENDS前面必须有标号,而且在相互配对的段,它们前面要使用相同的标号。
对于不同的段定义标号,尽管这些标号可以是任意字串,但为了程序的可读性,应使其有一定的意义。
②ASSUME语句可使汇编器知道CS、DS、SS指向哪个段,但它只在汇编时起作用,在运行时CPU并不知道除CS外的其它段地址,所以必须在程序中用指令进行赋值。
③首条被执行的语句有一个标号,在程序的结尾使用END后跟上这个标号,用以标出这个程序的开始执行处。
(只需在主程序的结束语句中写出标号,其他主程序模块的结束语句只需要写出语句END即可。
)
三、过程定义语句
和其它程序设计一样,8086/8088汇编程序设计有过程或子程序的设计方法。
8086/8066汇编程序的过程从运行位置上分为近过程(NEAR)和远过程(FAR),缺省值为NEAR。
其定义如下:
PROC_NAME1PROCNEAR
……
RET
PROC_NAME1ENDP
PROC_NAME2PROCFAR
……
RET
PROC_NAME2ENDP
备注
红河学院工学院
教学基本内容:
过程和其它程序可定义在同一个段中,也可定义在不同的段中。
对过程的调用要使用CALL语句,如:
CALLPROC_NAME1
CALLPROC_NAME2
如果在过程定义中没有写明是NEAR过程或FAR过程,则汇编器将这个过程默认为NEAR过程。
四、符号定义语句EQU
为了使程序便于阅读和修改,我们有时使用一个符号来代表一个值,而符号代表了一定的意义,在程序中使用一个符号代表一个值进行操作,其格式为:
名字EQU表达式
例如:
PORTEQU3F8H
在程序中可使用
MOVDX,PORT
对DX进行赋值,实际上PORT就是一个常量。
例:
DATASEGMENT
ARRAYDB10H,24H,5AH,0C7H,98H,’ABCD’
COUNTEQU$-ARRAY;$-ARRAY=000AH-0000H=10
MAXDB?
DATAENDS
还可在语句中进行运算,如:
DATA_PORTEQU3F8H
STAT_PORTEQU3F8H+2
SEEDEQU10
FUNCEQUSEED*SEED+2*SEED+1
●‘=’号操作:
对符号的赋值还可使用“=”操作,它与EQU的区别是“=”操作可以重复定义,而EQU则不能重复定义。
如:
X=3
Y=6
Y=Y*Y-X
……
MOVAX,Y
通过上述操作,最后使Y=33,后面的MOV语句中,当生成目标代码时将用33取代Y。
即
MOVAX,21H(33D)
五、数据定义语句
数据定义语句用于为数据分配相应的存储单元。
用一个符号名代表一个或一些单元,并可为这个或这些单元提供初始值。
定义数据的操作符有:
字节定义——DB
字定义——DW
备注
红河学院工学院
教学基本内容:
双字定义——DD
四字定义——DQ
十字节定义——DT
重复定义——mDUP(n)_(重复m次个数据n)
与数据相联系的符号名称为变量。
数据定义语句的格式为:
变量名操作符数据项
通过上述定义,在存储器中将产生如图所示的结果,以DATA1到DATA5为例:
例:
DATA1DB?
DATA2DW1000H
DATA3DD3000A455H
DATA4DB4DUP(0)
DATA5DW0120H,0240H,0360H
DATA6DB2DUP(12H,34H,56H)
例:
DATA7DB‘THIS’;同DATA7DB‘T’,’H’,’I’,’S’
DATA8DW‘AB’,’CD’,’C’
DATA9DD‘AB’
注意:
1.数据定义语句在存储器中占有相应的单元,如上面语句中的第二句在程序运行时将会以00和10占据两中存储单元。
而EQU只是定义了一个数据,在汇编后以实际数据的形式体现在程序中。
也就是说,EQU语句不会占有存储单元。
2.EQU可以用在指令中,而数据定义语句不可以。
4.1.4指令性语句
[标号:
]操作码[操作数1,操作数2][;注释]
一、标号
段属性偏移地址属性类型属性(NEAR、FAR)
SEG标号OFFSET标号TYPE标号
例:
程序中有标号ME(NEAR类型)。
若想定义新变量KI,类型为FAR,
而两者的段地址、偏移地址属性相同。
这样段内转移用ME,段间转移用KI,两个标号表示的是同一地址。
1)用PTR重新指定类型
段内调用:
JMPME段间调用:
JMPFARPTRME
2)用EQU和PTR定义新标号
ME:
MOVAX,BX
KIEQUFARPTRME
3)用EQU和THIS定义新标号
KIEQUTHISFAR
ME:
MOVAX,BX
备注
红河学院工学院
教学基本内容:
4)用LABEL定义新标号
KILABELFAR
ME:
MOVAX,BX
4.1.5宏指令
宏指令:
程序员用汇编语言编程是,对于程序中多次重复使用的指令序列可定义一条宏指令,编写程序时就用这条宏指令代替该指令序列,从而简化书写工作。
一、宏定义、宏名字、宏调用和宏展开
宏定义:
宏名字MACRO[形式参数]
……
ENDM
宏调用:
宏名字[实参数]
例1:
无形参的宏指令
宏定义:
SAVMACRO
PUSHAX
PUSHBX
PUSHCX
ENDM
宏调用:
程序……
SAV
……
宏展开:
程序……
PUSHAX
PUSHBX
PUSHCX
……
例2:
带参宏指令
宏定义:
MUMACROOPR1,OPR2,RESULT
PUSHAX
MOVAL,OPR1
IMULOPR2
MOVRESULT,AX
POPAX
ENDM
宏调用:
程序……
MUCL,VAR,XYZ[BX]
……
宏展开:
程序……
PUSHAX
MOVAL,CL
备注
红河学院工学院
教学基本内容:
IMULVAR
MOVXYZ[BX],AX
POPAX
……
二、宏指令与子程序的区别
1)子程序目标程序比宏调用短。
在汇编时,汇编程序将宏指令的宏体代码展开嵌入到程序中的宏调用处,然后转换成机器码生成目标程序。
因此,宏指令只简化了源程序,但并没有简化目标程序;而子程序(过程)通过CALL指令调用,执行子程序时处理器改变CS:
IP使其转子程序处执行,通过RET指令返回主程序,子程序的调用可以简化目标程序.
2)宏指令的执行速度比子程序快.子程序每次调用和返回都要增加额外开销,而宏调用不会。
汇编语言程序的执行过程:
4.2汇编语言程序设计
4.2.1概述
汇编语言程序设计与其它语言的程序设计一样,都要有良好的数据结构和算法,对每个要解决的问题要经过入下步骤:
①分析课题:
根据问题提出相应的算法或逻辑过程;
②根据已确定的算法或逻辑过程画出程序流程图,把解题的思路和逻辑顺序以图示的方法表示出来。
③分配工作单元和寄存器。
当然,在8086/8088汇编程序设计中,由于可用资源相对其它一些CPU和计算机系统较多,所以这项工作也可在程序编制中进行。
④编写程序代码。
⑤上机调试程序
在程序设计中,程序的效率是程序设计好坏的重要指标,特别是在汇编程序设计中,其特点要求我们对程序运行的效率加以重点关注。
对于汇编语言程序我们可以考虑以下几方面作为程序运行效率的衡量标准:
①程序的执行时间。
每一条语句都有自己的执行时间,在8086/8088指令手册中每条指令的运行时间都有明确的定义。
根据这些时间,我们可算出程序的运行时间。
②程序所占有的字节数。
有一些计算机系统,可能应用于工业控制或工业过程检测,不需要过多的硬件资源,比如存储单元,所以就要求我们的程序有尽可能少的字节数,以满足缩减硬件资源的要求。
③程序的语句行数。
一、数据传送类指令及应用
例1:
要求将BUF1区的N个数据传至BUFF2区。
(MOVdest,src)
备注
红河学院工学院
教学基本内容:
DATASEGMENT
BUFF1DB2,4,6,1,3,5,7,8,。
。
。
COUNTEQU$-BUFF1reg\sreg\mem
BUFF2DBCOUNTDUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATAreg\sreg\mem\data
START:
MOVAX,DATA
MOVDS,AX
LEASI,BUFF1
LEADI,BUFF2
MOVCX,COUNT
NEXT:
MOVAL,[SI]
MOV[DI],AL
INCSI
INCDI
LOOPNEXT
MOVAH,4CH
INT21H
CODEENDS
ENDSTART(见MOV.ASM)
例2:
交换两寄存器的内容。
(PUSHsrc、POPdest)
1)PUSHAX
PUSHBX先修改地址,再压栈
POPAXSPsp-2;(sp+1):
(sp)src
POPBX
2)XCHGAX,BX(XCHGdest,src)
子程序
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 原理