四川大学计算机学院-汇编语言课件ch4

上传人:F****n 文档编号:88035331 上传时间:2019-04-17 格式:PPT 页数:76 大小:226.50KB
返回 下载 相关 举报
四川大学计算机学院-汇编语言课件ch4_第1页
第1页 / 共76页
四川大学计算机学院-汇编语言课件ch4_第2页
第2页 / 共76页
四川大学计算机学院-汇编语言课件ch4_第3页
第3页 / 共76页
四川大学计算机学院-汇编语言课件ch4_第4页
第4页 / 共76页
四川大学计算机学院-汇编语言课件ch4_第5页
第5页 / 共76页
点击查看更多>>
资源描述

《四川大学计算机学院-汇编语言课件ch4》由会员分享,可在线阅读,更多相关《四川大学计算机学院-汇编语言课件ch4(76页珍藏版)》请在金锄头文库上搜索。

1、第四章 汇编语言语法 汇编语言语句格式 ()指令语句格式 标号: 指令助记符 操作数 ;注释 标号字段:是一个任选字段,性质为符号便移量,一般用于标记跳转指令的目的地址在汇编过程中标号会被替换为一个位的数值偏移量标号必须位于语句开头,结尾必须使用冒号。 指令助记符和操作数:这两个字段组成汇编指令本身,指令助记符是必不可少的,操作数则根据指令助记符来确定在汇编过程中,也只有这两个字段会被替换为确定的机器指令代码 注释字段:是一个任选字段,用于说明程序片段或指令的功能,汇编过程中不处理这样的字段,它只是用于提高源程序的可读性注释必须使用分号作为开始。,例子:教材例.1.1 () 伪指令语句格式 伪

2、指令语句:这种语句用于指示汇编程序(翻译程序)如何汇编源程序和指令语句不同,汇编程序处理它时不会产生机器指令代码,只对伪指令提出的要求进行解释并立即完成要求的操作 伪指令的功能大致有分配存储单元、计算表达式、定义常量等等。,符号名 伪指令符 操作数 ;注释 符号名字段:一个任选字段,针对不同的伪指令符,符号名可以是常量名、变量名、子程序名称、结构名称、记录名称。都是一些抽象的名称,在最终的目标代码中不会出现,只是在汇编过程中使用。 伪指令符:伪指令语句中必不可少的字段,由它指示汇编程序所要完成的具体操作。,操作数字段:由伪指令操作符决定。操作数可以是常数、字符串、常量名、变量名、表达式等。 注

3、释字段:任选字段,必须以分号开始,与指令语句中的注释字段相同,用于提高程序的可读性。 例子:教材P63例4.1.2,(3)标识符 标识符是汇编语言中所有用户定义符号名称的总称,它有一定的构成规则: (a)字符个数在1个到31个之间。 (b)第一个字符必须是字母或特殊字符(特殊字符:? _ . $) (c)除第一个字符外,其他字符可以是字母、数字、特殊字符 (d)不能使用保留字(汇编程序定义的符号名称),包括各种指令助记符、伪指令符、寄存器名称等等。,4.2 汇编语言中使用的数据 4.2.1 数据表示(常数) 数据表示是指汇编语言所规定的用于表示各种数据的具体方式。 数据表示大体上可以分为数值表

4、示和字符串表示两种情况。 数据表示也称为常数,因为各种数据表示的具体取值在汇编过程中已经完全确定,并且在程序执行阶段也不会发生任何变化。,(1)数值表示 二进制整数:由数字0和1组成的序列,以字母B作为结尾。例如,10110101B。 八进制整数:由0 7之间任意数字组成的数字序列,以字母Q或O结尾。例如,35761Q。 十进制整数:由0 9之间任意数字组成的数字序列,以字母D结尾或结尾不带任何字母。 十六进制整数:由0 9或A F之间的任意数字或字母组成的序列,以字母H结尾。例如,0A845H。 如果十六进制整数以字母作为最高位,那么前面必须添一个0,这是语法要求。,十进制实数: 整数部分.

5、小数部分 E 指数部分 例如十进制实数 - 13835.67 * 10-3 在汇编语言中表示为 - 13835.67E-3 除了十进制表示以外,还可以使用二进制浮点编码形式表示实数,这种表示形式和机器表示实数的方法是一致的。 在空间分配方面,定义一个实数至少需要4个字节,也可以使用8字节或10字节的空间。,(2)字符串表示 使用单引号或双引号括起来的任意字符序列称为字符串。例如: Hello, world! A 678,(3)常数在程序中的用途 1)在指令语句中作为立即数 MOV AX,45F3H MOV BL,C 2)在指令语句中作为偏移量中的位移量分量 MOV AX,1000H ADD 1

