版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口汇编语言程序设计汇编语言使用指令的助记符、符号地址和标号等编写的程序设计语言称为汇编语言实际上是机器语言的符号表示(一一对应)应用系统提供的汇编语言,按照规定的语法规则编写的程序称为汇编语言源程序(ASM)将汇编语言源程序经过汇编得到目标程序(OBJ)目标程序经过连接程序连接后才能转换成机器上可执行的程序(EXE)分为:指令语句和伪指令语句指令语句标号:指令助记符操作数;注释标号表示该指令的符号地址,常作为转移指令的操作数,标号后必须加“:”可以用作标号的字符包括英文字母、数字或某些特殊字符第一个字符必须为英文字母或某些特殊字符圆点“.”只能用作第一个字符特殊字符不能单独用作标号系统中已定义的保留字不能作标号指令助记符是指令语句中唯一不可缺少的部分,它表示指令系统中指令的操作码操作数:可以有1个或2个或没有可以由常数、字符或字符串、变量、标号、寄存器和表达式等组成使用BCD码做操作数的指令,其后面一定要紧跟一条调整指令,以便将运算结果调整成BCD数不加后缀的数默认为10进制A~F开头的数前面要加数字0字符串和字符要用单括号括起来注释:前面必须加“;”6标号:是机器指令语句存放地址的符号表示,也可以是子程序名,即子程序入口地址的符号表示;在代码段中定义和引用。标号的属性:①标号的段属性:标号的段属性是指定义该标号所在段的段首址。②标号的偏移地址:标号的偏移地址是指它所在段的段首址到该标号所代表存储单元的字节距离。③标号的类型:分NEAR(近)和FAR(远)两类型,近标号在定义该标号的段内使用,远标号无此限制。伪指令语句又称指示性语句,没有对应得机器码,不能让CPU执行,仅在汇编过程中完成某些特定的功能格式:名字伪指令指示符操作数;注释名字是给伪指令语句起的名称,用符号地址表示,名字的格式要求与标号类似,也可以省略,有些语句不能省略,名字后面不能跟“:”伪指令指示符:·变量定义伪指令:DB,DW,DD,…·符号定义伪指令:EQU,=,NAME·段定义伪指令:SEGMENT,ENDS·段分配伪指令:ASSUME·过程定义伪指令:PROC…ENDP·程序结束语句:END8常量C语言中的常量定义:#definepi=3.1415926常量的基本概念:汇编时已有确定的数值的量(不是程序运行的时候才能确定的)。●用途:
.机器指令语句中的立即操作数;.也可作存贮器操作数的组成部分(位移量V);.在数据定义伪指令语句中给变量赋初值;●
分类:数值常量、符号常量9符号常量的定义:
等价伪指令EQU
等号伪指令=使用:定义后直接引用符号名。注意:
①符号常量不分配存贮单元,只建立等价代换关系,可出现在任何段。
②用EQU语句定义的符号常量在该程序中不能再重新赋值,而用“=”定义的符号常量可多次重新赋值,使用时,以最后一次定义的值为准。特点:①在汇编期间被代换成相应等价的数据;②提高程序的可读性;③便于随时修改程序中的参数。10数值表达式:常量与运算符(算术运算、逻辑运算、关系运算)组成的有确定意义的式子。①算术运算+、–、*、/、MOD(模除,取余数)、SHR(右移)、SHL。移位的特别说明:表示将二进制常量右移或左移运算符右边所规定的次数(正整数),所空出的位数均补0。②逻辑运算逻辑乘:AND(与)逻辑加:OR(或)
按位加:XOR(异或)
逻辑非:NOT(非)③关系运算相等: EQ不等: NE
小于: LT大于: GT
小于等于:LE大于等于: GE
结果为:0(关系不成立)或者0FFFFH(关系成立)数值表达式的运算时机汇编期间进行,运算的结果为一数值常量,汇编程序将数值表达式直接替换为结果数值常量。MOVAX,1+2变量的定义一般在数据段或附加数据段中使用数据定义伪指令DB、DW、DD、DQ和DT来定义格式:[变量名]数据定义伪指令表达式[,…]功能:定义了一变量,并开辟了由变量属性所决定的一片连续存储区,其存储区所占字节数=表达式个数*变量的类型。变量的类型:存储单元的大小,由数据定义伪指令定义。变量:是数据段或附加数据段中一个数据存贮单元的名字,是这个存储单元的地址的符号表示。变量代表一个存储单元,也就有变量的偏移地址和单元中的内容说法。13
数据类型:类型是指存取该变量中的数据所需要的字节数,变量的类型由定义该变量时所使用的伪指令确定。变量的三个属性:
段属性:定义变量所在段的段首址,当访问该变量时,该段首址应在某一段寄存器中,即为CPU当前可访问段;
偏移地址:该变量所占存储单元到所在段的段首址的字节距离;变量、标号与地址表达式——变量14●定义:汇编源程序中控制汇编程序应如何工作的命令是伪指令,或称汇编控制命令。●工作原理:
.只为汇编程序所识别
.每一条汇编控制命令都对应着一段处理程序,
.汇编程序每遇到汇编控制命令,即转入对应的处理程序执行,执行完该处理程序,也就实现了这条汇编控制命令的功能。(汇编程序运行时,执行伪指令)●结果:
.可以申请分配一部分存贮空间用作数据区和堆栈
.没有对应的机器代码;
.在将源程序翻译成目标程序后,伪指令就不存在了。伪指令的基本概念15●问题:伪指令与机器指令的区别?(1)功能不同,机器指令控制CPU的工作,伪指令控制汇编程序工作。(2)格式不同,机器指令标号后面带冒号,而伪指令的名字后面没有。(3)被执行时CPU所处状态不同,用户程序在运行时执行机器指令,汇编程序运行时,执行伪指令。(4)机器指令是用硬件线路来实现其功能的,它有目的代码。而伪指令是用来控制汇编程序操作的,是用程序来实现其功能的,它在汇编期间被执行,在目的代码中已不存在了。16段定义伪指令●格式:
段名
SEGMENT
[定位方式][组合方式][‘类别’]┇
段名
ENDS●功能:定义一个以SEGMENT伪指令开始、ENDS伪指令结束的、给定段名的段。段名为该段的名字,用来指出汇编程序为该段分配存贮区的起始位置。一个程序模块可以由若干段组成;段名可以各不相同,也可以重复;汇编程序将一个程序中的同名段处理成一个段;段的定义可以嵌套,但不能交叉。8086方式中段的大小只能为64KB;.386及以上处理器选择伪指令,段使用类型默认为USE32。所以在实方式和虚拟8086方式中必须指明USE16,只有保护模式才能使用32位的段。1)align_type(定位类型):用LINK程序将各个段相互衔接起来,两段之间如何连接用定位类型来确定表明该段起始位置在内存中的对齐类型Para(默认)
指定该段从一个小段(16字节)的边界开始;byte指定该段从任一位置开始;word指定该段从一个字边界开始;page指定该段从一个页(256字节)的边界开始。2)combine_type(组合类型):用来告诉LINK程序本段与其他段的关系指出不同程序模块中具有相同段名的分段的连接类型public表示该段在连接时,将与有相同名字的其他分段连接在一起,段基地址相同,但偏移量不同;common表示该段连接时将与其他同名分段重叠覆盖,偏移地址名称不同;stack表示该段是堆栈段,连接时不同模块中的堆栈段连接在一起;None(默认)表示本段不与其他段连接,各段有独自的段基地址和偏移量;Memory该段在连接时被放在所有段的最后(最高地址)AT告诉连接程序将本段装在表达式的值所指定的段基地址处3)‘class’(类别):使LINK程序将所有分类名相同的逻辑段组成一个段组当连接两个源模块时,具有相同‘class’名的两个段在存储器中的位置是紧靠在一起的,但两个段并不会合并成一个段。需用单引号括起来。例:’STACK’,’CODE’,’DATA’。18段定义应注意的问题●一个程序模块可以由若干段组成,段名可以各不相同,也可以重复,汇编程序将一个程序中的同名段处理成一个段;●段的定义还可以嵌套,但不能交叉;●8086方式中段的大小只能为64KB;●.386及以上处理器选择伪指令,段使用类型默认为USE32。所以在实方式和虚拟8086方式中必须指明USE16,只有保护模式才能使用32位的段。
22假定伪指令●格式:ASSUME
段寄存器:段名
…●功能:用来设定段寄存器与段之间的对应关系,即告诉汇编程序,该段中的变量或标号用哪个段寄存器作段首址指示器。注意:在代码段的开始,就要用ASSUME语句建立CS、SS与代码段、堆栈段的对应关系,否则就会出错。ASSUME语句是一条伪指令,并未将段首址置入对应的段寄存器中,这一工作要到目标程序最后投入运行时CS和SS的内容将由系统自动设置,不用用户程序处理。对于数据段和附加数据段,必须由用户程序自行将段首址放入DS和ES中,一旦在程序中用ASSUME假设或重新假设了DS或ES与某个数据段的关系,下面就要将新段首址放入DS或ES中。否则的话即使语法没有错误,执行结果也不对。对于数据段和附加数据段,若用ASSUME语句建立它们与DS、ES的关系,则其后语句如需访问这些段内的变量,均可直接使用段内寻址,而不必带跨段前缀;对于数据段和附加数据段,若不用ASSUME语句建立它们与DS、ES的对应关系,则其后语句如需访问这些段内的变量,都必须带跨段前缀才可使用段内寻址.233.源程序结束伪指令格式:END
[表达式]功能:该语句为汇编源程序的最后一个语句,用
以标志源程序的结束。即告诉汇编程序
翻译到此为止。表达式指出了该程序运行时,第一条被执行指令的地址。如果不带表达式,说明该程序是一个子模块,不能单独执行,往往供另外的程序调用。注意:不可将END语句错误地安排在程序中间.END后面的语句就不可能被翻译成目标代码了。24数据定义伪指令:DB、DW、DD、DQ、DT指定变量的类型
.BYTE(字节)DB.WORD(字)DW.DWORD(双字)DD.FWORD(3个字)
DF.QWORD(4个字)DQ.TBYTE(10个字节)
DT
例:
BUF
DB
‘ABCD12EF……’
;
BUF的类型为字节
ARR
DW10,-60,189;ARR的类型为字
TT
DD0A57BD36H;TT的类型为双字
K
DB1234H4.变量定义伪指令25变量定义中的表达式,指定了变量的初值:(i)常量或数值表达式(ii)ASCII字符串(DB定义时,长度可以超过2个字符)
例:NAMEDB‘Hello’ADD‘ABC’
;错误BDW‘AB’
;与CDB‘AB’
不同(iii)地址表达式(只适用DW和DD两个伪指令)(iv)?表示变量值不确定(v)重复子句:nDUP(表达式),表示定义了n个数据存储单元(vi)上述(i)~(v)组成的系列,各表达式之间用逗号隔开。表达式例:BDW1+226
地址表达式:由变量、标号、常量、[R]和运算符组成的有意义的式子,顾名思义其作用是表示地址。
在数据定义语句中,不能出现带寄存器符号的地址表达式。数据定义伪指令只能用DW和DD,不能为其它类型。DW地址表达式
当地址表达式含变量名时,初值取变量EA;
例:ADWB;B为变量,则A的初始值为B的偏移地址DD地址表达式
当地址表达式含变量名时,初始值取变量的EA,变量所在段的段首址
例:ADDB;B为变量,则A的初始值为B的偏移地址,段首址地址表达式27①表达式的个数(包括(v)中的重复因子n)确定了存储单元的个数。②
这一片连续的数据存储单元也称数据存储区,其类型由数据定义伪指令确定③在定义一个数据存储区时:
◆变量仅代表该区的第一个数据存储单元;
◆整个数据存储区的类型均与变量相同;
◆建立了一个以变量为首址的数据存储区或以变量为名的数组表达式(注意)28数据段定义的例子数据段定义如下:
DATASEGMENTUSE16ADW MBUFDB 'AB',0DH,0AH
CONEQU 500HB DW 0FFAAH
MARK=100HD DDBUFMDB2DUP(1),2DUP(2,’B’),’123’,1DATAENDS请画出数据段中的数据在主存中的存储形式。0CH0H41H42H0DH0AAH0AHDATA0FFH11242H231H42H32H33H
BUF
A
D1
M2H0H
B29●变量仅代表该区的第一个数据存储单元;●整个数据存储区的类型均与变量相同(类似于定义了以变量为名字的数组);●伪指令EQU及“=”不分配存贮单元;●
使用直接寻址方式时,变量的类型必须与
指令的要求相符;例:
ADB1
BDW1MOVAL,BPUSHA●
变量的段必须是当前段。本例中的注意事项30地址表达式的属性:地址表达式的结果是一偏移地址,因此具备段属性、偏移地址和类型。
地址表达式是由变量、标号、常量、寄存器(名加方括号)及一些运算符(数值表达式的运算符和特殊运算符)所组成的有意义的式子。问题:变量定义中,给变量置初始值的地址表达式可以含寄存器符号加方括号吗?例如变量定义:ADW[BX]是否正确?不正确,因为数据定义伪指令DW是指导汇编程序确定变量的初始值的,在汇编过程中计算,这时最后的可执行程序还没有执行,BX的值是没有意义的。31
●
地址表达式的结果:是一偏移地址,它具有段属性、偏移地址和类型(一个表达式中一般只出现一个变量或标号)。
●
数值表达式的结果:只有大小,无属性。
●
在特殊情况下(没有用到寄存器、不作为地址访问),地址表达式的值也可能仅表示一个数值(没有属性)。
例:在变量/常量定义中给变量/常量赋值,
或在OFFSETBUF+2语句中)
NUMDWBUF1-BUF2
(此时可以有多个变量或标号)地址表达式与数值表达式区别32●格式:属性分离算符
变量或标号●功能:属性分离算符可分离出变量、标号的段、
偏移地址、类型的属性值。运算结果为数值常量。a.取段址算符SEG
●格式:SEG<变量或标号>●功能:分离出其后变量或标号的段首址。b.取偏移算符OFFSET
●格式:OFFSET<变量>
●功能:分离出其后变量或标号的偏移地址。特殊运算符——属性分离算符33
●
格式:类型
PTR
地址表达式
类型可以是BYTE、WORD、DWORD、FWORD、NEAR、FAR
●
功能:
用来指明紧跟其后的地址表达式的类型属性,但保持它原来的段属性和偏移地址属性不变或者使它们临时兼有与原定义所不同的类型属性。
●作用1:使语句中类型模糊的操作数类型变得明确
ADDBYTEPTR[SI],5ADDWORDPTR[SI],5
●
作用2:临时改变某一操作数地址的类型,使得类型不一致的两地址变为一致。
●作用3:PTR运算符还可以与EQU或等号“=”等伪指令连用,用来将同一存储区地址用不同类型的变量或标号来表示。
特殊运算符——类型运算符PTR34a.PTR临时赋予地址表达式的新类型只能在本语句中有效。b.不带方括号的寄存器符号不是地址表达式,不能用PTR改变寄存器的类型使用PTR注意事项:35DATASEGMENTBEQUTHISBYTEADD44332211HWDW0FFFFHCEQUWORDPTRADATAENDS112233440FF0FFB,CAW类似于PTR,指定下一个能分配的存储单元(当前存储单元)的类型,往往与伪指令EQU或者=连用,为当前存储单元定义一个指定类型的变量或标号。
特殊运算符——定义类型算符THIS36THIS与PTR用法的区别:①带有THIS的语句一定要放在定义存储单元伪指令语句的前面,定义存储单元的语句不一定有变量名。带有PTR的语句可以放在任意位置,但是它只能将指定名字的存储区重新定义为新的类型。②
THIS只用于定义,不能象PTR一样临时改变地址表达式的类型。 MOVAL,BYTEPTRA特殊运算符——定义类型算符THIS37(1)指令中的地址表达式不允许出现不带方括号的寄存器符号;例:MOVAX,SI+4——错误语句,MOVAX,[SI+4]——正确语句(2)在定义变量时,其后表达式不能带寄存器符号和方括号;
例:ADWSI+4,[SI+4]——错误(3)数值表达式中如果有变量和标号,均是取其EA参加运算。使用地址表达式注意事项38置汇编地址计数器伪指令
汇编地址计数器:$(现行地址偏移量)汇编程序在将源程序翻译成目标程序时,每遇到一个新的段,就将汇编地址计数器置0。然后,再对该段中的语句汇编。在汇编过程中,对凡是需要申请分配存储单元的语句和产生目标代码的语句,汇编地址计数器则按该语句目标代码的长度增值。$用来记录正在被汇编程序翻译的语句的地址,即$的内容指明了汇编程序当前的工作位置。
标号和变量的偏移地址就是准备翻译该语句时当前汇编地址计数器$的值。汇编地址计数器符号$可出现在表达式中。
39特殊运算符——ORG●格式:ORG<数值表达式>
表达式的值为0~65535(16位段)0~4G(32位段)●功能:给它下面一条语句指定起始偏移地址例:
DATASEGMENTUSE16ORG5;空了五个字节ADB‘ABCD’
;A的EA为5BEQU$-A;B的值为4ORG$+3;空三个字节CDW15,20,……;C的EA为12
DATAENDS
A
C
‘A’‘B’‘C’‘D’15002000定义类型伪指令——LABEL格式:名字LABEL类型功能:将LABEL左边的名字定义为其右边的类型模块连接伪指令——PUBLIC和EXTRNPUBLIC用于将标号、变量或数据定义为公共的,可供其他程序块使用,否则别的模块不能引用它。EXTRN用于引用其他模块中已用PUBLIC伪指令定义过的标号和变量。ORG伪指令功能:给它下面一条语句指定起始地址例:
DATASEGMENTUSE16ORG5;空了五个字节
ADB‘ABCD’;A的EA为5BEQU$-A;B的值为4ORG$+3;空三个字节
CDW15,20,……;C的EA为12DATAENDS常用ASM-8086伪指令如下:1.数据定义伪指令:DB、DW、DD、DQ、DT
分别以字节、字、双字、8个字节、10个字节为单位定义数据,例:vardw100H,200H;表示以字为单位定义2个数据strdb‘Hello’;给出带单引号的字符等于给出了字符的ASCII码addr1dwstr;将变量str所代表的偏移地址赋给变量addr1addr2ddstr ;将变量str所代表的偏移地址和段地址赋给addr22.指定起始位置伪指令:ORG
ORG20H ;指定下一个数据或代码从0020H开始存放3.重复表达式伪指令:DUP
bufdb10dup(?);表示以字节为单位定义数据,重复10次,即定义10个数据,()表示重复的内容,?表示只分配存储单元,但不赋初值5.赋值伪指令:EQU类似于C语言中的define,不分配存储单元AAAEQU10;以符号AAA表示数据10,编译时把程序中所有出现;AAA的地方用10替换,也可用
AAA=10
表示BBBEQUAAA;用符号BBB表示另一个符号AAA6.段定义及程序定义伪指令:segment/endproc/endpfar/near7.程序结束伪指令:END表示整个程序结束8.类型说明伪指令:byteptr,wordptr,dwordptr,nearptr,farptr9.其他伪指令:OFFSET ;析取变量、标号和过程名的偏移量SEG ;析取变量、标号和过程名的段地址TYP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2025学年重庆市沙坪坝区大学城三中九年级(上)第一次调研数学试卷(含答案)
- 河南申论模拟138
- 辽宁公务员面试模拟75
- “双减”背景下薄弱初中学校教师专业技能提升的三种途径
- 2012年4月25日上午面试真题
- 湖北公共基础知识模拟14
- 团活动心得体会22篇
- 2019年安徽公务员考试申论真题B类
- 第24章 解直角三角形 复习和小结 华师大版数学九年级上册课件
- 广东公务员面试模拟25
- 高效能会议管理制度
- 2024年安全员-C3证考试题库及答案
- 食管手术配合
- DL∕T 817-2014 立式水轮发电机检修技术规程
- 2024-2030年中国智能SCADA系统市场运行状况与前景展望研究研究报告
- 2、中国六大茶类 (1)课件讲解
- 机电材料见证取样复试
- 2024-2030年中国晶圆键合机行业市场发展趋势与前景展望战略分析报告
- 红薯苗销售合同范本
- 招聘工作人员笔试考务手册
- 2024年广东省公需课《百县千镇万村高质量发展工程与城乡区域协调发展》考试答案
评论
0/150
提交评论