文档详情

汇编语言及伪指令打印5章

cn****1
实名认证
店铺
DOCX
47.26KB
约24页
文档ID:418312333
汇编语言及伪指令打印5章_第1页
1/24

第五章 汇编语言及伪指令教学要求:本章以微软宏汇编程序 MASM 5.x 为蓝本,学习汇编语言源 程序的格式、常用伪指令与操作符;同时,介绍汇编语言源 程序的汇编、连接、运行过程,以及修改和调试方法重点难点: 源程序格式,常量表达,变量定义及属性、段定义、过程定 义第 1 节 汇编程序一、 汇编程序的功能• 1.检查源程序,找出语法错误,给出出错信息• 2•产生目标文件(・obj)和列表文件(.1st)• 3.展开宏指令;数制转换• 4.存储单元分配(变量);段基地址分配第2节 伪指令一、概述1. 语句一般是由分隔符分成的四个部分组成,它们有两种格 式1) 执行性语句——由硬指令构成的语句,它通常 对应一 条机器指令:标号: 硬指令助记符 操作数,操作数 ;注释(2)说明性语句——由伪指令构成的语句,它通常 指示汇 编程序如何汇编源程序:名字 伪指令助记符 参数,参数,... ;注释・标号和名字是符合汇编语法的用户自定义的标识符,每个 标识符的定义是唯一的标识符(Identifier)一般最多由31 个字母、数字及规定的特殊符号(如 _、$、?、@)组成, 不能以数字开头默认情况下,汇编程序不区别标识符中的 字母大小写,即大小写不敏感。

・硬指令助记符可以是任何一条处理器指令,也可以是一条 宏指令伪指令助记符主要将在本章和下一章学习・处理器指令的操作数可以是立即数、寄存器和存储单元 伪指令的参数可以是常数、变量名、表达式等,可以有多个, 参数之间用逗号分隔・语句中由分号“;”开始的部分为注释内容,用以增加源程序的可读性・语句的4个组成部分要用分隔符分开标号后的冒号、注释前的分号是规定采用的分隔符,操作数之间和参数之间一 般使用逗号分隔,其他部分通常采用空格或制表符作为分隔 符多个空格和制表符的作用与一个相同另外, MASM 也 支持续行符“\”伪操作是汇编程序对源程序进行汇编时处理的操作,完 成处理器选择、存储模式定义、数据定义、存储器分配、指 示程序开始结束等功能• 处理器选择伪操作( .386)• 段定义伪操作• 程序开始和结束伪操作• 数据定义及存储器分配伪操作• 表达式赋值伪操作• 地址计数器与对准伪操作• 基数控制伪操作2. 程序分段完整的汇编语言源程序也由段组成一个汇编语言源程序可以包含若干个代码段、数据段、附 加段或堆栈段,段与段之间的顺序可随意排列需独立运行的程序必须包含一个代码段,并指示程序执 行的起始点,一个程序只有一个起始点。

所有的可执行性语句必须位于某一个代码段内,说明性 语句可根据需要位于任一段内通常,程序还需要一个堆栈段二、段的定义1.完整段定义的源程序格式段名segment [定位][组合][段字]['类别'];语句序列(指令、伪指令)段名 endsSEGMENT伪指令定义一个逻辑段的开始,ENDS伪指令表示一个段的结束段定义指令后的 4 个关键字用于确定 段的各种属性,堆栈段要采用 stack 组合类型,代码段应具 有‘code'类别,其他为可选属性参数如果不指定,则采用默认参数;但如果指定,注意要按照上列次序1)段定位(align)属性的边界:指定逻辑段在主存储器中BYTE:段开始为下一个可用的字节地址( xxxx xxxxb) ,属性值为 1WORD:段开始为下一个可用的偶数地址( xxxx xxx0b) ,属性值为 2DWORD:段开始为下一个可用的4倍数地址( xxxx xx00b) ,属性值为 4PARA:段开始为下一个可用的节地址(xxxx0000b),属性值为16PAGE:段开始为下一个可用的页地址(00000000b),属性值为256简化段定义伪指令的代码和数据段默认采用WORD定位,堆栈段默认釆用PARA定位。

完整段定义伪指令 的默认定位属性是 PARA2)段组合(Combine)属性 指定多个逻辑段之间的关系:PRIVATE:本段与其他段没有逻辑关系,不与其他段合并这是完整段定义伪指令默认的段组合方式PUBLIC:连接程序把本段与所有同名同类型的其他段相邻地连接在一起,指定一个共同的段地址这 是简化段定义伪指令默认的段组合STACK:本段是堆栈的一部分,这是堆栈段必须具有的段组合3)段字(Use)属性一一这是为支持32位段而设置的属 性对于16位x86 CPU来说,它默认是16位 段,即USE16而对于汇编32位x86 CPU指令时,它默认釆 用32位段,即USE32;但可以使用USE16指定标准的16位 段编写运行于实地址方式(8086 工作方式)的汇编语言程 序,必须釆用 16位段4)段类别(Class)属性一一当连接程序组织段时,将 所有的同类别段相邻分配段类别可以是任意名称,但必须位于单引号中;大多数MASM程序使用'code'、'data' 和'stack'来分别指名代码段、数据段和堆栈段,以保持 所有代码和数据的连续例如:;lt301b・asm (文件名)stack segment stack ;定义堆栈段 stackdw 512 dup(?) ;堆栈段的大小是 1024字节(512字) 空间stack ends ;堆栈段结束data segment ;定义数据段 datastring db 'Hello,Everybody !',0dh,0ah,'$' ;在数据段定义要 显示的字符串data ends ;数据段结束code segment 'code' ;定义代码段 codeassume cs:code,ds:data,ss:stack ;确定 CS、DS、SS 指 向的逻辑段start: mov ax,data ;设置数据段的段地址 DSmov ds,axmov dx,offset string ;利用功能调用显示信息mov ah,9int 21hmov ax,4c00h ;利用系统功能调用返回 DOSint 21hcode ends ;代码段结束end start ;汇编结束,同时表明程序起始点为标号start 处的指令完整段定义格式的段定义由 SEGMENT 和 ENDS 这一 对伪操作实现,由代码段的 assume 伪指令指定用途。

