《微机原理与接口技术 教学课件 ppt 作者 周鹏ppt第5章 汇编语言及其程序设计》由会员分享,可在线阅读,更多相关《微机原理与接口技术 教学课件 ppt 作者 周鹏ppt第5章 汇编语言及其程序设计(45页珍藏版)》请在金锄头文库上搜索。
1、第5章 汇编语言及其程序设计 5.1汇编语言语句种类与格式 5.1.1 汇编语言语句的种类 汇编语言源程序可以使用如下三类语句: 1指令性语句 2伪指令语句 3宏指令语句 5.1.2 汇编语言语句的格式 由于宏指令实质上不是一类语句,故我们主要分析指令性语句和伪指令语句的格式。 指令性语句的格式为: 标号: 指令助记符 操作数 ,操作数;注释 伪指令语句的格式为: 名字 伪指令定义符 参数,参数 ;注释 1标号、名字 指令或数据的符号地址。,开始,2助记符、定义符 规定指令或伪指令的功能。 3参数 参数可分为三类,如下: (1)数值表达式 常数 宏汇编中允许使用如下几种常数: 二进制常数、十进
2、制常数、十六进制常数、八进制常数、串常数、十进制科学计数法、十六进制实数 算术运算符 算术运算符有、*、/、MOD。 (2) 逻辑运算符 逻辑运算符有NOT、AND、OR、XOR、SHR和SHL。 关系运算符 关系运算符有:EQ、NE、LT、LE、GT、GE。 (2)寄存器操作数,寄存器操作数就是寄存器的名字,常用于指令性语句中。 (3)存储器操作数 存储器操作数即存储器的地址,常以一个表达式的形式给出,称为地址表达式。单个的变量、标号或有方括号的基址或变址寄存器是地址表达式的特例。 4注释 注释项必须以分号开头。 5.2 常用伪指令 5.2.1 符号定义伪指令 1等值语句EQU 格式:变量名
3、 EQU 表达式 功能:EQU伪指令告知汇编程序,指令左右的二个量相等,并且用右边表达式的值定义左边的符号。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。2等号伪指令 格式:变量名表达式 功能:“”伪指令用来为右边的表达式定义一个替代符号,,且只能是数值表达式,不能为字符串或地址表达式, “”伪指令定义的符号允许重复定义。 5.2.2 数据定义伪指令与变量 1数据定义语句 数据定义语句有5条,其格式相同,如下: 变量名 DB 初值表达式 变量名 DW 初值表达式 变量名 DD 初值表达式 变量名 DQ 初值表达式 变量名 DT 初值表达式 功能: 让汇编程序在内存中划出指定
4、个数的存储单元,然后将这些存储单元与变量名联系起来,并在存储单元中预置初值。 DB伪指令定义字节类型变量,其每个初值都占一个字节的存储空间。 DW伪指令用来定义字类型变量,其每个初值都占一个字的存储空间。 DD伪指令用来定义双字类型变量,其每个初值都占二个字的存储空间。,DQ伪指令用来定义四字类型变量,其每个初值都占四个字的存储空间。 DT伪指令用来定义十字节类型变量,其每个初值都占五个字的存储空间。 初值表达式: 初值表达式决定变量初值的个数,定义变量时可以指定多个初值,从而占据较多的存储空间。多个初值时各个初值间用逗号隔开。初值表达式中可以有常数或常数表达式、字符串、?和带DUP的表达式。
5、 例如: B0 DB 2 B1 DB 3,5,?,9 B2 DW 10H,2 DUP(1234H,?) B3 DD 1,2 B4 DB 0,2 DUP(?,1,2 DUP(7) 这5个变量分配内存情况如图5-1(a)(f)所示(见下页)。,图51 DB DW DD 初值示意图,说明: (1)表达式中也可以有用引号引起来的字符串,它表 示将字符的ASCII码作为初值。 例如: C1 DB ABCD C2 DW AB,B C3 DD AB 这三个变量在内存中的存放情况如图5-2(a)(c)所示. 图5-2 DB DW DD初值示意图,(2) 对于DW和DD,表达式中也允许是一个变量名或者标号. D
6、W伪指令将变量或标号的偏移量作为初值置入存储区,而 DD伪指令则把变量或标号的段基址与偏移量作为初值置入存储区。例: S1 DB 5 S2 DW S1 S3 DD S1 内存情况如图43所示。 2变量的访问 (1)当变量只代表一个数据时, 用变量名可直接对其代表的单 元进行操作。 (2)当变量对应着多个数据时, 变量名仅代表其第一个数据项, 对其后数据项的存取可用变量名 加一偏移量来实现。 3变量的属性 一个变量一经定义就具备了如 下三个属性: 图5-3 变量/标号名作初值,(1)段属性 表示变量对应数据区所在段的段基址。变量在哪个段 内定义,其段属性就是哪个段的段基址。 (2)偏移属性 表示
7、变量对应数据区的段内的偏移量,即从段的起始地址开始到变量对应数据区的第一个存储单元之间的字节数,用16位无符号数表示。 变量的段属性与偏移属性构成了变量的逻辑地址。 (3)类型属性 指变量对应数据项的存取单位,它与变量定义时使用的伪指令有关。如:DB定义的变量,类型为BYTE(字节);DW定义的变量,类型为WORD(字);DD定义的变量,类型为DWORD(双字)等。 5.2.3 标号及其属性 1标号的概念 标号是一条指令的符号地址,它常作为转移指令或子程序调用指令的操作数。标号同变量的区别在于标号代表的是指,令代码而变量代表的数据。 2标号的属性 标号也是符号地址,同变量类似,也有三个属性。
8、段属性 偏移属性 类型属性 3标号的定义 NEAR类型标号:在指令助记符前写上标号并用冒号分隔,就定义了一个NEAR标号。 FAR类型标号:必须借助于其它操作符定义,见下小节。 5.2.4 析值/属性操作符及符号名定义语句 1析值操作符 (1)取偏移地址操作符OFFSET 格式:OFFSET 变量或标号 功能:返回该变量或标号在它段内的偏移地址。 (2)取段基址操作符SEG 格式:SEG 变量或标号 功能:返回变量或标号所在段的段基址。 (3)取类型操作符TYPE,格式:TYPE 变量或标号 功能:当TYPE操作符置于变量前面时,得到变量的类型数字,该数字表示该变量所分配的存储单元的字节数;当
9、TYPE操作符置于标号前面时,返回标号的类型属性值。 (4)取变量存储区长度操作符LENGTH 格式:LENGTH 变量 功能:LENGTH操作符只对变量起作用,它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定。如果第一个表达式为重复子句“n DUP(表达式)”,则返回外层DUP操作符前面的重复因子n;如果为其它形式的表达式,则返回值为1。 (5)取变量对应数据存储区大小操作符SIZE 格式:SIZE 变量 功能:SIZE操作符仅对变量起作用,返回LENGTH 变量TYPE 变量之积。 2属性操作符 属性操作符用于临时改变地址表达式的类型属性,有2个.,(1)操作符PTR 格
10、式:类型 PTR 地址表达式 功能:PTR操作符的作用是将地址表达式的类型属性临时指定为PTR操作符前面的类型,地址表达式的原类型属性将暂时不起作用。地址表达式的形式可以是标号、变量或其它形式的地址,指定的类型可以是BYTE、WORD、DWORD、NEAR和FAR。 PRT的用法: 说明存储单元的类型 改变存储单元属性 建立FAR标号 建立FAR标号一般也要借助于EQU来完成。 (2)THIS操作符 格式:THIS 类型 功能:指定从该语句开始下一个可分配的存储单元的类型,它常与EQU连用。 THIS操作符可以方便地建立FAR标号。,3定义符号名伪指令LABEL 格式:符号名 LABEL 类型
11、 功能:定义由符号名指定的符号,使该符号的段属性与偏移属性与下一个紧接着的存储单元的段属性和偏移属性相同,并具有类型参数所指定的类型。类型可以是BYTE、WORD、DWORD、NEAR和FAR。 5.2.5 段定义伪指令 1段定义伪指令 格式:段名 SEGMENT 定位类型 组合类型 类别 段名 ENDS 2汇编程序对段的处理 设某源程序定义了三个段,段名分别为WW1、WW2和WW3,如图55所示(见下页)。 汇编程序对该模块进行汇编时,每遇到一个新名字的段,就在段表中填入其段名,同时为该段配备一个初值为0的地址计数器,凡遇到产生目标代码的语句和所有的指令性语句(NIL除外),都按照它们所需要
12、的字节数在程序地址计数器累,计计数,并在相应段的代码区中生成指令代码或在数据区 中生成数据。段内定义的所有标号及变量,其偏移地址 都是由当前程序地址计数器的值确定。 图5-5 汇编程序对段的处理,3地址计数器的访问 地址计数器的名字为“$”,程序中可以使用或改变其值。 例(略) 5.3 程序的段结构 在学习了段定义语句之后,我们分析一个简单的汇编语言源程序的结构。 DATA SEGMENT VAR DB 12H DATA ENDS STACK1 SEGMENT STACK DB 300H DUP(?) STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,DS:DAT
13、A,SS:STACK1 START: MOV AX,DATA MOV DS,AX INC VAR,MOV AH,4CH INT 21H CODE ENDS END START 1源程序分段结构 汇编语言源程序由若干段组成,段是程序的基本构成单位,一般将数据集中放在一个段内,称为数据段.本例中为DATA段; 将堆栈所需内存专划为一个段,称为堆栈段.本例中为STACK1段。在堆栈段内定义变量的目的是指定堆栈段的长度;将指令代码集中放在一个段内,称为代码段,本例中为CODE段。 一个程序必须有代码段,其它段根据需要定义。 2段假设伪指令ASSUME 格式:ASSUME 段寄存器名:段名,段寄存器名:
14、段名, 功能:ASSUME伪指令设定段和段寄存器的关系,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT/ENDS定义的段名。 在程序的代码段中可以多次使用ASSUME伪指令,则新设置,的“段寄存器:段名”的对应关系将取代以前的设置。 3段寄存器的填装 ASSUME伪指令仅告诉汇编程序在汇编源程序时假设段寄存器与段存在着这样的对应关系,它不能真正将段基址装入到相应的段寄存器中去。段寄存器的装入是应用程序在运行时实现的,并且4个段寄存器的装入方法有所不同。 (1)DS和ES的装入 由于段基址不能用MOV指令直接送往段寄存器,所以通过一通用寄存器再送往DS和ES。
15、(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功能调用的说明)。本例中: MOV AH,4CH INT 21H 即为此功能而设,这二条指令执行后应用程序结束,其占用的内存被DOS收回,CPU的控制权交还给DOS,这是用户程序执行的最后二条指令。 5源程序结束伪指令END 格式:END 起始地址 功能:告知汇编程序,源程序就此结束。END伪指令后面的任何语句汇编程序都将