6、0HBX,AX,3)在数据定义伪指令中,作为存储单元存放的初值 DB 10H,0F4H DW 0D3E5H DB Hello 注意,常数在程序运行阶段不改变不是指存储单元中的内容不改变。,4.2.2 变量 变量在汇编语言中的概念和在高级语言中的概念一致,是指某一个特定的内存单元或内存区域。(和教材中的描述有点差异) 在汇编阶段,变量在段中的起始偏移量、所占用的空间已经完全被确定。 在程序执行阶段,变量中的数据随时可能发生变化。 在程序中引用变量相当于引用内存单元的偏移量,实际要访问的信息是变量中的数据。,(1)数据定义伪指令 语句格式: 变量名 DB(DW、DD) 表达式1,表达式2,;注释

7、语句中各字段含义如下: 变量名:是一个可选的字段,代表当前所定义内存单元的段内偏移量。(在定义内存单元时,可以不指定变量名) 数据定义伪指令:必选字段,用于指明当前所定义变量所占用的空间大小。(DB:字节,DW:字,DD:双字,DQ:8字节,DT:10字节),下面是一个完整的数据段定义: DATA1 SEGMENT VAR1 DB 10H VAR2 DW 3A4DH VAR3 DD ? DATA1 ENDS 我们用这个例子来解释变量所固有的三种属性。,1)段属性(SEG) 从变量定义的位置来看,VAR1、VAR2、VAR3都在同一个逻辑段DATA1中。这也就决定了访问这三个变量正确的段基值。

8、关于变量的段属性,需要注意指令中隐含使用的段寄存器,要保证正确的段基值是放在当前使用的段寄存器中。 MOV AL,VAR1 上面这条指令默认DS段寄存器中存放的是DATA1数据段的段基值。,2)偏移量属性(OFFSET) 偏移量属性是指变量相对于段起始地址的字节距离。 (注意,段起始地址和段基值是两个概念,在大多数段定义中,这两个值是相等的,一般也应该保证这两个值相等。) 变量名称就是一个符号偏移量,汇编过程中,定义一个变量名时就是定义该名称对应的偏移量,在语句中引用变量名就是引用相应的偏移量。 变量的段属性和偏移量属性完全确定了变量的起始地址。段基值:偏移量构成一个完整的逻辑地址。 上个例子

9、中,VAR1的偏移量为0000H,VAR2为0001H,VAR3为0003H。,3)类型属性(TYPE) 类型属性表示变量所占用的字节数,这一个属性由数据定义伪指令中的伪指令符决定。 DB:单字节 DW:字(双字节) DD:双字(4字节) 在汇编过程中,汇编程序会检查源程序中变量的类型,如果操作数类型不匹配,会提示语法错误。 例如:MOV AL,VAR2 VAR2是一个字单元,试图把一个字单元中的数据传送到一个字节寄存器中是不允许的,会出现语法错误。,原则上来说,通过段属性、偏移量属性、类型属性,已经完全可以把变量在内存中的确切起始地址、所占用的字节数确定下来了。 在汇编语言程序中访问的变量就

10、是一个具体的、实在的变量,而不象高级语言中的变量那么抽象。,对于变量初值的设定通过表达式来完成。(程序装载到内存中以后,程序执行前变量的取值称为初值。) 下面讨论定义变量初值时用到的各种表达式。 1)数值表达式(使用整数来定义变量初值) 参见教材P66的例4.2.1。 2)字符串表达式(使用ASCII码来定义变量初值) 参见教材P66的例4.2.2。,3)问号表达式(定义变量初值为随机值) 如果这样定义变量的初值,那么汇编程序在处理数据定义伪指令时仅为变量分配空间,并不会为它设置初值。 程序执行时,这种变量的初值就是相应内存单元中原来所有的随机值。 例子,参见教材P67例4.2.3,4)带DU

