第4章:)汇编语言程序设计_第1页
第4章:)汇编语言程序设计_第2页
第4章:)汇编语言程序设计_第3页
第4章:)汇编语言程序设计_第4页
第4章:)汇编语言程序设计_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、微机原理与接口汇编语言程序设计汇编语言 使用指令的助记符、符号地址和标号等编写的程序设计语言称为汇编语言 实际上是机器语言的符号表示(一一对应) 应用系统提供的汇编语言,按照规定的语法规则编写的程序称为汇编语言源程序(ASM) 将汇编语言源程序经过汇编得到目标程序(OBJ) 目标程序经过连接程序连接后才能转换成机器上可执行的程序(EXE) 分为:指令语句和伪指令语句指令语句标号:指令助记符 操作数 ;注释标号表示该指令的符号地址,常作为转移指令的操作数,标号后必须加“:” 可以用作标号的字符包括英文字母、数字或某些特殊字符 第一个字符必须为英文字母或某些特殊字符 圆点“.”只能用作第一个字符

2、特殊字符不能单独用作标号 系统中已定义的保留字不能作标号指令助记符是指令语句中唯一不可缺少的部分,它表示指令系统中指令的操作码操作数:可以有1个或2个或没有 可以由常数、字符或字符串、变量、标号、寄存器和表达式等组成 使用BCD码做操作数的指令,其后面一定要紧跟一条调整指令,以便将运算结果调整成BCD数 不加后缀的数默认为10进制 AF开头的数前面要加数字0 字符串和字符要用单括号括起来注释:前面必须加“;”6标号:是机器指令语句存放地址的符号表示,也可以是子程序名,即子程序入口地址的符号表示;在代码段中定义和引用。标号的属性: 标号的段属性:标号的段属性是指定义该标号所在段的段首址。 标号的

3、偏移地址:标号的偏移地址是指它所在段的段首址到该标号所代表存储单元的字节距离。 标号的类型: 分NEAR(近)和FAR(远)两类型,近标号在定义该标号的段内使用,远标号无此限制。伪指令语句 又称指示性语句,没有对应得机器码,不能让CPU执行,仅在汇编过程中完成某些特定的功能 格式:名字 伪指令指示符 操作数 ;注释 名字是给伪指令语句起的名称,用符号地址表示,名字的格式要求与标号类似,也可以省略,有些语句不能省略,名字后面不能跟“:” 伪指令指示符: 变量定义伪指令: DB, DW, DD, 符号定义伪指令: EQU, =, NAME 段定义伪指令: SEGMENT, ENDS 段分配伪指令:

4、ASSUME 过程定义伪指令: PROC ENDP 程序结束语句:END8常量C语言中的常量定义:#define pi=3.1415926常量的基本概念:汇编时已有确定的数值的量(不是程序运行的时候才能确定的) 。用途: . 机器指令语句中的立即操作数; . 也可作存贮器操作数的组成部分(位移量V); . 在数据定义伪指令语句中给变量赋初值; 分类:数值常量、符号常量9符号常量的定义:等价伪指令 EQU等号伪指令 = 使用:定义后直接引用符号名。 注意: 符号常量不分配存贮单元,只建立等价代换关系, 可出现在任何段。 用EQU语句定义的符号常量在该程序中不能再重新赋值,而用“=”定义的符号常量

5、可多次重新赋值,使用时,以最后一次定义的值为准。 特点: 在汇编期间被代换成相应等价的数据; 提高程序的可读性; 便于随时修改程序中的参数。10数值表达式:常量与运算符(算术运算、逻辑运算、关系运算)组成的有确定意义的式子。算术运算 +、*、/、MOD(模除, 取余数)、SHR(右移)、SHL。 移位的特别说明:表示将二进制常量右移或左移运算符右边所规定的次数(正整数),所空出的位数均补0。逻辑运算 逻辑乘:AND (与) 逻辑加:OR (或) 按位加:XOR (异或) 逻辑非:NOT (非)关系运算 相等: EQ 不等: NE 小于: LT 大于: GT 小于等于: LE 大于等于: GE

