MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt

上传人:小飞机 文档编号:6511608 上传时间:2023-11-08 格式:PPT 页数:22 大小:277KB
返回 下载 相关 举报
MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt_第1页
第1页 / 共22页
MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt_第2页
第2页 / 共22页
MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt_第3页
第3页 / 共22页
MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt_第4页
第4页 / 共22页
MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt》由会员分享,可在线阅读,更多相关《MASM伪指令系统42汇编语言语句种类与格式421汇编语言.ppt(22页珍藏版)》请在三一办公上搜索。

1、第4章MASM伪指令系统4.2汇编语言语句种类与格式4.2.1汇编语言语句的种类汇编语言源程序可以使用如下三类语句:1指令性语句 2伪指令语句 3宏指令语句4.2.2汇编语言语句的格式 由于宏指令实质上不是一类语句,故我们主要分析指令性语句和伪指令语句的格式。指令性语句的格式为:标号:指令助记符 操作数,操作数;注释 伪指令语句的格式为:名字伪指令定义符参数,参数;注释1标号、名字 指令或数据的符号地址。,2助记符、定义符 规定指令或伪指令的功能。3参数 参数可分为三类,如下:(1)数值表达式 常数 宏汇编中允许使用如下几种常数:二进制常数、十进制常数、十六进制常数、八进制常数、串常数、十进制

2、科学计数法、十六进制实数 算术运算符 算术运算符有、*、/、MOD。(2)逻辑运算符 逻辑运算符有NOT、AND、OR、XOR、SHR和SHL。关系运算符 关系运算符有:EQ、NE、LT、LE、GT、GE。(2)寄存器操作数,寄存器操作数就是寄存器的名字,常用于指令性语句中。(3)存储器操作数 存储器操作数即存储器的地址,常以一个表达式的形式给出,称为地址表达式。单个的变量、标号或有方括号的基址或变址寄存器是地址表达式的特例。4注释 注释项必须以分号开头。4.3常用伪指令4.3.1符号定义伪指令1等值语句EQU 格式:变量名 EQU 表达式 功能:EQU伪指令告知汇编程序,指令左右的二个量相等

3、,并且用右边表达式的值定义左边的符号。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。2等号伪指令 格式:变量名表达式 功能:“”伪指令用来为右边的表达式定义一个替代符号,,且只能是数值表达式,不能为字符串或地址表达式,“”伪指令定义的符号允许重复定义。4.3.2数据定义伪指令与变量1数据定义语句 数据定义语句有5条,其格式相同,如下:变量名 DB 初值表达式 变量名 DW 初值表达式 变量名 DD 初值表达式 变量名 DQ 初值表达式 变量名 DT 初值表达式功能:让汇编程序在内存中划出指定个数的存储单元,然后将这些存储单元与变量名联系起来,并在存储单元中预置初值。DB伪指

4、令定义字节类型变量,其每个初值都占一个字节的存储空间。DW伪指令用来定义字类型变量,其每个初值都占一个字的存储空间。DD伪指令用来定义双字类型变量,其每个初值都占二个字的存储空间。,DQ伪指令用来定义四字类型变量,其每个初值都占四个字的存储空间。DT伪指令用来定义十字节类型变量,其每个初值都占五个字的存储空间。初值表达式:初值表达式决定变量初值的个数,定义变量时可以指定多个初值,从而占据较多的存储空间。多个初值时各个初值间用逗号隔开。初值表达式中可以有常数或常数表达式、字符串、?和带DUP的表达式。例如:B0DB2 B1DB3,5,?,9 B2DW10H,2DUP(1234H,?)B3DD1,

