汇编语言及伪指令打印5章.docx
- 文档编号:2812408
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:14
- 大小:38.60KB
汇编语言及伪指令打印5章.docx
《汇编语言及伪指令打印5章.docx》由会员分享,可在线阅读,更多相关《汇编语言及伪指令打印5章.docx(14页珍藏版)》请在冰豆网上搜索。
汇编语言及伪指令打印5章
第五章汇编语言及伪指令
教学要求:
本章以微软宏汇编程序MASM5.x为蓝本,学习汇编语言源程序的格式、常用伪指令与操作符;同时,介绍汇编语言源程序的汇编、连接、运行过程,以及修改和调试方法。
重点难点:
源程序格式,常量表达,变量定义及属性、段定义、过程定义
第1节汇编程序
一、汇编程序的功能
•1.检查源程序,找出语法错误,给出出错信息。
•2.产生目标文件(.obj)和列表文件(.lst)。
•3.展开宏指令;数制转换
•4.存储单元分配(变量);段基地址分配
第2节伪指令
一、概述
1.语句一般是由分隔符分成的四个部分组成,它们有两种格式。
(1)执行性语句——由硬指令构成的语句,它通常对应一条机器指令:
标号:
硬指令助记符 操作数,操作数 ;注释
(2)说明性语句——由伪指令构成的语句,它通常指示汇编程序如何汇编源程序:
名字 伪指令助记符 参数,参数,... ;注释
· 标号和名字是符合汇编语法的用户自定义的标识符,每个标识符的定义是唯一的。
标识符(Identifier)一般最多由31个字母、数字及规定的特殊符号(如_、$、?
、@)组成,不能以数字开头。
默认情况下,汇编程序不区别标识符中的字母大小写,即大小写不敏感。
· 硬指令助记符可以是任何一条处理器指令,也可以是一条宏指令。
伪指令助记符主要将在本章和下一章学习。
· 处理器指令的操作数可以是立即数、寄存器和存储单元。
伪指令的参数可以是常数、变量名、表达式等,可以有多个,参数之间用逗号分隔。
· 语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性。
· 语句的4个组成部分要用分隔符分开。
标号后的冒号、注释前的分号是规定采用的分隔符,操作数之间和参数之间一般使用逗号分隔,其他部分通常采用空格或制表符作为分隔符。
多个空格和制表符的作用与一个相同。
另外,MASM也支持续行符“\”。
伪操作是汇编程序对源程序进行汇编时处理的操作,完成处理器选择、存储模式定义、数据定义、存储器分配、指示程序开始结束等功能。
•处理器选择伪操作(.386)
•段定义伪操作
•程序开始和结束伪操作
•数据定义及存储器分配伪操作
•表达式赋值伪操作
•地址计数器与对准伪操作
•基数控制伪操作
2.程序分段
完整的汇编语言源程序也由段组成。
一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随意排列。
需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点。
所有的可执行性语句必须位于某一个代码段内,说明性语句可根据需要位于任一段内。
通常,程序还需要一个堆栈段。
二、段的定义
1.完整段定义的源程序格式
段名segment[定位][组合][段字][’类别’]
...;语句序列(指令、伪指令)
段名ends
SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束。
段定义指令后的4个关键字用于确定段的各种属性,堆栈段要采用stack组合类型,代码段应具有‘code’类别,其他为可选属性参数。
如果不指定,则采用默认参数;但如果指定,注意要按照上列次序。
(1)段定位(align)属性——指定逻辑段在主存储器中的边界:
BYTE:
段开始为下一个可用的字节地址(xxxxxxxxb),属性值为1
WORD:
段开始为下一个可用的偶数地址(xxxxxxx0b),属性值为2
DWORD:
段开始为下一个可用的4倍数地址(xxxxxx00b),属性值为4
PARA:
段开始为下一个可用的节地址(xxxx0000b),属性值为16
PAGE:
段开始为下一个可用的页地址(00000000b),属性值为256
简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认采用PARA定位。
完整段定义伪指令的默认定位属性是PARA。
(2)段组合(Combine)属性——指定多个逻辑段之间的关系:
PRIVATE:
本段与其他段没有逻辑关系,不与其他段合并。
这是完整段定义伪指令默认的段组合方式。
PUBLIC:
连接程序把本段与所有同名同类型的其他段相邻地连接在一起,指定一个共同的段地址。
这是简化段定义伪指令默认的段组合。
STACK:
本段是堆栈的一部分,这是堆栈段必须具有的段组合。
(3)段字(Use)属性——这是为支持32位段而设置的属性。
对于16位x86CPU来说,它默认是16位段,即USE16。
而对于汇编32位x86CPU指令时,它默认采用32位段,即USE32;但可以使用USE16指定标准的16位段。
编写运行于实地址方式(8086工作方式)的汇编语言程序,必须采用16位段。
(4)段类别(Class)属性——当连接程序组织段时,将所有的同类别段相邻分配。
段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用’code’、’data’和’stack’来分别指名代码段、数据段和堆栈段,以保持所有代码和数据的连续。
例如:
;lt301b.asm(文件名)
stacksegmentstack;定义堆栈段stack
dw512dup(?
);堆栈段的大小是1024字节(512字)空间
stackends;堆栈段结束
datasegment;定义数据段data
stringdb’Hello,Everybody!
’,0dh,0ah,’$’;在数据段定义要显示的字符串
dataends;数据段结束
codesegment’code’;定义代码段code
assumecs:
code,ds:
data,ss:
stack;确定CS、DS、SS指向的逻辑段
start:
movax,data;设置数据段的段地址DS
movds,ax
movdx,offsetstring;利用功能调用显示信息
movah,9
int21h
movax,4c00h;利用系统功能调用返回DOS
int21h
codeends;代码段结束
endstart;汇编结束,同时表明程序起始点为标号start处的指令
完整段定义格式的段定义由SEGMENT和ENDS这一对伪操作实现,由代码段的assume伪指令指定用途。
2.指定段寄存器伪指令:
ASSUME 段寄存器:
段名 [,段寄存器名:
段名, ...]
ASSUME伪指令通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系。
在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。
这是ASSUME伪指令的主要功能。
ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS:
IP和SS:
SP。
由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES。
3.简化段定义格式:
.STACK[大小]
堆栈段伪指令.STACK创建一个堆栈段,段名是:
stack。
它的参数指定堆栈段所占存储区的字节数,默认是1KB(=1024=400h字节)。
.DATA
数据段伪指令.DATA创建一个数据段,段名是:
_DATA。
它用于定义具有初值的变量,当然也允许定义无初值的变量。
.CODE[段名]
.CODE伪指令创建一个代码段,它的参数指定该代码段的段名。
使用简化段定义,各段名称和其他用户所需的信息可以使用MASM预定义的符号,例如:
@CODE——表示.CODE伪指令定义的段名
@DATA——表示由.DATA、.DATA?
等定义的数据段的段名
4.程序开始与结束伪指令:
.STARTUP
.STARTUP伪指令按照给定的CPU类型,根据.MODEL语句选择的存储模式、操作系统和堆栈类型,产生程序开始执行的代码;同时还指定了程序开始执行的起始点。
在DOS下,.STARTUP语句还将初始化DS值,调整SS和SP值。
如果不使用.STARTUP语句,我们可以用下面2条指令代替(没有调整堆栈SS:
SP):
start:
movax,@data;@data表示数据段的段地址
movds,ax;设置DS
.EXIT[返回数码]
.EXIT语句产生终止程序执行返回操作系统的指令代码。
它的可选参数是一个返回的数码,通常用0表示没有错误。
例如.exit0对应的代码是:
movax,4c00h
int21h
这是利用了DOS功能调用的4ch子功能(返回DOS功能:
AH=4ch)实现的,它的入口参数就是AL=返回数码。
5.汇编结束伪指令:
END[标号]
END伪指令指示汇编程序MASM到此结束汇编过程。
源程序的最后必须有一条END语句。
可选的标号用于指定程序开始执行点,例如start。
连接程序据此设置CS:
IP值。
注意:
汇编结束不同于程序执行终止。
过程名称PROC[属性]
指令序列
过程名称ENDP
属性:
FAR、NEAR
源程序格式:
对于大多数小型MASM程序,采用简化段定义伪指令,整个源程序格式表达如下:
.modelsmall;定义程序的存储模式(一般采用small)
.stack;定义堆栈段
.data;定义数据段
...;数据定义
.code;定义代码段
.startup;程序起始点,并建立DS、SS内容
...;程序代码
.exit0;程序结束点,返回DOS
...;子程序代码
end;汇编结束
三、变量定义格式
变量定义(Define)伪指令为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。
该类伪指令是最经常使用的伪指令,它的汇编格式为:
变量名 伪指令 表达式列表
· 变量名为用户自定义标识符,表示初值表首元素的逻辑地址,即用这个符号表示地址,常称为符号地址。
变量名可以没有,这种情况,汇编程序将直接为初值表分配空间,无符号地址。
设置变量名是为了方便存取它指示的存储单元。
· 表达式表:
是用逗号分隔的参数,主要由数值常数、表达式或?
、DUP组成。
其中?
表示初值不确定,即未赋初值;重复初值可以用DUP进行定义。
DUP的格式为:
重复次数 DUP(重复项)
· 变量定义伪指令有DB/DW/DD/DF/DQ/DT,它们根据申请的主
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 指令 打印