6、结果为:0 (关系不成立)或者0FFFFH (关系成立) 数值表达式的运算时机 汇编期间进行,运算的结果为一数值常量,汇编程序将数值表达式直接替换为结果数值常量。 MOV AX, 1+2变量的定义 一般在数据段或附加数据段中使用数据定义伪指令 DB、DW、DD、DQ和DT来定义 格式: 变量名 数据定义伪指令 表达式, 功能: 定义了一变量,并开辟了由变量属性所决定的一 片连续存储区,其存储区所占字节数=表达式个数*变量的类型。 变量的类型:存储单元的大小,由数据定义伪指令定义。 变量:是数据段或附加数据段中一个数据存贮单元的名字,是这个存储单元的地址的符号表示。 变量代表一个存储单元,也就有

7、变量的偏移地址和单元中的内容说法。13 数据类型数据类型:类型是指存取该变量中的数据所需要的:类型是指存取该变量中的数据所需要的字字节数节数,变量的类型由定义该变量时所使用的,变量的类型由定义该变量时所使用的伪指令确伪指令确定定。变量变量的三个属性:的三个属性: 段属性段属性:定义变量所在段的:定义变量所在段的段首址段首址,当访问该变量时,当访问该变量时,该段首址应在某一段寄存器中,即为该段首址应在某一段寄存器中,即为CPUCPU当前当前可访问段可访问段; 偏移地址偏移地址:该变量所占存储单元到所在段的段首址的:该变量所占存储单元到所在段的段首址的字节距离字节距离;变量变量、标号与地址表达式、

8、标号与地址表达式变量变量14定义:汇编源程序中控制汇编程序应如何工作的命令是伪指令,或称汇编控制命令。工作原理: .只为汇编程序所识别 .每一条汇编控制命令都对应着一段处理程序, .汇编程序每遇到汇编控制命令,即转入对应的处理程序执行,执行完该处理程序,也就实现了这条汇编控制命令的功能。(汇编程序运行时,执行伪指令)结果: .可以申请分配一部分存贮空间用作数据区和堆栈 .没有对应的机器代码; .在将源程序翻译成目标程序后,伪指令就不存在了。伪指令的基本概念15问题:伪指令与机器指令的区别? (1) 功能不同,机器指令控制CPU的工作,伪指令控制汇编程序工作。 (2)格式不同,机器指令标号后面带

9、冒号,而伪指令的名字后面没有。 (3)被执行时CPU所处状态不同,用户程序在运行时执行机器指令,汇编程序运行时,执行伪指令。 (4)机器指令是用硬件线路来实现其功能的,它有目的代码。而伪指令是用来控制汇编程序操作的,是用程序来实现其功能的,它在汇编期间被执行,在目的代码中已不存在了。161.段定义伪指令格式: 段名 SEGMENT 定位方式 组合方式 类别 段名 ENDS功能:定义一个以SEGMENT伪指令开始、ENDS伪指令结束的、给定段名的段。段名为该段的名字,用来指出汇编程序为该段分配存贮区的起始位置。一个程序模块可以由若干段组成;段名可以各不相同,也可以重复;汇编程序将一个程序中的同名

10、段处理成一个段;段的定义可以嵌套,但不能交叉。8086方式中段的大小只能为64KB;.386及以上处理器选择伪指令,段使用类型默认为USE32。所以在实方式和虚拟8086方式中必须指明USE16,只有保护模式才能使用32位的段。 1)align_type(定位类型):用LINK程序将各个段相互衔接起来,两段之间如何连接用定位类型来确定 表明该段起始位置在内存中的对齐类型 Para(默认) 指定该段从一个小段(16字节)的边界开始; byte 指定该段从任一位置开始; word 指定该段从一个字边界开始; page 指定该段从一个页(256字节)的边界开始。2) combine_type(组合类

11、型):用来告诉LINK程序本段与其他段的关系 指出不同程序模块中具有相同段名的分段的连接类型 public 表示该段在连接时,将与有相同名字的其他分段连接在一起,段基地址相同,但偏移量不同; common 表示该段连接时将与其他同名分段重叠覆盖,偏移地址名称不同; stack 表示该段是堆栈段,连接时不同模块中的堆栈段连接在一起; None (默认)表示本段不与其他段连接,各段有独自的段基地址和偏移量; Memory 该段在连接时被放在所有段的最后(最高地址) AT 告诉连接程序将本段装在表达式的值所指定的段基地址处3) class (类别):使LINK程序将所有分类名相同的逻辑段组成一个段组