5、2 B4DB0,2DUP(?,1,2DUP(7)这5个变量分配内存情况如图4-1(a)(f)所示(见下页)。,图41 DB DW DD 初值示意图,说明:(1)表达式中也可以有用引号引起来的字符串,它表示将字符的ASCII码作为初值。例如:C1DBABCD C2DWAB,B C3DDAB这三个变量在内存中的存放情况如图4-2(a)(c)所示.图4-2 DB DW DD初值示意图,(2)对于DW和DD,表达式中也允许是一个变量名或者标号.DW伪指令将变量或标号的偏移量作为初值置入存储区,而DD伪指令则把变量或标号的段基址与偏移量作为初值置入存储区。例:S1 DB 5 S2 DW S1 S3 DD

6、 S1 内存情况如图43所示。2变量的访问(1)当变量只代表一个数据时,用变量名可直接对其代表的单元进行操作。(2)当变量对应着多个数据时,变量名仅代表其第一个数据项,对其后数据项的存取可用变量名加一偏移量来实现。3变量的属性 一个变量一经定义就具备了如下三个属性:图4-3 变量/标号名作初值,(1)段属性 表示变量对应数据区所在段的段基址。变量在哪个段内定义,其段属性就是哪个段的段基址。(2)偏移属性 表示变量对应数据区的段内的偏移量,即从段的起始地址开始到变量对应数据区的第一个存储单元之间的字节数,用16位无符号数表示。变量的段属性与偏移属性构成了变量的逻辑地址。(3)类型属性 指变量对应

7、数据项的存取单位,它与变量定义时使用的伪指令有关。如:DB定义的变量,类型为BYTE(字节);DW定义的变量,类型为WORD(字);DD定义的变量,类型为DWORD(双字)等。4.3.3标号及其属性1标号的概念 标号是一条指令的符号地址,它常作为转移指令或子程序调用指令的操作数。标号同变量的区别在于标号代表的是指,令代码而变量代表的数据。2标号的属性 标号也是符号地址,同变量类似,也有三个属性。段属性 偏移属性 类型属性3标号的定义 NEAR类型标号:在指令助记符前写上标号并用冒号分隔,就定义了一个NEAR标号。FAR类型标号:必须借助于其它操作符定义,见下小节。4.3.4析值/属性操作符及符

8、号名定义语句1析值操作符(1)取偏移地址操作符OFFSET 格式:OFFSET变量或标号 功能:返回该变量或标号在它段内的偏移地址。(2)取段基址操作符SEG 格式:SEG变量或标号 功能:返回变量或标号所在段的段基址。(3)取类型操作符TYPE,格式:TYPE变量或标号 功能:当TYPE操作符置于变量前面时,得到变量的类型数字,该数字表示该变量所分配的存储单元的字节数;当TYPE操作符置于标号前面时,返回标号的类型属性值。(4)取变量存储区长度操作符LENGTH 格式:LENGTH变量 功能:LENGTH操作符只对变量起作用,它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定

9、。如果第一个表达式为重复子句“n DUP(表达式)”,则返回外层DUP操作符前面的重复因子n;如果为其它形式的表达式,则返回值为1。(5)取变量对应数据存储区大小操作符SIZE 格式:SIZE变量 功能:SIZE操作符仅对变量起作用,返回LENGTH 变量TYPE 变量之积。2属性操作符 属性操作符用于临时改变地址表达式的类型属性,有2个.,(1)操作符PTR 格式:类型PTR地址表达式 功能:PTR操作符的作用是将地址表达式的类型属性临时指定为PTR操作符前面的类型,地址表达式的原类型属性将暂时不起作用。地址表达式的形式可以是标号、变量或其它形式的地址,指定的类型可以是BYTE、WORD、D

10、WORD、NEAR和FAR。PRT的用法:说明存储单元的类型 改变存储单元属性 建立FAR标号 建立FAR标号一般也要借助于EQU来完成。(2)THIS操作符 格式:THIS类型 功能:指定从该语句开始下一个可分配的存储单元的类型,它常与EQU连用。THIS操作符可以方便地建立FAR标号。,3定义符号名伪指令LABEL 格式:符号名LABEL类型 功能:定义由符号名指定的符号,使该符号的段属性与偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同,并具有类型参数所指定的类型。类型可以是BYTE、WORD、DWORD、NEAR和FAR。4.3.5段定义伪指令1段定义伪指令 格式:段名 SEGM

11、ENT 定位类型 组合类型 类别 段名ENDS2汇编程序对段的处理 设某源程序定义了三个段,段名分别为WW1、WW2和WW3,如图45所示(见下页)。汇编程序对该模块进行汇编时,每遇到一个新名字的段,就在段表中填入其段名,同时为该段配备一个初值为0的地址计数器,凡遇到产生目标代码的语句和所有的指令性语句(NIL除外),都按照它们所需要的字节数在程序地址计数器累,计计数,并在相应段的代码区中生成指令代码或在数据区中生成数据。段内定义的所有标号及变量,其偏移地址都是由当前程序地址计数器的值确定。图4-5 汇编程序对段的处理,3地址计数器的访问 地址计数器的名字为“$”,程序中可以使用或改变其值。例

12、(略)4.4程序的段结构 在学习了段定义语句之后,我们分析一个简单的汇编语言源程序的结构。DATASEGMENT VAR DB12H DATAENDS STACK1SEGMENTSTACK DB 300HDUP(?)STACK1ENDS CODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACK1 START:MOVAX,DATAMOVDS,AXINCVAR,MOVAH,4CH INT21H CODE ENDS END START1源程序分段结构 汇编语言源程序由若干段组成,段是程序的基本构成单位,一般将数据集中放在一个段内,称为数据段.本例中为DATA段;将堆栈所需

13、内存专划为一个段,称为堆栈段.本例中为STACK1段。在堆栈段内定义变量的目的是指定堆栈段的长度;将指令代码集中放在一个段内,称为代码段,本例中为CODE段。一个程序必须有代码段,其它段根据需要定义。2段假设伪指令ASSUME 格式:ASSUME 段寄存器名:段名,段寄存器名:段名,功能:ASSUME伪指令设定段和段寄存器的关系,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT/ENDS定义的段名。在程序的代码段中可以多次使用ASSUME伪指令,则新设置,的“段寄存器:段名”的对应关系将取代以前的设置。3段寄存器的填装 ASSUME伪指令仅告诉汇编程序在汇编源程

14、序时假设段寄存器与段存在着这样的对应关系,它不能真正将段基址装入到相应的段寄存器中去。段寄存器的装入是应用程序在运行时实现的,并且4个段寄存器的装入方法有所不同。(1)DS和ES的装入 由于段基址不能用MOV指令直接送往段寄存器,所以通过一通用寄存器再送往DS和ES。(2)SS的填装 有二个办法:在堆栈段定义时,指定组合类型为STACK。示例程序中STACK1段即是这样定义的,当程序代码装入到内存准备执行时,DOS将完成以下设置:SSSTACK1的段基址,SP栈底单元的偏移量1,本例中SP300H。在堆栈段定义时,未指定组合类型为STACK,这时可用类似于DS、ES填装的办法对SS和SP进行设

15、置。,(3)CS的填装 CS和IP的填装必须在程序执行之前完成,不可由程序自己来实现而是由DOS来实现。源程序结束时,通过END伪指令的参数指明程序运行时起始执行指令的位置,本例中为START,DOS将程序装入内存后,将这一位置的段基址装入CS,偏移量装入IP。4DOS的返回 返回DOS的方法有多种,最常用也是最简单的方法是利用DOS的4CH号功能调用(见5.1中有DOS功能调用的说明)。本例中:MOVAH,4CH INT21H即为此功能而设,这二条指令执行后应用程序结束,其占用的内存被DOS收回,CPU的控制权交还给DOS,这是用户程序执行的最后二条指令。5源程序结束伪指令END 格式:EN

16、D起始地址 功能:告知汇编程序,源程序就此结束。END伪指令后面的任何语句汇编程序都将予以忽略。END伪指令的参数还用于指,定程序的起始位置。4.5地址表达式 地址表达式由常数、变量、标号、用方括号括起的具有间接寻址能力的寄存器、运算符、操作符等构成,其最终结果为存储单元的址。1段属性按如下顺序确定:(1)若地址表达式含有段超越前缀,由段超越前缀决定。(2)若无段超越前缀,但含有变量或标号,变量或标号的段 属性即为表该地址表达式的段属性。(3)既无段超越前缀又不含有变量或标号,由寻址方式中的 隐含规则确定。2偏移属性 地址表达式偏移量为构成地址表达式的各部分偏移量的和。3类型属性按如下顺序确定

17、:(1)地址表达式含有强制类型转换操作符,以指定的类型为准。,(2)若无强制类型转换操作符,但含有变量或标号,变量 或标号的类型属性即为表该地址表达式的类型属性。(3)既无强制类型转换操作符又不含有变量或标号,此时 必须由指令的其它部分来确定类型,若指令的其它部分也 不能确定类型,则是错误用法。4.6宏定义与宏调用4.6.1宏定义 格式:宏名MACRO形式参数表 宏体 ENDM4.6.2宏调用 经宏定义后的宏在源程序中的调用称为宏调用。格式:宏名实参数表4.6.3实例 1无参数宏 例:宏定义:SAVEREGMACRO,PUSH AX PUSH BX PUSH CX ENDM 宏调用:SAVER

18、EG;2带参数宏例:宏定义:ASMACROP1,P2,P3 MOVAX,P1 P2P3 ENDM 宏调用:AS30,INC,AX 这条指令在宏展开后变为:MOVAX,NUM INCAX 宏展开时将宏定义中的实参按位置对应关系替换宏定义中,形参,P1对应“30”,P2对应“INC”,P3对应“AX”。形参也可以是操作码的一部分,这种情况下在宏定义体中必须用“&”作为连接符。例:宏定义:LEAPMACROCOND,LAB J&CONDLAB ENDM 宏调用:LEAPZ,L1 LEAPNZ,L2 这二条宏指令展开后为:JZL1 JNZL2 其中,&是一个操作符,它在宏定义体中可以作为形参的前缀,展开时可以把&前后两个符号合并而形成一个符号,这个符号可以是操作码,操作数或是一个字符串,如上例中将J与COND对应的实参连接成一个操作码。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号