11、P的表达式 数据定义伪指令语句格式: 变量名 DB等 表达式1 DUP(表达式2) DUP(Duplication)是指多次重复分配内存空间,并且为每次分配的空间定义相同的初值。 表达式1:定义重复分配空间的次数。 表达式2:定义每次所分配空间中所用的初值。,例子参见教材P68的例4.2.4 注意,DUP关键字可以嵌套使用。 例子参见教材P68 例如:VAR1 DB 10H DUP(2,2 DUP(3,2 DUP(5) 三层DUP定义 第三层:3,5,5 第二层:2,3,5,5,3,5,5 第一层:把第二层数据重复定义10H次,总共占用7*10H个字节单元,(2)变量的使用 1)变量在指令语句

12、中的使用 在指令中引用变量名作为符号位移量可以实现直接寻址、基址寻址、变址寻址、基址变址寻址等寻址方式,对变量或变量数组中的数据进行读写操作。 例子见教材P68,2)在伪指令中引用变量 变量是通过伪指令语句来定义的,但这里指的不是定义变量,而是在伪指令语句中引用变量。 和在指令中引用变量相似,在伪指令中引用变量也是引用变量的段内偏移量或者变量完整的逻辑地址。 例子见教材P69 ADR1 DW VAR1+3 ;存放VAR1+3偏移量 ADR2 DD VAR1-2 ;存放VAR1-2逻辑地址 注意,在伪指令中引用变量时不能使用DB伪指令。,4.2.3 标号(指令语句的第一个可选字段) 变量是用于存

13、放数据的内存单元所对应的偏移量,是一种符号地址。 标号同样是一种符号地址,用于指示特定内存单元的偏移量,但是和变量不同,标号所指示的地址是位于代码段中的。 标号就是程序中某一条特定指令的符号地址。在程序中引用某个标号(转移指令),就是在引用该指令在代码段中的偏移量或完整的逻辑地址。,标号的一般定义和引用 L1: INC SI ;在指令前定义标号L1 JMP L1 ;跳转到标号L1处 ,(1)标号的属性 和变量一样,标号也有三种固有属性 1)段属性(SEG) 标号是某一条指令的符号地址,一条具体的指令总是位于某一个特定的代码段。该代码段的段基值就是标号的段基值。 在程序执行过程中,当前代码段的段

14、基值总是由CS段寄存器指出。,2)偏移量属性(OFFSET) 偏移量是指带标号指令在代码段中相对于段起始地址的字节距离。 通过段属性和偏移量属性的结合,就能够完全确定带标号指令在内存中的确切起始地址。,3)类型属性(TYPE) 变量的类型是指变量在内存中占用的字节空间大小。 标号的类型也有相同的含义,但是主要是指标号的引用类型。 NEAR型:使用关键字NEAR说明过的标号只代表标号后指令在段内的偏移量,标号实质上是一个16位二进制数。这种标号只能在同一个代码段内引用(段内引用)。 FAR型:使用关键字FAR说明过的标号代表标号后指令的完整逻辑地址,标号实质上是一个32位二进制数。这种标号可以在

15、定义标号的段内引用,也可以在其他段引用(段间引用)。,标号的隐含属性为NEAR,当定义标号未指明其类型时,汇编程序会默认的把它作为NEAR型的标号处理。 如果需要定义FAR类型的标号,必须使用LABEL伪指令显式的定义它的类型。 (2)LABEL伪指令 LABEL伪指令与指令语句连用时,用于定义指令的标号;与数据定义伪指令连用时,用于定义变量。,1)用LABEL伪指令定义标号 见教材: NEXTF LABEL FAR NEXT: ADD AL,BL NEXT为NEAR型的标号,NEXTF则为LABEL伪指令定义的FAR型标号;但是两个标号均指向同一条指令。 如果在段内使用转移指令,那么应该引用

16、NEXT标号,因为它所占用的空间更小;如果在其它代码段使用转移指令,那么应该引用NEXTF标号,因为只有它才能给出目标指令所在段的段基值。,2)用LABEL伪指令定义变量 见教材: VARB LABEL BYTE VARW DW 10H DUP(1122H) 注意,VARB和VARW两个变量的段属性和偏移量属性完全相同,具有相同的逻辑地址。但是,两个变量的类型却不相同,VARB是字节类型,VARW是字类型。 通过LABEL伪指令与数据定义伪指令连用,可以为同一个逻辑地址定义几种类型不同变量。 这样的变量定义方式可以使程序使用不同的类型来访问相同的内存单元。,4.3 符号定义伪指令 如果一个常数或者表达式会在源程序中经常使用,那么可以定义一个符号来表示它。 如果符号所对应的表达式很复杂,那么在源程序中使用符号会使程序描述更简单、清晰。 汇编语言中符号的概念和高级语言中常量的概念相似。,4.3.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号