12、 当连接两个源模块时,具有相同class名的两个段在存储器中的位置是紧靠在一起的,但两个段并不会合并成一个段。需用单引号括起来。例:STACK,CODE,DATA。18段定义应注意的问题 一个程序模块可以由若干段组成,段名可以各不相同,也可以重复,汇编程序将一个程序中的同名段处理成一个段; 段的定义还可以嵌套,但不能交叉; 8086方式中段的大小只能为64KB;.386及以上处理器选择伪指令,段使用类型默认为USE32。所以在实方式和虚拟8086方式中必须指明USE16,只有保护模式才能使用32位的段。 222. 假定伪指令格式:ASSUME 段寄存器:段名 功能:用来设定段寄存器与段之间的对

13、应关系,即告诉汇编程序,该段中的变量或标号用哪个段寄存器作段首址指示器。注意:在代码段的开始,就要用ASSUME语句建立CS、SS与代码段、堆栈段的对应关系,否则就会出错。ASSUME语句是一条伪指令,并未将段首址置入对应的段寄存器中,这一工作要到目标程序最后投入运行时CS和SS的内容将由系统自动设置,不用用户程序处理。对于数据段和附加数据段,必须由用户程序自行将段首址放入DS和ES中,一旦在程序中用ASSUME假设或重新假设了DS或ES与某个数据段的关系,下面就要将新段首址放入DS或ES中。否则的话即使语法没有错误,执行结果也不对。 对于数据段和附加数据段,若用ASSUME语句建立它们与DS

14、、ES的关系,则其后语句如需访问这些段内的变量,均可直接使用段内寻址,而不必带跨段前缀; 对于数据段和附加数据段,若不用ASSUME语句建立它们与DS、ES的对应关系,则其后语句如需访问这些段内的变量,都必须带跨段前缀才可使用段内寻址.233.源程序结束伪指令格式:END 表达式功能:该语句为汇编源程序的最后一个语句,用 以标志源程序的结束。即告诉汇编程序 翻译到此为止。表达式指出了该程序运行时,第一条被执行指令的地址。如果不带表达式,说明该程序是一个子模块,不能单独执行,往往供另外的程序调用。注意:不可将END语句错误地安排在程序中间. END后面的语句就不可能被翻译成目标代码了。24数据定

15、义伪指令: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 DW 10,-60,189 ;ARR的类型为字 TT DD 0A57BD36H ;TT的类型为双字 K DB 1234H4.变量定义伪指令25变量定义中的表达式,指定了变量的初值: (i) 常量或数值表达式 (ii) ASCII字符串(DB定义时,长度可以超过2个字符) 例: NAME DB

16、 Hello A DD ABC;错误 B DW AB ;与 C DBAB 不同 (iii) 地址表达式(只适用DW和DD两个伪指令) (iv) ?表示变量值不确定 (v)重复子句: n DUP(表达式),表示定义了n个数据存储单元 (vi)上述(i)(v)组成的系列,各表达式之间用逗号隔开。表达式例:B DW 1+2 26 地址表达式:由变量、标号、常量、R和运算符组成的有意义的式子,顾名思义其作用是表示地址。 在数据定义语句中,不能出现带寄存器符号的地址表达式。 数据定义伪指令只能用DW和DD,不能为其它类型。lDW 地址表达式 当地址表达式含变量名时,初值取变量EA; 例: A DW B

17、; B为变量,则A的初始值为B的偏移地址lDD 地址表达式 当地址表达式含变量名时,初始值取变量的EA,变量所在段的段首址 例: A DD B ;B为变量,则A的初始值为B的偏移地址,段首址地址表达式27表达式的个数(包括(v)中的重复因子n) 确定了存储单元的个数。 这一片连续的数据存储单元也称数据存储区,其类型由数据定义伪指令确定在定义一个数据存储区时: 变量仅代表该区的第一个数据存储单元; 整个数据存储区的类型均与变量相同; 建立了一个以变量为首址的数据存储区或以变量为名的数组表达式(注意)28数据段定义的例子 数据段定义如下: DATA SEGMENT USE16 A DW M BUF

18、 DB AB,0DH,0AH CON EQU500H B DW 0FFAAH MARK = 100H D DD BUF M DB 2 DUP(1),2 DUP(2,B),123,1 DATA ENDS请画出数据段中的数据在主存中的存储形式。0CH0H41H42H0DH0AAH0AHDATA0FFH11242H231H42H32H33H BUF A D1 M2H0H B29 变量仅代表该区的第一个数据存储单元; 整个数据存储区的类型均与变量相同(类似于定义了以变量为名字的数组); 伪指令EQU及“=”不分配存贮单元; 使用直接寻址方式时,变量的类型必须与 指令的要求相符;例: A DB 1 B

