书签 分享 收藏 举报 版权申诉 / 573
上传文档赚钱

类型第-4-章-汇编语言程序设计基本方法-微型计算机原理与应用-教学课件.ppt

  • 上传人(卖家):晟晟文业
  • 文档编号:4915533
  • 上传时间:2023-01-25
  • 格式:PPT
  • 页数:573
  • 大小:1.37MB
  • 【下载声明】
    1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
    2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
    3. 本页资料《第-4-章-汇编语言程序设计基本方法-微型计算机原理与应用-教学课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
    4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
    5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
    配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    汇编语言 程序设计 基本 方法 微型计算机 原理 应用 教学 课件
    资源描述:

    1、4.1 汇编语言基本概念汇编语言基本概念4.2 8086/8088 指令系统指令系统4.3 汇编语言程序设计的基本方法汇编语言程序设计的基本方法4.4 汇编语言程序的编辑、汇编语言程序的编辑、汇编与连接汇编与连接4.5 程序的调试程序的调试第第 4 章章 汇编语言程序设计基本方法汇编语言程序设计基本方法返回主目录第第 4 章汇编语言程序设计基本方法章汇编语言程序设计基本方法 4.1汇编语言基本概念汇编语言基本概念 4.1.1汇编语言与机器语言汇编语言与机器语言 我们已经学过高级语言,例如BASIC语言或FORTRAN语言,无论哪种语言,它都规定了一系列用于编写程序的语句和应该遵循的语法规则。人

    2、们根据一种语言给定的语句及其语法规则就可以写出程序,计算机则通过执行已编好的程序来完成人们要求它完成的各种复杂功能。汇编语言也一样,根据汇编语言的语句及其语法规则可以写出汇编语言程序。但汇编语言与高级语言有较大的区别,汇编语言中的语句与机器的种类和型号密切相关。在高级语言中,完成某个加法功能,我们可采用语句X=A+B,只要给变量A和B赋一确定值,此加法就可以实现了。在汇编语言中则不同,程序必须指出A,B存放在何处,相加后的结果又存放在何处,然后才能实现这一加法运算。显然,汇编语言在通过程序告诉计算机做什么和如何做时,显得更加具体。正是这种具体,使得该语言与计算机(处理器)紧密相关,从而也要求学

    3、习和使用汇编语言的人对处理器的结构有更加深入的了解。那么,什么是机器语言,汇编语言与机器语言之间又有什么关系呢?我们说,机器语言是这样一种语言,它的每条语句就是计算机可以直接执行的一条指令,这些指令以二进制码的形式表示。例如我们要将累加器AX中加上一个常数 02,其二进制码表示的指令为:000001010000001000000000。也就是说,当处理器中取得了这样一组指令代码时,它将自动地完成(AX)+2(AX)中的操作。处理器所以能这样是因为处理器在设计时,就考虑了这样一组代码应完成的功能。自然,不同的处理器,指令的机器码将各不相同,完成的具体功能也将各不相同。采用机器语言编写程序的一个最

    4、大好处是,程序送入计算机后,可以直接执行,但是,我们很快会感觉到,采用机器语言编写程序是多么困难,既不易书写,也不易检查。汇编语言正是为了克服这一缺点而形成的一种与机器语言直接相关的语言。汇编语言的基本思想是采用一组字母、数字或符号来代替一条二进制码表示的指令,例如上面所述的指令可采用字符ADD AX,02 来代替,它表示将累加器AX中的内容加上一个常数 02。显然,这要比一串二进制码清晰多了,既容易书写,也容易记忆 表示一条指令的这些字符常称为助记符。我们必须指出,采用助记符写出的程序,机器是不能直接执行的,因为上面我们已经指出,处理器在设计时是按二进制指令码考虑的。所以,采用汇编语言编写的

    5、程序在执行前还必须将其“翻译”成机器语言。通常将采用助记符指令写成的程序,称为源程序,将它翻译成的机器语言程序称为目标程序。将汇编语言的源程序翻译成目标程序的过程称为汇编过程或简称汇编。汇编过程通常是由计算机完成的。它是通过执行一个专门完成汇编的软件称为汇编程序来实现的。既然写出的源程序要由汇编程序将其翻译后才能执行,所以,我们编写的源程序必须符合汇编程序的一系列要求或者规则,只有这样,你的程序才能被正确地“翻译”。所以,汇编语言的一系列规则是与“翻译”软件汇编程序相关的。我们要介绍的是IBM PC宏汇编语言,其汇编程序是IBM PC宏汇编程序MASM。自然,本书不能介绍它的全部而只能介绍它的

    6、主要部分。汇编语言的语句有两种基本类型,即指令与伪指令。指令可由汇编程序翻译成机器语言指令,例如上例中的ADD AX,02,汇编后将形成一条机器语言指令05 02 00(十六进制码),所以,汇编语言中的指令与机器语言指令基本上是一一对应的。伪指令则不汇编成机器语言指令,仅仅在汇编过程中告诉汇编程序应如何汇编。例如告诉汇编程序已写出的汇编语言源程序有几个段,段的名称是什么,是否采用过程,汇编到某处是否需要留出存储空间,应留多大,是否要用到外部变量等。所以,伪指令是为汇编程序在汇编时用的。但指令与伪指令都是组成汇编语言源程序的基本语句。除了这两类基本语句外,在汇编语言中,还存在另一类指令称为宏指令

    7、,它是使用者利用上述基本语句自己定义的新的指令。本章将逐步介绍这些内容,并在此基础上介绍汇编语言程序设计的基本方法。4.1.2汇编语言中语句的组成汇编语言中语句的组成 汇编语言源程序是由一条条语句组成的。语句则由名称、操作助记符、操作数、注释四部分组成,见表 4.1 所示。1.名称名称 语句中的名称是一个标识符,可由字母(a,b,c,z),数字(0,9)及特殊符号(?,-,$)组成。名称必须由字母打头,若名称中有圆点符,则圆点符又必须用作第一个字符,数字不能用作第一个字符。构成名称的字符总数可多达 31 个,若超过 31 个字符,则 31 个字符以后的字符无效。名称不是所有语句都必需的,但若语

    8、句带有名称,那么,在大多数情况下名称表示的是内存的某一存储单元的地址,也就是名称后面各项在内存存放的第一个存储单元的地址(包括该名称所在段的段地址和段内的偏移地址)。如上面例子中的CYCLE为语句的名称,它表示的将是后面的指令机器码在内存存放的第一个地址。名称与操作码之间的分隔可以是空格,也可以是冒号。当以冒号分隔时,该名称代表一个标号;当以空格分隔时,名称可能是标号,也可能是变量。关于标号与变量的使用及其区别,后面将逐步说明。上面例子中的CYCLE为标号,DATA1 则为变量。2.操作助记符操作助记符(或称助记符或称助记符)操作助记符将指出该语句的基本操作功能。它是语句的必要部分,也就是说每

    9、条语句都必须有操作助记符。操作助记符是汇编语言中规定了明确含义的一组符号,所以不能随意使用。例如上面例中的ADD是加法指令的助记符,DB则是定义字节变量的伪指令助记符。3.操作数操作数 语句中的操作数部分,可以是数据本身,也可以是指出如何获得操作数的信息。前者可以是一个常数,也可以是代表常数的一个标识符或表达式,后者通常是以某种寻址方式给出的存放操作数的地址。如上例中的第一条语句中的第一个操作数部分,它指出该操作数存放在AX中,而第二个操作数部分则为参加运算的操作数本身。操作数不是每条语句所必须的。若语句为指令,那么语句中可以没有操作数,也可以有12 个操作数。如上例中的第一条语句,具有 2

    10、个操作数。若语句为伪指令,那么,可以有多个操作数。如上例中的第二条语句,具有 4 个操作数。当语句中具有 2 个以上的操作数时,操作数之间应用逗号“,”分隔,而操作数与操作助记符之间必须以空格分隔。4.注释注释 注释仅用作语句或程序段的说明,它不是程序的可执行部分,汇编时不形成任何目标码。注释必须以分号“;”开头。它可以作为语句的一个部分,也可以作为一个单独的语句。4.1.3汇编语言中的常数与表达式汇编语言中的常数与表达式 1.常数常数 常数可以分数值常数和字符串常数两类。数值常数按其基数的不同,可以有二进制数、八进制数、十进制数、十六进制数等几种不同的表示形式,汇编语言中采用不同的后缀加以区

    11、分。B:表示二进制数。例如,10110011B。D:表示十进制数。例如,179D或 179。O:表示八进制数。例如,263O。H:表示十六进制数。例如,B3H。例中的 4 个数据是以不同的基数形式表示的同一个数值。当一个数值数据后面没有后缀时,将默认为十进制数。字符串常数是由单引号“”括起来的一串字符。例如:THIS IS A SUBROUTINE 179 要指出的是,此处的 179其值并不表示十进数 179,而是 1、7、9 三个数字的ASCII码,即 31H、37H、39H。最后,我们还应指出,汇编语言中的数值常数的第一位必须是数字,否则汇编时将被看成是标识符。例如十六进制数FFH应表示成

    12、 0FFH。2.表达式表达式 表达式由操作数和操作符组成,操作数可以是常数或标识符,也可以是子表达式。操作符在宏汇编语言中非常丰富,可以分为算术操作符、逻辑操作符、关系操作符、属性操作符及其它操作符等。这里主要说明前三种操作符,后面两种操作符将在介绍变量与变量定义后再作介绍。算术操作符主要有:+,-,*,/,MOD。算术运算都是双操作数运算,操作数必须为数字操作数。取模运算(MOD)是取两数相除的余数,两操作数的值必须为正整数。例如:逻辑操作符有:AND(逻辑与)、OR(逻辑或)、NOT(逻辑非)、XOR(逻辑异或)。逻辑运算的两个操作数的值也应为数字。两数进行逻辑运算是两数的对应位分别进行相

    13、应运算。例如:11001100B AND 11110000B 结果为 11000000B11001100B OR 11110000B 结果为 11111100B NOT 11110000B 结果为 00001111B11001100B XOR 11110000B 结果为 00111100B 值得注意的是,逻辑操作符同时又是逻辑运算指令的操作助记符,只有当它们出现在指令的操作数部分时,才是操作符。例如:AND AL,0CH OR 0FH 其中AND是指令的操作助记符,而OR是逻辑操作符。该指令指出,将AL中的内容与第二操作数的表达式的值(即两数相或的结果)相与,相与结果存放于AL中。关系操作符有

    14、:EQ(相等)、EN(不等)、LT(小于)、GT(大于)、LE(小于或等于)、GE(大于或等于)。关系运算的操作数也必须为数字操作数。当关系成立时,其结果为全 1;当关系不成立时,其结果为全 0。汇编语言中的表达式不能构成单独语句,只能是语句的一个部分,例如:MOVAX,BUF+2ADDAL,VAL AND 0FHJMPAGAIN+3MOVBL,VB LE VA 上述各语句中都含有表达式,表达式中的标识符可以是变量名也可以是标号,关于标号与变量的定义将在下面说明。必须指出的是,语句中表达式的求值不是在执行指令时完成的,而是在对源程序进行汇编连接时完成的。所以,语句中各表达式的值必须在汇编或连接

    15、时就是确定的,也就是说,表达式中各标识符的值在汇编或连接时就应该是确定的。4.1.4标号、标号、变量及伪指令变量及伪指令 1.标号标号 标号是由标识符表示的指令的名称,用以指示对应指令的位置(地址)。标号有三个属性:段地址、偏移地址和类型。标号的段地址和偏移地址属性是指该标号对应的指令所在段的段地址和段内的偏移地址。标号的类型属性有两种,即NEAR和FAR标号定义成NEAR类型,表示该标号在段内使用,而定义成FAR类型则表示该标号可以在段间使用。标号的基本定义方法是在指令的操作助记符前加上标识符和冒号,该标识符就是我们所要定义的标号。例如:START:PUSH DS 这里,START为一标号,

    16、它代表了指令PUSH的地址,从而标号可以作为程序转移指令的操作数(即要转向的地址)。标号还可以采用伪指令定义,如用LABEL伪指令和过程定义伪指令来定义,这将在后面叙述。2.变量变量 汇编语言与高级语言一样也可以有变量,变量的值在程序运行期间是可以改变的。1)变量定义 汇编语言中的变量是通过伪指令定义的,伪指令的格式如下:变量名DB 表达式;定义字节变量 变量名DW 表达式;定义字变量 变量名DD 表达式;定义双字变量 变量名DQ 表达式;定义长字变量 变量名DT 表达式;定义一个十字节变量变量名是一个标识符,其定义方法与上面指出的语句中的名称一样,但变量名后面不能加冒号,只能用空格。变量名不

    17、是必要的,在语句中可以有,也可以没有。变量的类型与变量名后的关键字DB、DW、DD、DQ、DT有关,它们分别定义了单字节变量(或称字节变量)、双字节变量(或称字变量)、四字节变量(或称双字变量)、八字节变量(或称长字变量)和十字节变量。4.1.1 中的变量中的变量DATA1DATA4;(2)带引号的字符串。如例 4.1.1 中的变量DATA5、DATA6;(3)一个问号?。如例 4.1.1 中的变量DATA7,DATA8;(4)重复方式。此时表达式部分的格式为重复次数DUP(表达式)如例 4.1.1 中的变量DATA9、DATA10。例 4.1.1 DADA1 DB 20H DATA2 DW

    18、0204H,1000H;DATA3 DB(-1*3),(15/3);DATA4 DD 12345H;DATA5 DB 0123;DATA6 DW AB,C,D;DATA7 DB?;DATA8 DD?;DATA9 DB 5 DUP(00);DATA10 DW 3 DUP(?)伪指令的功能是在变量名所对应的地址开始的内存区依次存入表达式中的各项值。表达式中的每项值所占内存的字节数与变量的类型相对应(见图 4.1)。图 4.1 中给出了例 4.1.1 中所定义的各变量在内存存放的具体形式。图 4.1 中最左边一列为内存区的地址。我们假设变量DATA1 的段地址和偏移地址为 0100:0000H。中间

    19、一列为对应内存单元所存放的内容,右边一列为对应的变量名。图 4.1 中的问号?表示该内存单元中的内容是不确定的,或者说,当表达式为问号时,变量所对应的内存区没有存入新的值,而只留出了相应的存储空间。如图 4.1 中地址为 0100:0015H0100:0019H单元中仍保持内存中原来的内容,而没有送入确定的新值。重复方式指出表达式的值可以重复地存到变量对应的内存区,重复的次数由伪指令给出。例如变量DATA9 是在其对应的内存单元(0100:001AH)开始重复地存放 5 个字节的 00,而DATA10 则指出在它对应的内存区重复地保留 3 个字的空间。当表达式的值为字符串时,对于字节类型变量,

    20、每个变量为一个字节,每个字节内存入一个字符的ASCII码,整个字符串可以在同一个引号内给出。对于字类型变量,每个变量的值不能超过 2 个字符,若为两个字符时同样遵循高位存入高字节,低位存入低字节的规则;若为一个字符时,该字符的ASCII码存入低字节,高字节为 00,如图 4.1 中的DATA6。对于双字、长字类型变量,每个变量的值也不能超过两个字符并存入两个低位字节。2)变量的属性 变量具有下列属性:(1)段地址(SEG):变量所在段的段地址;(2)偏移地址(OFFSET):变量所在段内的偏移地址;(3)类型(TYPE):变量的类型是所定义的每个变量所占据的字节数,对于DB、DW、DD、DQ、

    21、DT定义的变量其类型分别为 1、2、4、8、10。通常又将DB、DW、DD所定义的变量分别称为BYTE类型,WORD类型和DWORD类型变量。(4)长度(LENGTH):变量定义时,一个变量名所定义的变量个数。在含有DUP操作符的变量定义中,变量名所定义的变量个数为定义格式中的重复次数。在其它各种变量定义中,每个变量名所定义的变量个数均为 1。(5)大小(SIZE):变量定义语句中,分配给同一变量名的所有变量的总的字节数,其值为该变量的类型与长度的乘积。例 4.1.1 中所定义的部分变量的各属性的值列于表 4.2 中。上述 5 个属性中,前 3 个属性属于每一个变量,我们称其为主属性,后两个属

    22、性则是对同一语句中同一变量名所定义的所有变量而言的,我们称其为辅助属性。4.1.5属性操作符及表达式属性操作符及表达式 前面我们已介绍了几种操作符及其表达式,这些操作符的操作对象都是数字数据。下面我们将介绍用来获取属性或重新定义某种属性的操作符,我们称其为属性操作符,对应这样的操作符,也有其相应的表达式。1.获取属性的操作符获取属性的操作符 标号或变量一旦定义,它们都具有相应的属性,获取属性的操作符及其表达式列于表 4.3 中。例如对图 4.1 中所定义的各变量,我们有:SEG DATA1结果为 0100H OFFSET DATA1结果为 0000 LENGTH DATA6结果为 1 TYPE

    23、 DATA6结果为 2 SIZE DATA9结果为 5 这些表达式与上面提到的运算表达式一样,不能构成单独的语句,只能是语句的一个成分,并且表达式的求值也是在汇编过程中完成的。例如我们可以有:MOV#AX,SIZE DATA9;将DATA9 所占的字节数送AX MOVAX,SEG DATA1;将DATA1 的段地址送AX MOVBL,TYPE DATA9;将DATA9 的类型送BL 我们还可以有如下的变量定义:DAT1DB 02H#;DAT2DW 0F00H#;DAT3DW 5 DUP(?)#;DAT4DB LENGTH DAT3#;DAT5DW DAT3#;经汇编以后,DAT4 对应的内存单

    24、元中存放的是变量DAT3 的长度(即 5),DAT5 所对应的2个字节中存放的将是变量DAT3 的偏移地址。2.PTR操作符操作符 格式:类型PTR表达式 格式中的类型可以是:BYTE、WORD、DWORD、NEAR和FAR。前三个类型为变量类型,后两个为标号类型。格式中的表达式可以是变量名、标号或其它地址表达式。PTR操作符的功能是用来重新定义已定义的变量或标号的类型。例如上例中的变量DAT3 是字变量,若程序中需将它作为字节变量使用时,必须用PTR操作来重新定义其类型。我们可以有MOVBYTE PTR DAT3,AL 这里DAT3 即为格式中的表达式,从而将DAT3 重新定义为字节类型。整

    25、个语句的功能将是AL中的内容送到DAT3 对应的一个字节中。要指出的是变量DAT3 仅在该语句中作为字节变量使用,DAT3 原来定义的字变量类型并没有修改。4.2 8086/8088 指令系统指令系统 IBM PC/XT 微型计算机的微处理器采用的是 8088 芯片,本节将介绍 8088 微处理器的指令系统。指令系统是指处理器所能完成的所有指令的集合。它是在微处理器设计时就确定了的,所以,对于不同的微处理器,其指令系统中所包含的具体指令将是各不相同的。由于微处理器 8088 与 8086 的指令系统是完全一样的,所以,本节介绍的指令系统同样适用于 8086 CPU。8086/8088 CPU指

    26、令系统可分成下面几类:(1)数据传送指令;(2)算术运算指令;(3)逻辑运算指令;(4)移位指令;(5)标志处理指令和CPU控制指令;(6)转移和循环控制指令;(7)调用和返回指令;(8)字符串操作指令;(9)输入、输出指令。本节主要介绍前 5 类指令,后面各类指令将结合程序设计和输入/输出时分别介绍。对于指令系统的介绍,我们重点将放在各条指令的功能和它们的使用上,关于这些指令的功能是如何实现的以及执行指令的具体操作细节将不作详细讨论。学习指令系统着重要掌握指令的基本操作功能,合法的寻址方式以及对标志位的影响。在详细介绍指令系统之前,我们将书中描述指令操作时用到的各种缩写和符号列于表 4.4中

    27、。4.2.1数据传送类指令数据传送类指令 这里讨论的数据传送指令仅指CPU中的寄存器与寄存器或者寄存器与存储单元之间的数据传送。这类指令的基本格式及功能说明见表4.5。表中除了SAHF和POPF指令外,标志寄存器F的各位均不受影响。指令中出现两个操作数时,目的操作数在前,源操作数在后,并且目的操作数的寻址方式一定不能为立即数和段寄存器CS。表 4.5数据传送类指令的格式与功能 1.通用传送指令通用传送指令(MOV)指令的功能是将源操作数SRC的一个字节或一个字传送到目的操作数DST所指单元。源操作数可以是通用寄存器、段寄存器、立即数和内存单元,目的操作数可以是通用寄存器、段寄存器和内存单元,但

    28、不能为立即数和CS。内存单元可以通过第 3 章所指出的各种寻址方式寻址,当目的操作数为段寄存器时,源操作数不能为立即数,当源操作数不是立即数时,两个操作数中必须有一个是寄存器。例如:MOV AX,BX;将BX中的一个字传送到AX中 MOV AL,DL;将DL 中的一个字节传送到AL中 MOV AX,02;将立即数 02 传送到AX中 MOVSI,BX ;(SI)(BX)MOV#AL,4DI ;将(DI)+4 作为偏移地址,将该单 元内容送入AL MOVAX,BX+2 ;将寄存器BX中的内容加 2 后的 值作为偏移地址,将该单元中 ;的一个字节送入AL中,该单元 的下一个字节送AH中 MOVBX

    29、DI,DX ;(BX)+(DI)(DL),(BX)+(DI)+1)DH 上述指令都是合法的。前两条指令的源操作数与目的操作数的寻址方式均为寄存器寻址方式;第 3 条指令的目的操作数仍为寄存器寻址方式,而源操作数的寻址方式则为立即数方式;第 4 条指令的源操作数为寄存器间接寻址,源操作数的有效地址为BX的内容即EA=(BX),因而指令的功能是将EA所对应单元中的一个字送入SI。下面我们着重说明后面三条指令的寻址方式和传送过程:MOVAL,4DI 指令的源操作数为寄存器相对寻址方式,或称变址寻址方式,其有效地址EA=(DI)+4,EA即为源操作数在段内的偏移地址。指令的功能是将有效地址EA所对应的

    30、单元中的一个字节送入AL中,当(DI)=0400H时,该指令执行后,AL中的内容为0AH。指令的传送过程见图4.2(a)。MOV BXDI,DX传送过程 MOVAX,BX+2 指令的源操作数的寻址方式也为寄存器相对寻址方式(或称基址寻址方式),其有效地址EA=(BX)+2,当(BX)=1000H时,那么,EA=1002H,指令的功能是将EA所对应单元中的一个字送入AX。由于一个字的数据在内存占据两个字节单元,所以,该指令完成的传送应为(EA)(AL),(EA+1)(AH),传送过程见图 4.2(b)。MOVBXDI,DX 指令的源操作数的寻址方式为寄存器方式,目的操作数的寻址方式为基址变址寻址

    31、方式,其有效地址EA=(BX)+(DI)。指令的功能是将DX中的 16 位数送入有效地址EA所指的 2 个字节单元中,具体过程应为(DL)(EA),(DH)(EA+1)。传送过程见图 4.2(c)。当程序中采用伪指令定义了一组变量后,那么,传送指令可以有下面的形式:假设变量定义如下:DATA1DW 20H,30H DATA2DB 50H,60H,70H DATA3DW 10H DUP(?)传送指令可以有:MOVAX,DATA1 MOVDATA3,BX MOVAL,DATA2 DI MOVDATA3 SI,DX MOVCX,LENGTH DATA3 MOVBX,SIZE DATA3 MOVSI,

    32、OFFSET DATA2 上述传送指令都是合法的。第 1 条指令的源操作数和第 2 条指令的目的操作数的寻址方式为直接寻址方式,其有效地址EA即为变量DATA1 和DATA3 的偏移地址,可以表示为EA=OFFSET DATA1 和EA=OFFSET DATA3。所以第 1 条指令的功能是将变量DATA1 对应地址单元中的一个字送入AX,故(AX)=0020H。第 3 条指令的源操作数和第 4 条指令的目的操作数的寻址方式为寄存器相对寻址方式,其有效地址分别为EA=(DI)+OFFSET DATA2 和EA=(SI)+OFFSET DATA3,即将变址寄存器的内容加上变量DATA1 或DATA

    33、3 的偏移地址。若(DI)=1,(SI)=0,(DX)=103FH,那么,执行第 3 条指令后,(AL)=60H,第 4 条指令执行后偏移地址为DATA3 的内存单元内容为 3FH,下一单元的内容为 10H。第 5 条指令采用了表达式LENGTH DATA3,即取变量DATA3 的长度,由于变量定义时DATA3 分配了 10H个字变量空间,所以,该指令执行后,(CX)=10H。第 6 条指令取的是变量DATA3 所占的字节数,所以,指令执行后(BX)=20H。第 7 条指令用了操作符OFFSET,它是将DATA2 的偏移地址送入SI。最后 3 条指令的寻址方式均属于立即数寻址方式,因为在汇编后

    34、,源操作数已是已知的确定数值了。指令中传送的是一个字还是一个字节,通常由操作数的类型确定。当操作数是寄存器时,那么,16 位寄存器将指出该操作数为字类型,8位寄存器则指出对应的操作数为字节类型,若操作数是某种寻址方式所指出的内存单元时,那么,相应的操作数的类型有时是明确的,而有时可能是不明确的。如下面 3 条指令:MOVDATA3 SI,02 MOV2 SI,AL MOV4 DI,02 上述指令中的目的操作数均为寄存器相对寻址方式所指的内存某单元,第 1 条指令的目的操作数的类型将取决于变量DATA3 的类型,只要变量DATA3 已定义,其类型是明确的,而后两条指令的目的操作数的类型就不明确了

    35、,但因第 2 条指令的源操作数的类型是明确的,从而指令属于字节传送。第 3 条指令因源操作数与目的操作数的类型均不明确,因而为非法指令,此时,必须用前面介绍的PTR操作符来指明其操作类型,格式如下:MOVBYTE PTR 4DI,02 这样就指出了指令为字节操作。此外,传送指令的两个操作数的类型必须一致,否则,指令将为非法指令。如有下面的变量说明及指令:DATA1#DW 05H,15H,20H DATA2DB 0FH,10H,0AH DATA3DB 5 DUP(?)MOVAX,BL MOVAL,DATA1 MOVBX,DATA3SI 上面的 3 条指令均为非法指令,它们的两个操作数类型都不一致

    36、。程序中有时会需要从一个字变量中取一个字节数据,例如上面的第 2 条指令企图完成的功能是要将 05HAL中,那么,我们也必须采用PTR操作符来重新定义变量的类型,格式如下:MOVAL,BYTE PTR DATA1 对于通用传送类指令,我们应着重掌握的是进行传送的两个操作数的寻址方式及其书写格式,也就是传送数据的两个操作数的有效地址以什么方式获得,并在指令中如何表示 这些寻址方式及其书写格式不仅适用于传送类指令,同样也适用于其它各类指令。下面我们对通用传送指令中与寻址方式有关的内容归纳如下:(1)两操作数进行数据传送的正常通路如图 4.3 所示。图中的箭头指出了两者之间可以进行数据传送的方向。例

    37、如存储器与寄存器AX、BX、CX、DX、DI、SI、SP、BP之间可以双向传送,而存储器与段寄存器CS之间只能单向传送。(2)寄存器间接寻址、寄存器相对寻址、基址变址寻址和基址变址相对寻址方式中所用到的寄存器不能是数据寄存器AX、CX和DX,只能使用变址寄存器DI、SI和基址寄存器BX、BP。(3)寄存器相对寻址和寄存器基址变址相对寻址方式中的位移量DISP可以是常量,也可以是变量,并且可以有多种书写格式。下面以寄存器相对寻址为例,给出几种可用的书写格式:MOVAX,DISPBX MOVAX,BX+DISP MOVAX,BX.DISP MOVAX,BX+DISPHT5SS 上述 4 条指令的功

    38、能是完全一样的,源操作数的有效地址均为EA=(BX)+DISP。指令中的寄存器BX也可以是其它的基址、变址寄存器。最后必须指出,按某种寻址方式计算得到的有效地址是段内的偏移地址,对于某存储单元的完整地址还应包括其段地址,段地址则在相应的段寄存器中。在第 3 章中已指出,数据段的段地址在DS中,所以,在执行上述指令之前,首先必须通过传送指令将段地址送入段寄存器DS中。例如可以采用下面两条传送指令:MOVAX,SEG DATA1;将变量DATA1 的段地址送入AX MOVDS,AX 若程序中所用的数据段的段址寄存器不是DS,而是ES,那么,指令中必须用段前缀加以说明,其格式为:MOVAX,ES:S

    39、I 它告诉汇编程序,这条指令中要取的数据的段址在ES中,而不在DS中,汇编后形成的机器指令也增加一个前缀字节,以说明所用的段寄存器。此外,当寄存器相对寻址方式中所用寄存器为BP时,所用的段寄存器有两种可能,见下面两条指令:MOVAL,DATA2BP MOVAL,+10 上面第 2 条指令的段址将隐含为SS,而第 1 条指令的段址则根据变量DATA2 的段址存放在哪个段寄存器中而定,例如通常数据段的段地址在DS中,因而第 1 条指令的段地址不在SS中,而在DS中。关于变量所在段的段地址存放在哪个段寄存器中,可由伪指令指出,这将在 4.3 节中介绍。2.取有效地址指令取有效地址指令(LEA)指令的

    40、功能是将源操作数SRC的有效地址(偏移地址)送入寄存器REG中。这里的REG不允许是段寄存器,源操作数的寻址方式不允许是立即数和寄存器方式。这是一条特殊指令,它传送的不是操作数本身,而是操作数的有效地址。为说明问题,我们比较下面两行指令执行的结果:MOVAX,10HDI LEAKG*4AX,10HDI 假设(DI)=0500H,(DS)=0200H,对应内存单元的内容如图 4.4 所 示。那 么,第 一 条 指 令 执 行 后,A X 的 内 容 为(AX)=00FFH,它是将 0200H段中的偏移地址为 0510H处的 16 位数送入AX。第二条指令执行后,AX的内容为(AX)=0510H,

    41、也即将源操作数的有效地址的偏移地址送入了AX。取有效地址指令也可以有下面的形式:LEADI,DATA1 LEABX,AGAIN 指令中的DATA1 及AGAIN可以是已定义的变量,也可以是程序中的语句标号,不论是变量还是标号,它们都有段和偏移地址的属性。在该指令中,它们将取变量或标号的偏移地址送入相应的寄存器。所以,下面两条指令是完全等效的:MOVAX,OFFSET DATA1 LEAAX,DATA1 3.取地址指针指令取地址指针指令(LDS,LES)该指令的功能是将源操作数SRC的有效地址所对应的内存单元中的 32 位内容分别送入DS(或ES)和指令中所指出的寄存器REG中。同样,这里的RE

    42、G不允许为段寄存器,源操作数的寻址方式不允许是立即数和寄存器方式。我们可以有下面的变量定义和指令:TABLEDB 10H,20H,30H,40H,50H POINT1DD 02001000H POINT2DD TABLE LDSDI,POINT1 LESSI,POINT2 指令LDS DI,POINT1执行后,(DI)=1000H,(DS)=0200H;指令LES SI,POINT2 执行后,(SI)=OFFSET TABLE,(ES)=SEG TABLE。要指出的是,汇编后双字变量POINT2 中的 32 位内容将是变量TABLE的 32 位地址,其高 16 位是TABLE的段地址,低 16

    43、 位是TABLE的偏移地址,这正是双字变量的一种重要用途。上面两条指令的源操作数的寻址方式为直接寻址方式,也可采用其它寻址方式,但不同寻址方式所指的内存单元都应是双字类型。4.标志传送指令标志传送指令(LAHF,SAHF)在第 3 章中已介绍,CPU中有一标志寄存器FLAG,其中的每一位标志了CPU的一种状态。我们以后会看到,许多指令的执行结果会影响标志寄存器中的某些位,同时,有些指令的执行也受标志寄存器中的某些位控制。所以,标志寄存器的内容与指令的执行有着密切的关系。现在介绍的两条指令只是实现标志寄存器中的低 8 位与寄存器AH之间的传送。LAHF是将标志寄存器中的低 8 位内容送入寄存器A

    44、H,SAHF是将AH中的 8 位内容送入标志寄存器的低 8 位中。显然SAHF指令可以同时改变标志寄存器FLAG的低 8 位中的各位的值。5.数据交换指令数据交换指令(XCHG)该指令是完成寄存器与寄存器或寄存器与存储单元之间内容交换的。该指令要求两个操作数之一必须是寄存器,允许两个操作数都是寄存器,但不允许是段寄存器。例如:XCHGAX,BX;(AX)(BX)XCHGCX,DI;(CX)(DI)XCHGBX,DATA1 上述指令都是合法的,其中第 2 条指令和第 3 条指令完成的是寄存器与内存单元的内容交换。第 2 条指令源操作数为寄存器间接寻址,即由DI的内容指明了要交换的内存单元的偏移地

    45、址。第 3 条指令的源操作数为直接寻址,DATA1 是已定义的变量,DATA1 的偏移地址直接指明了要交换数据的内存单元的偏移地址。自然,该指令的功能是可以用MOV指令代替的,但是,若采用MOV指令则需要用三条指令和一个附加寄存器或存储单元才能完成。6.字节转换指令字节转换指令(XLAT)该 指 令 的 寻 址 方 式 是 隐 含 的,其 有 效 地 址EA=(BX)+(AL)。指令的功能是将EA所对应的内存单元中的一个字节送入AL中,从而实现了AL中的字节变换。该指令可用于两种代码的转换,例如要将表 4.6 中的代码CODE1 转换成代码CODE2,我们只要将表中的代码CODE2 依次存入地

    46、址连续的内存单元中,如表 4.7 所示。那么,若将其首地址TABLE送入BX,将需要转换的一个CODE1 的代码送入AL,执行XLAT指令后,AL中便是对应的CODE2 的代码了。例如,求CODE1代码中的 5 所对应的CODE2 代码,可以用下面的程序段:7.堆栈操作指令堆栈操作指令 1)堆栈 堆栈是以后进先出(LIFO)的规则存取信息的一种存储机构。在微型计算机中,堆栈通常是存储器的一部分。为了保证堆栈区的存储器能按后进先出的规则存取信息,该存储区的存取地址由一个专门的地址寄存器来管理,这个地址寄存器称为堆栈指示器或称堆栈指针。当信息存入堆栈时,堆栈指针将自动减量并将信息存入堆栈指针所指出

    47、的存储单元,当需要从堆栈中取出信息时,也将从堆栈指针所指出的存储单元中读取信息,并自动将堆栈指针增量。所以,堆栈指针始终指向堆栈中最后存入信息的那个单元,我们称该单元为堆栈顶。在信息的存与取的过程中,栈顶是不断移动的,也称它为堆栈区的动端,而堆栈区的另端则是固定不变的,这端我们又称其为栈底。在 8086/8088 CPU中,寄存器SP即为堆栈指针,它是一个 16 位的地址寄存器,用来存放堆栈区的偏移地址,堆栈区的段地址则存于段寄存器SS中。若把内存中某段的偏移地址为 000000FFH的一个存储区作为堆栈,那么堆栈指针SP的初值为 0100H。此时,若向堆栈中存入信息,那么,首先将SP内容减

    48、2,即(SP)=00FEH,然后,将 16 位信息送入SP所指单元,如图 4.5 中所示,第1个16 位信息0102H送入了00FFH和 00FEH两字节单元中,随后,SP指向 00FEH单元,当栈中送入 4 个字以后,SP将指向 00F8H。现在,若需从堆栈中取出信息,由于当前(SP)=00F8H,因此,首先取出的信息将是该单元的内容,即 0708H,并且SP内容加 2,使SP指向 00FAH,紧接着再取的第 2 个信息为 00FAH单元的内容 0506H,同时,SP的内容将修正为 00FCH。可见,堆栈的读写地址由一个堆栈指针指示后,保证了它的信息存取按后进先出的规则进行。在程序设计中,堆

    49、栈是十分有用的一种结构。后面要介绍的子程序的调用与返回都将离不开堆栈。此外,堆栈还可以用来保存程序中的某些信息,这些信息需要以后进先出的规则存取。在输入输出系统中,中断响应和返回的正确操作也必须由堆栈来保证。2)堆栈操作指令 堆栈操作指令是用来完成堆栈操作的。堆栈的主要操作是对堆栈进行信息的存取。通常将信息送入堆栈的过程称为压入操作,而从堆栈中取出信息的过程称为弹出操作。8086/8088 指令系统中提供了完成这两种操作的相应指令。指令的助记符及功能说明见表 4.5。(1)压入指令(PUSH)。压入指令是将SRC或标志寄存器FLAG的内容送入堆栈,并修正堆栈指针的内容。指令的操作必须是字类型的

    50、。指令中的操作数SRC可以是通用寄存器和段寄存器,也可以是某种寻址方式所指示的内存单元,但不能是立即数。指令对标志寄存器内容没有影响。例如:PUSHAX;(SP)(SP)-2,(SP)(AL),(SP)+1)(AH)PUSHDS PUSHSI PUSHF 上述都是合法指令。第 1 条指令是将 AX中的内容送入堆栈。首先,SP内容减 2,然后,将AL 的内容送入SP所指单元,AH的内容送入(SP)+1 所指单元。第 2 条指令是将段寄存器的 16 位内容送入堆栈,并修正SP内容。第 3 条指令是将内存某单元的 16 位内容送入堆栈。同样,首先将 SP 内容减 2,然后,将(SI)所指单元的 8

    展开阅读全文
    提示  163文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:第-4-章-汇编语言程序设计基本方法-微型计算机原理与应用-教学课件.ppt
    链接地址:https://www.163wenku.com/p-4915533.html

    Copyright@ 2017-2037 Www.163WenKu.Com  网站版权所有  |  资源地图   
    IPC备案号:蜀ICP备2021032737号  | 川公网安备 51099002000191号


    侵权投诉QQ:3464097650  资料上传QQ:3464097650
       


    【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。

    163文库