




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章MASM伪指令系统4.2汇编语言语句种类与格式4.2.1汇编语言语句的种类汇编语言源程序可以使用如下三类语句:1指令性语句2伪指令语句3宏指令语句4.2.2汇编语言语句的格式由于宏指令实质上不是一类语句,故我们主要分析指令性语句和伪指令语句的格式。指令性语句的格式为:标号:指令助记符操作数,操作数;注释伪指令语句的格式为:名字伪指令定义符参数,参数;注释1标号、名字指令或数据的符号地址。,2助记符、定义符规定指令或伪指令的功能。3参数参数可分为三类,如下:(1)数值表达式常数宏汇编中允许使用如下几种常数:二进制常数、十进制常数、十六进制常数、八进制常数、串常数、十进制科学计数法、十六进制实数算术运算符算术运算符有、*、/、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伪指令告知汇编程序,指令左右的二个量相等,并且用右边表达式的值定义左边的符号。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。2等号伪指令格式:变量名表达式功能:“”伪指令用来为右边的表达式定义一个替代符号,,且只能是数值表达式,不能为字符串或地址表达式,“”伪指令定义的符号允许重复定义。4.3.2数据定义伪指令与变量1数据定义语句数据定义语句有5条,其格式相同,如下:变量名DB初值表达式变量名DW初值表达式变量名DD初值表达式变量名DQ初值表达式变量名DT初值表达式功能:让汇编程序在内存中划出指定个数的存储单元,然后将这些存储单元与变量名联系起来,并在存储单元中预置初值。DB伪指令定义字节类型变量,其每个初值都占一个字节的存储空间。DW伪指令用来定义字类型变量,其每个初值都占一个字的存储空间。DD伪指令用来定义双字类型变量,其每个初值都占二个字的存储空间。,DQ伪指令用来定义四字类型变量,其每个初值都占四个字的存储空间。DT伪指令用来定义十字节类型变量,其每个初值都占五个字的存储空间。初值表达式:初值表达式决定变量初值的个数,定义变量时可以指定多个初值,从而占据较多的存储空间。多个初值时各个初值间用逗号隔开。初值表达式中可以有常数或常数表达式、字符串、?和带DUP的表达式。例如:B0DB2B1DB3,5,?,9B2DW10H,2DUP(1234H,?)B3DD1,2B4DB0,2DUP(?,1,2DUP(7)这5个变量分配内存情况如图4-1(a)(f)所示(见下页)。,图41DBDWDD初值示意图,说明:(1)表达式中也可以有用引号引起来的字符串,它表示将字符的ASCII码作为初值。例如:C1DBABCDC2DWAB,BC3DDAB这三个变量在内存中的存放情况如图4-2(a)(c)所示.图4-2DBDWDD初值示意图,(2)对于DW和DD,表达式中也允许是一个变量名或者标号.DW伪指令将变量或标号的偏移量作为初值置入存储区,而DD伪指令则把变量或标号的段基址与偏移量作为初值置入存储区。例:S1DB5S2DWS1S3DDS1内存情况如图43所示。2变量的访问(1)当变量只代表一个数据时,用变量名可直接对其代表的单元进行操作。(2)当变量对应着多个数据时,变量名仅代表其第一个数据项,对其后数据项的存取可用变量名加一偏移量来实现。3变量的属性一个变量一经定义就具备了如下三个属性:图4-3变量/标号名作初值,(1)段属性表示变量对应数据区所在段的段基址。变量在哪个段内定义,其段属性就是哪个段的段基址。(2)偏移属性表示变量对应数据区的段内的偏移量,即从段的起始地址开始到变量对应数据区的第一个存储单元之间的字节数,用16位无符号数表示。变量的段属性与偏移属性构成了变量的逻辑地址。(3)类型属性指变量对应数据项的存取单位,它与变量定义时使用的伪指令有关。如:DB定义的变量,类型为BYTE(字节);DW定义的变量,类型为WORD(字);DD定义的变量,类型为DWORD(双字)等。4.3.3标号及其属性1标号的概念标号是一条指令的符号地址,它常作为转移指令或子程序调用指令的操作数。标号同变量的区别在于标号代表的是指,令代码而变量代表的数据。2标号的属性标号也是符号地址,同变量类似,也有三个属性。段属性偏移属性类型属性3标号的定义NEAR类型标号:在指令助记符前写上标号并用冒号分隔,就定义了一个NEAR标号。FAR类型标号:必须借助于其它操作符定义,见下小节。4.3.4析值/属性操作符及符号名定义语句1析值操作符(1)取偏移地址操作符OFFSET格式:OFFSET变量或标号功能:返回该变量或标号在它段内的偏移地址。(2)取段基址操作符SEG格式:SEG变量或标号功能:返回变量或标号所在段的段基址。(3)取类型操作符TYPE,格式:TYPE变量或标号功能:当TYPE操作符置于变量前面时,得到变量的类型数字,该数字表示该变量所分配的存储单元的字节数;当TYPE操作符置于标号前面时,返回标号的类型属性值。(4)取变量存储区长度操作符LENGTH格式:LENGTH变量功能:LENGTH操作符只对变量起作用,它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定。如果第一个表达式为重复子句“nDUP(表达式)”,则返回外层DUP操作符前面的重复因子n;如果为其它形式的表达式,则返回值为1。(5)取变量对应数据存储区大小操作符SIZE格式:SIZE变量功能:SIZE操作符仅对变量起作用,返回LENGTH变量TYPE变量之积。2属性操作符属性操作符用于临时改变地址表达式的类型属性,有2个.,(1)操作符PTR格式:类型PTR地址表达式功能:PTR操作符的作用是将地址表达式的类型属性临时指定为PTR操作符前面的类型,地址表达式的原类型属性将暂时不起作用。地址表达式的形式可以是标号、变量或其它形式的地址,指定的类型可以是BYTE、WORD、DWORD、NEAR和FAR。PRT的用法:说明存储单元的类型改变存储单元属性建立FAR标号建立FAR标号一般也要借助于EQU来完成。(2)THIS操作符格式:THIS类型功能:指定从该语句开始下一个可分配的存储单元的类型,它常与EQU连用。THIS操作符可以方便地建立FAR标号。,3定义符号名伪指令LABEL格式:符号名LABEL类型功能:定义由符号名指定的符号,使该符号的段属性与偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同,并具有类型参数所指定的类型。类型可以是BYTE、WORD、DWORD、NEAR和FAR。4.3.5段定义伪指令1段定义伪指令格式:段名SEGMENT定位类型组合类型类别段名ENDS2汇编程序对段的处理设某源程序定义了三个段,段名分别为WW1、WW2和WW3,如图45所示(见下页)。汇编程序对该模块进行汇编时,每遇到一个新名字的段,就在段表中填入其段名,同时为该段配备一个初值为0的地址计数器,凡遇到产生目标代码的语句和所有的指令性语句(NIL除外),都按照它们所需要的字节数在程序地址计数器累,计计数,并在相应段的代码区中生成指令代码或在数据区中生成数据。段内定义的所有标号及变量,其偏移地址都是由当前程序地址计数器的值确定。图4-5汇编程序对段的处理,3地址计数器的访问地址计数器的名字为“$”,程序中可以使用或改变其值。例(略)4.4程序的段结构在学习了段定义语句之后,我们分析一个简单的汇编语言源程序的结构。DATASEGMENTVARDB12HDATAENDSSTACK1SEGMENTSTACKDB300HDUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXINCVAR,MOVAH,4CHINT21HCODEENDSENDSTART1源程序分段结构汇编语言源程序由若干段组成,段是程序的基本构成单位,一般将数据集中放在一个段内,称为数据段.本例中为DATA段;将堆栈所需内存专划为一个段,称为堆栈段.本例中为STACK1段。在堆栈段内定义变量的目的是指定堆栈段的长度;将指令代码集中放在一个段内,称为代码段,本例中为CODE段。一个程序必须有代码段,其它段根据需要定义。2段假设伪指令ASSUME格式:ASSUME段寄存器名:段名,段寄存器名:段名,功能:ASSUME伪指令设定段和段寄存器的关系,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT/ENDS定义的段名。在程序的代码段中可以多次使用ASSUME伪指令,则新设置,的“段寄存器:段名”的对应关系将取代以前的设置。3段寄存器的填装ASSUME伪指令仅告诉汇编程序在汇编源程序时假设段寄存器与段存在着这样的对应关系,它不能真正将段基址装入到相应的段寄存器中去。段寄存器的装入是应用程序在运行时实现的,并且4个段寄存器的装入方法有所不同。(1)DS和ES的装入由于段基址不能用MOV指令直接送往段寄存器,所以通过一通用寄存器再送往DS和ES。(2)SS的填装有二个办法:在堆栈段定义时,指定组合类型为STACK。示例程序中STACK1段即是这样定义的,当程序代码装入到内存准备执行时,DOS将完成以下设置:SSSTACK1的段基址,SP栈底单元的偏移量1,本例中SP300H。在堆栈段定义时,未指定组合类型为STACK,这时可用类似于DS、ES填装的办法对SS和SP进行设置。,(3)CS的填装CS和IP的填装必须在程序执行之前完成,不可由程序自己来实现而是由DOS来实现。源程序结束时,通过END伪指令的参数指明程序运行时起始执行指令的位置,本例中为START,DOS将程序装入内存后,将这一位置的段基址装入CS,偏移量装入IP。4DOS的返回返回DOS的方法有多种,最常用也是最简单的方法是利用DOS的4CH号功能调用(见5.1中有DOS功能调用的说明)。本例中:MOVAH,4CHINT21H即为此功能而设,这二条指令执行后应用程序结束,其占用的内存被DOS收回,CPU的控制权交还给DOS,这是用户程序执行的最后二条指令。5源程序结束伪指令END格式:END起始地址功能:告知汇编程序,源程序就此结束。END伪指令后面的任何语句汇编程序都将予以忽略。END伪指令的参数还用于指,定程序的起始位置。4.5地址表达式地址表达式由常数、变量、标号、用方括号括起的具有间接寻址能力的寄存器、运算符、操作符等构成,其最终结果为存储单元的址。1段属性按如下顺序确定:(1)若地址表达式含有段超越前缀,由段超越前缀决定。(2)若无段超越前缀,但含有变量或标号,变量或标号的段属性即为表该地址表达式的段属性。(3)既无段超越前缀又不含有变量或标号,由寻址方式中的隐含规则确定。2偏移属性地址表达式偏移量为构成地址表达式的各部分偏移量的和。3类型属性按如下顺序确定:(1)地址表达式含有强制类型转换操作符,以指定的类型为准。,(2)若无强制类型转换操作符,但含有变量或标号,变量或标号的类型属性即为表该地址表达式的类型属性。(3)既无强制类型转换操作符又不含有变量或标号,此时必须由指令的其它部分来确定类型,若指令的其它部分也不能确定类型,则是错误用法。4.6宏定义与宏调用4.6.1宏定义格式:宏名MACRO形式参数表宏体ENDM4.6.2宏调用经宏定义后的宏在源程序中的调用称为宏调用。格式:宏名实参数表4.6.3实例1无参数宏例:宏定义:SAVEREGMACRO,PUSHAXPUSHBXPUSHCXENDM宏调用:SAVEREG;2带参数宏例:宏定义:ASMACROP1,P2,P3MOVAX,P1P2P3ENDM宏调用:AS30,INC,AX这条指令在宏展开后变为:MOVAX,NUMINCAX宏展开时将
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智源小学测试题及答案
- 化工常用面试题及答案
- 慢性病健康管理培训
- 呼吸内科2025年工作总结
- 阑尾炎病人术后健康指导
- 员工培训发展
- 智能化工程验收规范培训
- 儿科急性喉炎课件
- 中班健康身体的小秘密
- 支气管肺炎的病理变化
- 2025年人教部编版语文五年级下册期末检测真题及答案(2套)
- 《中医养生学》课件-八段锦
- 【MOOC】电路分析基础-北京邮电大学 中国大学慕课MOOC答案
- 湖南省长沙市雨花区2023-2024学年五年级下学期期末考试英语试题
- 二年级《时间单位换算口算题(共100道)》专题练习训练
- 病理科-生物安全管理制度
- 空压机保修手册
- 光伏并网建模与仿真
- 工业机器人编程与实操期末精彩试题
- 管片破损修补及接缝渗漏水防治施工方案
- 《声音的数字化》PPT课件.ppt
评论
0/150
提交评论