19、DW 1 MOV AL, B PUSH A 变量的段必须是当前段。本例中的注意事项30地址表达式的属性:地址表达式的结果是一偏移地址,因此具备段属性、偏移地址和类型。 地址表达式是由变量、标号、常量、寄存器(名加方括号)及一些运算符(数值表达式的运算符和特殊运算符)所组成的有意义的式子。 问题:变量定义中,给变量置初始值的地址表达式可以含寄存器符号加方括问题:变量定义中,给变量置初始值的地址表达式可以含寄存器符号加方括号吗?号吗? 例如变量定义:例如变量定义: A DW BX A DW BX 是否正确?是否正确?不不正确,因为数据定义伪指令正确,因为数据定义伪指令DWDW是指导汇编程序确定变量

20、的初始值的,在汇是指导汇编程序确定变量的初始值的,在汇编过程中计算,这时最后的可执行程序还没有执行,编过程中计算,这时最后的可执行程序还没有执行,BXBX的值是没有意义的。的值是没有意义的。31 地址表达式的结果:是一偏移地址,它具有段属性、偏移地址和类型 (一个表达式中一般只出现一个变量或标号)。 数值表达式的结果:只有大小,无属性。 在特殊情况下(没有用到寄存器、不作为地址访问),地址表达式的值也可能仅表示一个数值(没有属性)。 例: 在变量/常量定义中给变量/常量赋值, 或在OFFSET BUF + 2语句中) NUM DW BUF1 - BUF2 (此时可以有多个变量或标号)地址表达式

21、与数值表达式区别32 格式:属性分离算符 变量或标号 功能:属性分离算符可分离出变量、标号的段、 偏移地址、类型的属性值。运算结果为数值常量。 a.取段址算符SEG 格式:SEG 功能:分离出其后变量或标号的段首址。 b.取偏移算符OFFSET 格式:OFFSET 功能:分离出其后变量或标号的偏移地址。特殊运算符属性分离算符33 格式: 类型 PTR 地址表达式 类型可以是BYTE、WORD、DWORD、FWORD、NEAR、FAR 功能: 用来指明紧跟其后的地址表达式的类型属性,但保持它原来的段属性和偏移地址属性不变或者使它们临时兼有与原定义所不同的类型属性。 作用1:使语句中类型模糊的操作

22、数类型变得明确 ADD BYTE PTR SI,5 ADD WORD PTR SI,5 作用2:临时改变某一操作数地址的类型,使得类型不一致的两地址变为一致。 作用3:PTR运算符还可以与EQU或等号“”等伪指令连用,用来将同一存储区地址用不同类型的变量或标号来表示。 特殊运算符类型运算符PTR34a. PTR临时赋予地址表达式的新类型只能在本语句中有效。b. 不带方括号的寄存器符号不是地址表达式,不能用PTR改变寄存器的类型使用PTR注意事项:35DATA SEGMENT B EQU THIS BYTE A DD 44332211H W DW 0FFFFH C EQU WORD PTR AD

23、ATA ENDS112233440FF0FFB,CAW类似于类似于PTRPTR,指定,指定下一个下一个能分配的能分配的存储单元(当前存储单元)的存储单元(当前存储单元)的类型类型,往往与伪指令往往与伪指令EQUEQU或者或者 = = 连用连用,为当前存储单元定义一个指定类型为当前存储单元定义一个指定类型的变量或标号。的变量或标号。 特殊运算符定义类型算符 THIS36THIS与与PTR用法的区别:用法的区别: 带有带有THIS的语句的语句一定一定要放在定义存储单元伪指令要放在定义存储单元伪指令语句的语句的前面前面,定义存储单元的语句,定义存储单元的语句不一定不一定有变量名有变量名。带有带有PT

24、R的语句可以放在的语句可以放在任意位置任意位置,但是它只能将,但是它只能将指指定名字的存储区重新定义定名字的存储区重新定义为新的类型。为新的类型。 THIS只用于定义只用于定义,不能象不能象PTR一样临时改变地址表一样临时改变地址表达式的类型达式的类型。MOV AL, BYTE PTR A特殊特殊运算符运算符定义类型算符定义类型算符 THIS37(1)指令中的地址表达式不允许出现不带方括号的寄存器符号;例: MOV AX,SI+4 错误语句, MOV AX,SI+4 正确语句(2)在定义变量时,其后表达式不能带寄存器符号和方括号; 例: A DW SI+4,SI+4 错误(3)数值表达式中如果

