第三章 汇编语言程序设计.docx
- 文档编号:27249172
- 上传时间:2023-06-28
- 格式:DOCX
- 页数:17
- 大小:51.82KB
第三章 汇编语言程序设计.docx
《第三章 汇编语言程序设计.docx》由会员分享,可在线阅读,更多相关《第三章 汇编语言程序设计.docx(17页珍藏版)》请在冰豆网上搜索。
第三章汇编语言程序设计
第三章汇编语言程序设计
程序是一组为完成某种功能而按一定顺序(由算法确定)编排的指令序列。
本章将首先介绍8086宏汇编语言的基本语法及常用伪指令,然后用实例说明8086宏汇编语言源程序的设计方法。
机器语言:
当指令和数据都用二进制代码表示时,计算机能够直接识别与执行。
高级语言:
是完全独立于机器的通用语言,效率低。
面向过程、面向对象,必须译成机器语言。
汇编语言:
汇编语言是一种用符号表示的、面向CPU指令系统的程序设计语言。
是用指令的助记符、符号地址、标号等编写程序的语言。
(汇编语言程序是机器语言程序的符号表示)
用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等),直接对位、字节、字、寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统提供的各种寻址方式,编制出高质量的程序。
程序目标代码占用内存少,执行速度快,效率高,具有实时性。
汇编程序的作用
将源程序翻译成机器语言程序。
按用户要求自动分配存储区域(如程序区、数据区等)。
自动地把各种进制数→二进制数。
把字符→ASCII码。
计算表达式的值。
自动对源程序进行检查,指出语法错误(如非法格式、未定义的助记符、标号、漏掉操作数等)
一、汇编语言的程序结构与语句格式
(一)、汇编语言源程序的框架结构
1、源程序的结构特点
(1)、按逻辑段组织源程序,即源程序由若干个逻辑段组成,每段由伪指令SEGMENT开始、由ENDS结束。
(2)、在代码段起始处,用ASSUME伪指令说明各个段Reg与逻辑段的关系,并在程序起始处设置段Reg的初值(代码段CS除外)。
(3)、每段由若干语句行组成,每行只有一条语句且不能超过128个字符,允许有后续行。
整个源程序以END结束,它通知汇编程序停止汇编。
END后的START标号为程序运行时的起始地址。
(4)、每条语句由4个字段构成。
各字段间用空格分开。
(5)、源程序中设有返回DOS的指令语句,使程序执行完后返回DOS系统的命令接受状态。
2、源程序与PCDOS的接口
汇编语言源程序(.ASM)经过汇编转变为目标程序(.OBJ),当用链接程序对其进行链接和定位时,操作系统为每个用户程序建立:
(1)、一个256字节的程序段前缀区(PSP),存放用户程序信息。
在PSP的开始处(偏移地址0000H)安排一条INT20H软中断指令。
INT20H功能是使系统返回到DOS管理状态。
因此,用户执行程序完后,必须能够转到PSP起始处执行INT20H指令。
(2)、定位用户程序
(3)、置DS和ES的值使之指向PSP的开始处,即PSP的段地址→DS和ES。
(4)、将用户程序的段基址、第一条指令的偏移地址设置CS、IP;同时设置SS、SP。
(5)、运行用户程序
(二)、8086汇编语言的语句
1、语句的种类
(1)、指令语句:
可执行语句,对应CPU指令系统规定的一条指令。
汇编时,汇编程序为之产生一一对应的机器目标代码。
(2)、伪指令语句:
汇编时给汇编程序提供与硬件有关的汇编信息,本身并不产生目标代码,CPU不执行,是指示汇编程序进行汇编的操作。
2、语句格式(注意:
方括号表示该内容可有可无。
)
指令语句的一般格式:
[标号:
][前缀]指令助记符[操作数][;注释]
伪指令语句的一般格式:
[名字]伪指令定义符[操作数][;注释]
(1)、标号和名字
标识符字段由各种有效字符组成,一般表示符号地址,具有段基址、偏移量、类型三种属性。
很多情况下标识符字段是语句中的可选部分,主要为便于程序的读写方便而使用。
标识符字段通常有:
标号后跟冒号,在程序中作为JMP、LOOP指令的转移目标,与具体的指令地址相联系。
名字用于定义常量名、变量名、过程名、段名等。
注意:
标号和名字必须符合汇编语言对标识符的规定
以字母开头,由字母(不分大小写)、数字(0~9)及部分特殊字符(?
@$和下划线_等)组成,字符串长度不超过31个。
标识符不能是汇编语言中有特定意义的保留字、助记符、Reg等,如:
CPU的内部寄存器名AH、AL、AX等。
(2)、助记符、定义符
规定指令或伪指令的操作功能,是语句中唯一不可缺少的部分。
对于指令,汇编程序将其翻译成机器语言指令,如MOVAX,100表示B80001;
对于伪指令,汇编程序据其要求的功能进行处理,如dataSEGMENT表示data与一段地址对应。
注意:
前缀仅可出现在指令助记符前。
(3)、操作数
指令语句中提供给指令的操作对象、存放位置。
操作数可以是0个、1个或2个,2个时用逗号“,”分开。
(INCBX;MOVAX,DATA;)
伪指令语句中操作数的格式和含义随伪操作指令不同而不同。
(4)、注释
以“;”开始,给以编程说明。
汇编程序对“;”后的内容不做处理。
注释对汇编不起任何作用,不对应于任何机器码,仅增强源程序的可读性。
二、8086汇编中的伪指令
有符号定义语句、数据定义语句、程序结构语句、模块链接语句、有关宏的语句、条件汇编语句等。
1、符号定义语句——给表达式赋予一种符号名,以便在程序中用它替代表达式。
(1)、等值语句
格式:
符号名EQU表达式
例:
PORTEQU40H;用PORT代替40H号端口
COUNTEQUCX;用COUNT代替CX寄存器
注:
EQU语句不能重新定义,即在同一源程序中,用EQU定义过的符号不能赋予不同的值。
(2)、等号语句
格式:
符号名=表达式
例:
PP=89FAH;赋值
PP=PP+1;PP=89FBH
注:
等号语句与EQU语句的相同点:
符号不是变量,所以用EQU、=定义的符号不占用存储器单元。
区别:
等号语句可以在同一源程序中重复定义符号。
2、变量定义语句
用于定义变量(程序中所用的存储器操作数),指定变量的类型和名称,并为其分配存储单元和预置初值。
(1)、基本格式:
[变量名]数据定义符操作数[,操作数]…[,操作数]
变量名:
指示存储器操作数的地址(符号地址);
数据定义符:
指示存储器操作数的类型(字节、字、双字等);
操作数:
指示存储器操作数的内容,是赋给变量的初值。
多个相同类型的变量可在一条语句中定义。
汇编程序将定义的操作数,按其类型分配内存单元数,并顺序存入变量名指向的内存单元中。
常用的数据定义符有:
DB:
变量为字节数据类型DW:
变量为字数据类型
DD:
变量为双字数据类型DQ:
变量为4字数据类型(64位)
DT:
变量为10字节的压缩BCD数(80位)
例:
定义赋初值的变量
dataSEGMENT
xxDB1,-1,0FCH
yyDW1,-1,0FCH
zzDD1,-1,0FCH
dataENDS
(2)、具体形式和功能
1)为数据项分配存储单元,用变量名作为该存储单元的名称。
2)预留内存单元,但不赋值,以存放运算结果.
3)定义一个数组
4)定义字符串(只能用DB定义)
5)将已定义的地址存放内存单元
3、段定义伪指令
用于告诉汇编程序和链接程序如何按逻辑段来组织程序和利用存储器,具体来说就是规定段的起始和结束,指定段的属性。
段的定义有简化定义和完整定义,下面只介绍完整定义。
(1)、段定义语句SEGMENT/ENDS
格式:
段名SEGMENT[定位类型][组合属性][‘类别名’]
……(段体)
段名ENDS
说明:
a、段定义由伪操作SEGMENT开始、ENDS结束。
SEGMENT和ENDS必须成对出现,且段名必须相同(段名是合法的标识符,与某个存储单元相联系);
b、SEGMENT和ENDS语句之间可以有其他指令或伪指令,表示存放在该段内存中的变量、指令或其他伪指令对该段内存的处理;
c、程序中可以定义多个段;
d、程序经汇编、连接及装入内存后,段名为一具体的段值。
段定义的相关约定
1)、定位类型:
告诉链接程序链接时段的起始边界,有4种选择:
BYTE:
段起始地址为任意值,即从任何地址开始都行。
WORD:
段起始地址必须是偶数(XX…0B),最低1位必须为0。
PARA:
段起始地址必须是16的倍数(XXXX0H),最低4位必须为0。
PAGE:
段起始地址必须是256的倍数(XXX00H),最低8位为0。
注意:
缺省类型为PARA。
2)、组合类型
在多模块(每个模块有自己的代码段、数据段、堆栈段)组合时,告诉链接程序本段与其他模块中同名段的链接关系,有6种选择:
NONE:
本段与其它同名段逻辑上不发生关系,有自己的段基地址(缺省选择)。
PUBLIC:
在满足定位类型的前提下,链接程序将其与其他模块中的同名段邻接在一起,共用一个段地址。
链接的先后次序由链接命令指定。
STACK:
与PUBLIC同样处理,链接后作为堆栈段,并自动初始化SS、SP,SS指向第一个STACK段。
若程序中不说明STACK,则必须由用户在程序的开始处,自己通过语句设置SS、SP。
COMMON:
各模块中同名段重叠覆盖,有着相同的起始地址。
段的长度取决于最长的COMMON段。
段的内容为所链接的最后一个模块中COMMON段的内容。
MEMORY:
链接在其他所有段的后面(高端存储区)。
若有多个MEMERY段,则只认第一个,其余按COMMON处理。
AT表达式:
链接程序把本段装在表达式值所指定的段地址(此方式不能指定代码段)。
3)、类别名
给各段的名字信息,表示段的类别。
类别必须用单引号括起来,典型类别名如:
‘STACK’、‘CODE’和‘DATA’等。
若缺省‘类别名’,则表明该段类别为空。
同名同类别的段在内存中依序连续存放。
(2)、段寄存器说明伪指令
格式:
ASSUME段寄存器:
段名[,段寄存器:
段名,…]
设定特定的Sreg指向特点的段,说明源程序中定义的段应由哪一个Sreg去寻址。
否则,汇编程序无法生成机器代码程序。
ASSUME并未真正的将段地址装入相应的Sreg。
Sreg的初值还必须由用户在程序的开始处用MOV指令来设置(CS除外)。
(3)、指定地址伪指令
在汇编程序中,有一个软件计数器(LC)——地址计数器。
在每个段定义开始处,它被复位为0。
当汇编程序逐行扫描语句时,用LC保存当前指令的地址。
格式1:
ORG表达;将表达式的值(0~65535)→LC
格式2:
ORG$+表达式;将LC的当前值$+表达式的值→LC
功能:
强行指定地址计数器LC的当前值,在段内改变它以后的代码或数据存放的偏移地址。
ORG语句之后段内所有的代码或数据均以表达式(常量)的值为起始偏移量连续存放,除非遇到另一个ORG语句。
(此语句本身并不占内存。
)
(4)、模块的定义和通信
MASM宏汇编语言提供了模块化编程伪指令,用以实现模块的定义与通信。
一个任务的源程序由若干模块组成,每个模块有代码段、数据段等,对应一个.ASM,是个独立的编译单位。
当各个模块编译完毕,可用LINK连接各模块形成一个完整的可执行程序(.exe)。
1)、模块定义伪指令NAME/END
格式:
[NAME模块名];为模块命名
·······;语句
END[标号];结束模块
a、模块名的作用是指示给连接程序进行连接用。
b、源程序中可无模块定义,此时源文件名作为模块名。
c、主模块的END后要跟标号,子模块不跟标号。
d、[]部分可省略。
2)、模块间通信伪指令——实现模块间数据或过程的互访和共享。
格式:
PUBLIC名字[,名字,…]
EXTRN名字:
类型[,名字:
类型,…]
a、名字可以是标号、变量名、过程名或由EQU(或=)伪指令定义的符号名。
b、类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS(常量属性)等。
c、【PUBLIC和EXTRN配对使用。
d、由PUBLIC说明的名字是全局的,可以在其他模块中使用。
e、EXTRN表明本模块中使用的名字在别的模块中定义过,且类型一致。
4、过程和宏定义伪指令
过程和宏是模块化程序设计的基础。
汇编语言中常用定义过程和宏的方法来实现按模块管理程序代码的功能。
(1)、过程定义伪指令
过程:
一段可以由CALL指令调用,用RET返回的程序。
当整个源程序由主、子程序构成时,主、子程序都在代码段,且都可用过程来表示(即定义为过程)。
格式:
过程名PROC[NEAR]/FAR
······
RET
过程名ENDP
功能:
定义一个过程,并指出过程名及过程的属性。
说明:
a、过程定义由伪指令PROC开始、ENDP结束。
PROC和ENDP之间为过程的指令序列。
b、程序中可以定义多个过程。
c、程序经汇编、连接及装入内存后,过程名为一具体的内存地址,指示子程序入口。
①、过程的属性有NEAR和FAR
NEAR过程只能被定义该过程的段中的其他程序调用(段内调用);FAR过程可由任何段中的程序调用(段间调用)。
缺省时为NEAR
②、根据过程的属性,汇编程序自动对CALL、RET翻译成段内(段间)调用及段内(段间)返回的目标代码。
(2)、宏定义伪指令
为减少重复编写相同语句段的工作,我们可以使用“宏”功能。
宏定义是指用一个标识符(宏名)来代替一组指令序列(可同时包含指令性语句和指示性语句)。
宏功能的使用过程是:
宏定义、宏调用、宏展开。
宏定义格式:
宏指令名MACRO[形参,形参…]
······;指令序列
ENDM
宏调用——在源程序中用宏指令代替所定义的程序段。
格式:
宏指令名[实参,实参…]
宏扩展:
汇编时,将相应的程序段中的每条语句前冠以“+”,代替宏指令以产生目标代码。
三、8086汇编中的操作数
1、常量操作数——在运行期间不变化的量:
立即数、端口地址。
(1)、数值常量
如:
2(B)、10(D)、8(Q)、16(H)的整型常量。
注意:
对16进制数:
必须以数字打头,若最高位为字母A~F,必须加前缀0。
(2)、字符串常量
是用单引号括起来的一个或多个字符,值为字符的ASCII码值。
例:
‘A’=41H‘AB’=4142H‘1234’→31323334H
2、Reg操作数——操作数部分是寄存器名,如:
AX、SI和DS等。
3、存贮器操作数——有标号与变量两种
(1)、标号在代码段内,与指令地址相关联。
(或某个过程起点位置相关联)
(2)、变量在数据段或堆栈段内,是存放数据的存贮单元的符号地址,与各种存储器操作数寻址方式有关。
常以变量名的形式出现在程序中。
(3)、标号和变量都与存储器地址相关联,都具有以下三种属性:
段属性(SEGMENT)——段基址,标号或变量所在段的段地址。
偏移量属性(OFFSET)——段内偏移地址,标号或变量所在地址与所在段的段起始地址之差。
类型属性(TYPE)——对变量,指变量存取单位的字节数大小,有字节(BYTE)、字(WORD)、双字(DWORD)、4字、10字节5种。
对标号,指标号与使用它的指令之间的距离远近。
(如:
对转移指令来说,有NEAR标号或FAR标号)
4、表达式操作数
表达式由各种操作数、运算符和操作符组成,可出现于源程序的任何地方,在汇编时计算(而不是在程序执行过程中)。
汇编程序对表达式进行运算后,得到一个确定的数值,再把这个数值汇编到指令中。
根据表达式所表示的内容而分:
(1)、数值表达式:
由常量及算术逻辑运算符、或关系运算符连接而成,在汇编时产生一个数值。
(2)、地址表达式:
由常量、变量、标号、寄存器的内容及一些运算符组成。
四、8086汇编中的运算符和操作符
MASM宏汇编中有三种运算符:
算术、逻辑和关系运算符;两种操作符:
分析和合成操作符。
运算符:
实现对操作数的相关运算。
操作符:
完成对操作数属性的定义、调用和修改。
1、运算符
(1)、算术运算符
+、—、×、/、MOD(取余数)
数值表达式中可使用所有算术运算符,地址表达式仅使用“+、—”两种算术运算符。
如标号或变量±常量,运算后仍为标号或变量,其3个属性中的类型及段基址属性不变,仅修改了偏移量属性。
注意:
算术运算符不影响标志位
例:
完成80H+90H
解:
MOVAL,80H+90H;使用数值表达式
;(AL)=10H、CF=不变
MOVAL,80H;使用加法指令
ADDAL,90H;(AL)=10H、CF=1
(2)、逻辑运算符
AND、OR、XOR和NOT
实现操作数按位逻辑操作,只适用于数值表达式。
注意:
逻辑运算符与逻辑指令助记符形同意不同
作为指令助记符时,是在程序运行时被执行,操作对象可以是寄存器或存储器操作数。
作为运算符时,是在程序汇编时由汇编程序计算的,计算结果充当指令的某一个操作数或构成操作数的部分。
(3)、关系运算符
EQ(等于)、NE(不等)、LT(小于)
GT(大于)、(LE小于等于)和GE(大于等于)
在两个无符号操作数之间进行大小关系比较,两个操作数必须同是数值或同是一个段内的两个存储器地址。
关系不成立则结果为“0”(假:
0);若关系成立则结果为全“1”(真:
FFFFH)。
结果值在汇编时获得。
例:
MOVBX,PORTLT5
汇编为:
MOVBX,0FFFFH(条件成立)
或MOVBX,0000H(条件不成立)
2、操作符
分析操作符:
运算对象是存储器操作数,它返回变量或标号的属性值。
合成操作符(修改属性运算符):
作用于存储器操作数时可以改变它们的属性。
(1)、分析操作符(SEG、OFFSET、TYPE、SIZE、LENGTH)
使用格式:
操作符标号或变量
1)、SEG、OFFSET——返回标号或变量的段地址和偏移地址
2)、TYPE、LENGTH、SIZE
TYPE——返回存储器操作数(标号或变量)的类型值。
LENGTH——返回变量用DUP定义的重复次数。
SIZE——返回TYPE和LENGTH的乘积,表示为变量所分配的字节存储单元总数。
(2)、合成操作符(PTR、LABLE、THIS)
1)、PTR
临时(仅在当前所在的指令中有效)修改或指定存储器操作数的类型属性,而保持原有的段、偏移地址属性,且原定义的类型属性不变。
使用格式:
类型PTR标号或变量
2)、LABLE
为当前存储单元定义一个指定类型的标号或变量,常用于定义一个数据块或标号,使它们具有多重名字和属性。
使用格式:
标号或变量名LABLE类型
3)、THIS
与EQU配合使用,具有LABLE的同样作用。
使用格式:
标号或变量名EQUTHIS类型
3、运算符和操作符的优先权等级
五、汇编语言程序设计——汇编语言程序设计的常用结构与方法
与大多数高级语言相同的是:
汇编语言是结构化的语言。
一个大的汇编源程序可由多个“模块”组成,而每个模块则由一个或多个“段”构成。
与高级语言不同,使用汇编语言编程时需同时使用指令和伪指令。
1、汇编语言程序设计基本步骤
a、分析问题并抽象出数学模型。
b、确定最佳算法。
c、画出程序结构框图和流程图。
d、合理分配内存工作单元和寄存器,并了解I/O接口地址。
e、编程并调试。
(有时需要用注释行说明程序,便于阅读和修改。
)
评价程序质量的标准:
合理组织数据,发挥存贮器、Reg的作用。
程序逻辑结构好,便于二次开发。
可读性强。
高可靠性和可维护性。
效率高(代码少)。
2、程序的基本结构
顺序结构
对应简单程序,顺序执行,无转移、无循环。
指令指针IP值线性增加。
分支结构
依据不同条件分支到各程序段,有双分支和多分支两种。
IP值受标志位的影响而跳变。
循环结构
实现那些需要重复做的工作。
IP值因计数器CX中的值不为零而循环。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第三章 汇编语言程序设计 第三 汇编语言 程序设计