2.指定段寄存器伪指令:ASSUME名,・・・]段寄存器:段名[,段寄存器名:段ASSUME 伪指令通知 MASM 用指定的段寄存器来寻址 对应的逻辑段,即建立段寄存器与段的缺省关系在明确了 程序中各段与段寄存器之间的关系后,汇编程序会根据数据 所在的逻辑段,在需要时自动插入段超越前缀这是 ASSUME 伪指令的主要功能ASSUME 伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS : IP和SS : SP由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值 ES3. 简化段定义格式:.STACK [大小]堆栈段伪指令.STACK创建一个堆栈段,段名是:stack它 的参数指定堆栈段所占存储区的字节数,默认是 1KB(= 1024 =400h 字节)DATA数据段伪指令.DATA创建一个数据段,段名是:_DATA它用于定义具有初值的变量,当然也允许定义无初值的变量CODE [段名].CODE 伪指令创建一个代码段,它的参数指定该代码段的段 名使用简化段定义,各段名称和其他用户所需的信息可以使用MASM 预定义的符号,例如:@CODE――表示.CODE伪指令定义的段名@DATA――表示由.DATA、・DATA?等定义的数据段的段名4. 程序开始与结束伪指令:.STARTUP.STARTUP伪指令按照给定的CPU类型,根据・M ODEL语句选 择的存储模式、操作系统和堆栈类型,产生程序开始执行的 代码;同时还指定了程序开始执行的起始点。

在 DOS 下,.STARTUP语句还将初始化DS值,调整SS和SP值如果不使用.STARTUP语句,我们可以用下面2条指令代替 (没有调整堆栈SS : SP):start: mov ax,@data ;@data 表示数据段的段地址mov ds,ax ;设置 DS.EXIT [返回数码].EXIT 语句产生终止程序执行返回操作系统的 指令代码它的可选参数是一个返回的数码,通常用 0 表示 没有错误例如.exit 0对应的代码是:mov ax,4c00hint 21h这是利用了 DOS功能调用的4ch子功能(返回DOS功能:AH = 4ch)实现的,它的入口参数就是AL =返 回数码5. 汇编结束伪指令END [ 标号]END 伪指令指示汇编程序 MASM 到此结束汇编过程源程序的最后必须有一条END语句可选的标号用于指 定程序开始执行点,例如start连接程序据此设置CS : IP 值注意:汇编结束不同于程序执行终止 过程名称PROC漏性]指令序列过程名称 ENDP属性: FAR、 NEAR源程序格式: 对于大多数小型MASM程序,采用简化段定义伪指令,整个 源程序格式表达如下:.model small ;定义程序的存储模式(一般采用 small).stack ;定义堆栈段.data ;定义数据段... ;数据定义.code ;定义代码段・startup ;程序起始点,并建立DS、SS 内容... ;程序代码・exit 0 ; 程序结束点,返回 DOS・・・ ;子程序代码end ; 汇编结束三、变量定义格式变量定义(Define )伪指令为变量申请固定长度的存储空间,并可以同时将相应的存储单元初始化。

该类伪指令是最经常使用的伪指令,它的汇编格式为:变量名 伪指令 表达式列表• 变量名为用户自定义标识符,表示初值表首 元素的逻辑地址,即用这个符号表示地址,常称为符号地址 变量名可以没有,这种情况,汇编程序将直接为初值表分配 空间,无符号地址设置变量名是为了方便存取它指示的存 储单元• 表达式表:是用逗号分隔的参数,主要由数 值常数、表达式或?、DUP组成其中?表示初值不确定 即未赋初值;重复初值可以用DUP进行定义DUP的格式为:重复次数 DUP(重复项)• 变量定义伪指令有DB / DW / DD / DF / DQ / DT,它们根据申请的主存空间单位分类1•字节定义伪指令DB,用于分配一个或多个字节单元,并可 以将它们初始化为指定值初值表中每个数据一定是字节量 (Byte),可以是0~255的无符号数或是-128〜+127带符号 数,也可以是字符串常数例如:data segment;数据段X db 'a',-5Y db 'ABC',? ,4*6Z DB 0,0,0,0,0,0,0,0,0,0R DB 10 DUP(0) data ends61HFB41H 42H43H18H利用它们的汇编指令示例:mov al,X ;此处X表示它的第1个数据,故AL—a'dec X+1 ;对X为始的第2个数据减1,故成为-6mov Y,al ; 现在 Y 这个字符串成为 'aBC'2.字定义伪指令 DW字节定义伪指令DW,用于分配一个或多个字单元,并可以将 它们初始化为指定值。

初值表中每个数据一定是字量(W。

下载提示
相似文档
正为您匹配相似的精品文档