25、有变量和标号,均是取其EA参加运算。使用地址表达式注意事项38置汇编地址计数器伪指令置汇编地址计数器伪指令 汇编地址计数器:汇编地址计数器:(现行地址偏移量)(现行地址偏移量) 汇编程序在将源程序翻译成目标程序时,汇编程序在将源程序翻译成目标程序时,每遇到一个新的段,就每遇到一个新的段,就将汇编地址计数器置将汇编地址计数器置0。然后,再对该段中的语句汇编。在汇编过。然后,再对该段中的语句汇编。在汇编过程中,对凡是需要申请分配存储单元的语句和产生目标代码的语句,程中,对凡是需要申请分配存储单元的语句和产生目标代码的语句,汇编地址计数器则按该语句目标代码的长度增值汇编地址计数器则按该语句目标代码的

26、长度增值。 用来记录正在被汇编程序翻译的语句的地址,即的内容指明用来记录正在被汇编程序翻译的语句的地址,即的内容指明了汇编程序当前的工作位置。了汇编程序当前的工作位置。 标号和变量的偏移地址就是准备翻译该语句时当前汇编地址计数标号和变量的偏移地址就是准备翻译该语句时当前汇编地址计数器的值器的值。 汇编地址计数器符号汇编地址计数器符号可出现在表达式中可出现在表达式中。 39特殊运算符ORG格式:ORG 表达式的值为0 65535(16位段) 0 4G (32位段)功能:给它下面一条语句指定起始偏移地址例: DATA SEGMENT USE16 ORG 5 ;空了五个字节 A DB ABCD ;A

27、的EA为5 B EQU $-A ;B的值为4 ORG $+3 ;空三个字节 C DW 15,20, ;C的EA为12 DATA ENDS A C ABCD15002000 定义类型伪指令LABEL 格式:名字 LABEL 类型 功能:将LABEL左边的名字定义为其右边的类型 模块连接伪指令PUBLIC和EXTRN PUBLIC用于将标号、变量或数据定义为公共的,可供其他程序块使用,否则别的模块不能引用它。 EXTRN用于引用其他模块中已用PUBLIC伪指令定义过的标号和变量。 ORG伪指令 功能:给它下面一条语句指定起始地址例: DATA SEGMENT USE16 ORG 5 ;空了五个字节

28、 A DB ABCD ;A的EA为5 B EQU $-A ;B的值为4 ORG $+3 ;空三个字节 C DW 15,20, ;C的EA为12 DATA ENDS 常用ASM-8086伪指令如下:1. 数据定义伪指令:DB、DW、DD、DQ、DT 分别以字节、字、双字、8个字节、10个字节为单位定义数据,例: var dw 100H, 200H ;表示以字为单位定义2个数据 str db Hello;给出带单引号的字符等于给出了字符的ASCII码 addr1 dw str ;将变量str所代表的偏移地址赋给变量addr1 addr2 dd str;将变量str所代表的偏移地址和段地址赋给add

29、r22. 指定起始位置伪指令:ORG ORG 20H;指定下一个数据或代码从0020H开始存放3. 重复表达式伪指令:DUP buf db 10 dup(?) ;表示以字节为单位定义数据,重复10次,即定义10个数据,()表示重复的内容,?表示只分配存储单元,但不赋初值5. 赋值伪指令:EQU 类似于C语言中的define,不分配存储单元 AAA EQU 10 ;以符号AAA表示数据10,编译时把程序中所有出现 ;AAA的地方用10替换,也可用 AAA = 10 表示 BBB EQU AAA ;用符号BBB表示另一个符号AAA6. 段定义及程序定义伪指令:segment/end proc/endp far/near7. 程序结束伪指令:END 表示整个程序结束8. 类型说明伪指令:byte ptr, word ptr, dword ptr, near ptr,far ptr9. 其他伪指令:OFFSET;析取变量、标号和过程名的偏移量SEG;析取变量、标号和过程名的段地址TYPE ;析取变量、标号和过程名的类型(取值:DB 1, DW 2, DD 4, DQ 8, DT 10,NEAR -1, FAR -2)SIZE ;返回变量单元数LENGTH ;返回变量总字节数43常用的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论