21 微型计算机系统及其工作原理

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第3章MASM伪指令系统3.1汇编语言语句种类与格式3.1.1汇编语言语句的种类汇编语言源程序可以使用如下三类语句:1.指令性语句2.伪指令语句3.宏指令语句3.1.2汇编语言语句的格式指令性语句的格式为:[标号:]指令助记符[操作数[,操作数]][;注释]伪指令语句的格式为:[名字]伪指令定义符[参数,…,参数][;注释]1.标号、名字指令或数据的符号地址。2.助记符、定义符规定指令或伪指令的功能。3.参数参数可分为三类,如下:(1).数值表达式⊙常数:二进制常数、十进制常数、十六进制常数、八进制常数、串常数、十进制科学计数法、十六进制实数⊙算术运算符:+、-、*、/、MOD⊙逻辑运算符:NOT、AND、OR、XOR、SHR和SHL⊙关系运算符:EQ、NE、LT、LE、GT、GE(2).寄存器操作数寄存器操作数就是寄存器的名字,常用于指令性语句中。(3).存储器操作数存储器操作数即存储器的地址,常以一个表达式的形式给出,称为地址表达式。单个的变量、标号或有方括号的基址或变址寄存器是地址表达式的特例。4.注释注释项必须以分号开头。3.2常用伪指令3.2.1符号定义伪指令1.等值语句EQU格式:变量名EQU表达式功能:EQU伪指令告知汇编程序,指令左右的二个量相等,并且用右边表达式的值定义左边的符号。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。2.等号伪指令格式:变量名=表达式功能:“=”伪指令用来为右边的表达式定义一个替代符号,且只能是数值表达式,不能为字符串或地址表达式,“=”伪指令定义的符号允许重复定义。3.2.2数据定义伪指令与变量1.数据定义语句数据定义语句有5条,其格式相同,如下:变量名DB初值表达式变量名DW初值表达式变量名DD初值表达式(其它二种见课本)功能:让汇编程序在内存中划出指定个数的存储单元,然后将这些存储单元与变量名联系起来,并在存储单元中预置初值。DB伪指令定义字节类型变量,其每个初值都占一个字节的存储空间。DW伪指令用来定义字类型变量,其每个初值都占一个字的存储空间。DD伪指令用来定义双字类型变量,其每个初值都占二个字的存储空间。初值表达式决定变量初值的个数,定义变量时可以指定多个初值,从而占据较多的存储空间。多个初值时各个初值间用逗号隔开。初值表达式中可以有常数或常数表达式、字符串、?和带DUP的表达式。例如:B0DB2B1DB3,5,?,9B2DW10H,2DUP(1234H,?)B3DD1,2B4DB0,2DUP(?,1,2DUP(7)这5个变量分配内存情况如图3-1(a)~(e)所示。图4-1DBDWDD初值示意图图3-1DB、DW、DD初值示意图说明:(1)表达式中也可以有用引号引起来的字符串,它表示将字符的ASCII码作为初值。例如:C1DB‘ABCD’C2DW‘AB’,‘B’C3DD‘AB’这三个变量在内存中的存放情况如图3-2(a)~(c)所示.图3-2DB、DW、DD初值示意图(2)对于DW和DD,表达式中也允许是一个变量名或者标号.例:S1DB5S2DWS1S3DDS1内存情况如图3-3所示。2.变量的访问(1)当变量只代表一个数据时,用变量名可直接对其代表的单元进行操作。(2)当变量对应着多个数据时,变量名仅代表其第一个数据项,对其后数据项的存取可用变量名加一偏移量来实现。图3-3变量/标号名作初值3.变量的属性一个变量一经定义就具备了如下三个属性:(1).段属性表示变量对应数据区所在段的段基址。变量在哪个段内定义,其段属性就是哪个段的段基址。(2).偏移属性表示变量对应数据区的段内的偏移量,即从段的起始地址开始到变量对应数据区的第一个存储单元之间的字节数,用16位无符号数表示。变量的段属性与偏移属性构成了变量的逻辑地址。(3).类型属性指变量对应数据项的存取单位,它与变量定义时使用的伪指令有关。如:DB定义的变量,类型为BYTE(字节);DW定义的变量,类型为WORD(字);DD定义的变量,类型为DWORD(双字)等。3.2.3标号及其属性1.标号的概念标号是一条指令的符号地址,它常作为转移指令或子程序调用指令的操作数。标号同变量的区别在于标号代表的是指令代码而变量代表的数据。2.标号的属性标号也是符号地址,同变量类似,也有三个属性。①段属性②偏移属性③类型属性3.标号的定义NEAR类型标号:在指令助记符前写上标号并用冒号分隔,就定义了一个NEAR标号。FAR类型标号:必须借助于其它操作符定义,见下小节。3.2.4析值/属性操作符及符号名定义语句1.析值操作符(1).取偏移地址操作符OFFSET格式:OFFSET变量或标号功能:返回该变量或标号在它段内的偏移地址。(2).取段基址操作符SEG格式:SEG变量或标号功能:返回变量或标号所在段的段基址。(3).取类型操作符TYPE2.属性改变操作符PTR格式:类型PTR地址表达式功能:PTR操作符的作用是将地址表达式的类型属性临时指定为PTR操作符前面的类型,地址表达式的原类型属性将暂时不起作用。地址表达式的形式可以是标号、变量或其它形式的地址,指定的类型可以是BYTE、WORD、DWORD、NEAR和FAR。PRT的用法:⊙说明存储单元的类型MOV[SI],5(×)MOVBYTEPTR[SI],5(√)⊙改变存储单元属性A_BYTEDB1,2,3,4MOVAX,WORDPTRA_BYTE⊙建立FAR标号建立FAR标号一般也要借助于EQU来完成。3.2.5段定义伪指令1.段定义伪指令格式:段名SEGMENT[定位类型][组合类型][‘类别’]…段名ENDS2.汇编程序对段的处理设某源程序定义了三个段,段名分别为WW1、WW2和WW3,如图4-5所示(见下页)。汇编程序对该模块进行汇编时,每遇到一个新名字的段,就在段表中填入其段名,同时为该段配备一个初值为0的地址计数器,凡遇到产生目标代码的语句和所有的指令性语句(NIL除外),都按照它们所需要的字节数在程序地址计数器累计计数,并在相应段的代码区中生成指令代码或在数据区中生成数据。段内定义的所有标号及变量,其偏移地址都是由当前程序地址计数器的值确定。图3-5汇编程序对段的处理3.地址计数器的访问地址计数器的名字为“$”,程序中可以使用或改变其值。3.3程序的段结构在学习了段定义语句之后,我们分析一个简单的汇编语言源程序的结构。DATASEGMENTVARDB12HDATAENDSSTACK1SEGMENTSTACKDB300HDUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACK1START:MOVAX,DATAMOVDS,AXINCVARMOVAH,4CHINT21HCODEENDSENDSTART1.源程序分段结构汇编语言源程序由若干段组成,段是程序的基本构成单位,一般将数据集中放在一个段内,称为数据段.本例中为DATA段;将堆栈所需内存专划为一个段,称为堆栈段.本例中为STACK1段。在堆栈段内定义变量的目的是指定堆栈段的长度;将指令代码集中放在一个段内,称为代码段,本例中为CODE段。一个程序必须有代码段,其它段根据需要定义。2.段假设伪指令ASSUME格式:ASSUME段寄存器名:段名[,段寄存器名:段名,…]功能:ASSUME伪指令设定段和段寄存器的关系,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT/ENDS定义的段名。3.段寄存器的填装ASSUME伪指令仅告诉汇编程序在汇编源程序时假设段寄存器与段存在着这样的对应关系,它不能真正将段基址装入到相应的段寄存器中去。段寄存器的装入是应用程序在运行时实现的,并且4个段寄存器的装入方法有所不同。(1).DS和ES的装入由于段基址不能用MOV指令直接送往段寄存器,所以通过一通用寄存器再送往DS和ES。(2).SS的填装有二个办法:⊙在堆栈段定义时,指定组合类型为“STACK”。示例程序中STACK1段即是这样定义的,当程序代码装入到内存准备执行时,DOS将完成以下设置:SS=STACK1的段基址,SP=栈底单元的偏移量+1,本例中SP=300H。⊙在堆栈段定义时,未指定组合类型为“STACK”,这时可用类似于DS、ES填装的办法对SS和SP进行设置。(3).CS的填装CS和IP的填装必须在程序执行之前完成,不可由程序自己来实现而是由DOS来实现。源程序结束时,通过END伪指令的参数指明程序运行时起始执行指令的位置,本例中为START,DOS将程序装入内存后,将这一位置的段基址装入CS,偏移量装入IP。4.DOS的返回返回DOS的方法有多种,最常用也是最简单的方法是利用DOS的4CH号功能调用(见§5.1中有DOS功能调用的说明)。本例中:MOVAH,4CHINT21H即为此功能而设,这二条指令执行后应用程序结束,其占用的内存被DOS收回,CPU的控制权交还给DOS,这是用户程序执行的最后二条指令。5.源程序结束伪指令END格式:END起始地址功能:告知汇编程序,源程序就此结束。END伪指令后面的任何语句汇编程序都将予以忽略。END伪指令的参数还用于指定程序的起始位置。

1 / 19
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功