欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    PC汇编语言程序设计ppt课件 第5章 基本汇编语言.ppt

    • 资源ID:1481306       资源大小:1,023.50KB        全文页数:157页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    PC汇编语言程序设计ppt课件 第5章 基本汇编语言.ppt

    第五章 基本汇编语言,5.1 汇编语言的语句 5.2 汇编语言的表达式和运算符 5.3 伪指令语句 5.4 指令语句 5.5 汇编语言程序的格式 5.6 汇编语言程序的上机过程 习题五,5.1 汇编语言的语句,5.1.1 汇编语言的语句分类 汇编语言源程序中可以使用三类语句, 它们分别是: (1) 指令语句。这类语句又称机器指令语句, 其经汇编后能产生相应的目的码,或称机器代码,这些代码能被CPU直接识别并执行相应的操作。例如:第四章中已作过介绍的MOV, SUB, CMP, XOR等指令均属机器指令语句。,(2) 伪指令语句。这类语句指示汇编程序在汇编源程序时完成某些工作,比如给变量分配内存单元地址,给某个符号赋一个值等。伪指令语句与指令语句的最大区别是:伪指令语句经汇编后不产生机器代码,而指令语句经汇编后会产生相应的机器代码;其次伪指令语句所指示的操作是在程序汇编时完成的, 而指令语句的操作必须在程序运行时才能完成。 例如,第四章介绍的数据定义伪指令DB,DW就属伪指令语句。,(3) 宏指令语句。在8088/8086和80X86系列的汇编语言中,允许用户将多次重复使用的程序段定义为宏。宏的定义必须按相应的规定进行,每个宏都有相应的宏名。在程序的任意位置, 若需要使用这段程序只要在相应的位置使用宏名,即相当于使用了这段程序。 因此,宏指令语句就是宏的引用。宏的引用语句就是宏指令语句。有关宏的详细介绍见第十章。,5.1.2 汇编语言的语句格式,1 名字项 (1) 名字项的名称和含义。 在三类语句中,名字项有不同的名称和含义。名字项出现在指令语句或宏指令语句前时,称该名字项为标号且对应的标识符后面必须跟有冒号, 标号在汇编以后分配有地址。因此,标号可以用来指示指令代码在内存中的地址。标号又称为符号地址,可作为转移指令或子程序调用指令的目标地址。 若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、 子程序名或段名等。,(2) 名字项的书写规则。 名字项的书写有严格的规定, 它可使用下列字符: 字母 AZ、 az 数字 09 特殊字符 ?、 、 、- 、 等 名字项的第一个字符必须是字母或特殊字符, 从第二个字符起可以跟字母、 数字、特殊字符,但是问号本身不能单独作为名字, 名字最多由31个字符组成,多则无效。 需要注意的是,名字不能使用汇编语言的专用保留字, 8088/8086汇编语言中的指令助记符,寄存器名,伪指令名,表达式中使用的运算符和属性运算符等均不能作为名字项,否则汇编时会给出错误信息。另外,名字项在程序中不能重复定义。,(3) 名字项的属性。 名字项中标号和变量都有相应的属性, 分别介绍如下: 标号的属性。 标号一般出现在指令语句前面,它表示指令的符号地址, 指示汇编后该指令代码在内存中位置。因此,它有三种属性: 段属性、偏移属性和类型属性。 段属性:表示该标号的段起始地址,且该地址一定是在CS段寄存器中。 偏移属性:表示标号在代码段中的段内偏移地址,是一个 16 位的无符号数,表示从段起始地址开始到定义标号的位置之间的距离(字节数)。 类型属性:表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。, 变量的属性。 变量经常作为操作数出现在各种语句中,变量是在除代码段以外的段中用伪指令进行定义的,定义变量实际上就是给变量分配内存单元,因此,变量也有三种属性:段属性、偏移属性和类型属性。 段属性:表示变量所在段的起始地址。该地址值必须在除代码段以外的其它段寄存器中。 偏移属性:表示变量在段内的偏移地址,即从段的起始地址开始到变量所对应的内存单元之间的字节数,用16位无符号表示偏移地址。 类型属性:表示该变量能存放的数据长度,它与变量定义时使用的伪指令有关。长度为1个字节的类型属性为BYTE, 长度为2个字节的类型属性为WORD等。同一个标号或变量的定义在一个程序中只允许一次, 否则会出现重复定义错误。,(4) 符号常数。 当名字项出现在EQU伪指令或“”语句之前时,称该名字项为符号常数。程序中用符号名代表一个常数或表达式值, 可以增加程序的可读性。符号常数经常在表达式中使用,也可单独作为操作数出现在语句中。字符常数没有上述的属性问题。,2 操作项 操作项表示语句要实现的具体操作,可以是指令、伪指令、 宏指令语句的助记符。 汇编程序对于上述三类语句会作不同的处理。对于指令语句,汇编程序会将它翻译成二进制指令代码; 对于伪指令语句,汇编程序会按其意义完成汇编;对于宏指令语句, 汇编程序将其展开,也就是用宏体替代原来的宏指令语句。,3 操作数项 操作数项根据不同的语句由一个或多个表达式组成,两个以上的表达式之间要用逗号分开。 操作项的常见形式有:常数、 寄存器、 标号、 变量或表达式。其中,表达式是由常数、变量、 标号通过操作数运算符连接而成的式子。需要注意的是:表达式的值是在汇编的过程中计算出来的,根据表达式中的成分,计算出来的结果可能是操作数的地址值,也可能就是操作数。 下面先介绍常数。 运算符、表达式、变量和标号的详细介绍见5.2和5.3节。 汇编语言的常数(或称常量)概念与高级语言相同, 允许使用以下三种常数:,(1) 数值常数。 数值常数分为整数和实数。分别介绍如下; 整数的表示方法。 整数可以使用二进制、八进制、十进制或十六进制的数来表示,为了区分不同的数制,在数的末尾加后缀字母以区分。 后缀字母“B”(Byte),表示它前面的数是二进制的,字母 “O”(Octal)或“Q“表示它前面的数是八进制的,字母“D”(Decimal) 表示它前面的数是十进制的,不加字母“D”也默认为是十进制的数,字母“H”(Hexadecimal)表示它前面的数是十六进制的。后缀字母也同样适用于地址(段内偏移地址)。,当操作数或地址(段内偏移地址)使用十六进制数表示时, 若数的最高位以字母AF开头,则必须在它前面加一个0。这样可以使数或地址避免与变量、标号或寄存器名混淆。 例如,要给寄存器AL送一个十六进制的数(A)16的指令,数前不加0的指令为:MOV AL, AH,数前加0的指令为 MOV AL, 0AH。 显然,这两条指令执行结果是不同的, 数前加0的指令得到的结果才是所希望的。, 实数的表示方法。 有协处理器(浮点运算器)的主机,在汇编语言程序中还可安排各种实数运算, 实数可以采用两种形式表示,一种是带小数点的十进制数形式。 另一种是指数形式,其格式为: 整数部分.小数部分E指数部分。例如:576.3,-312.125, 1.2E-1,37.54E+5都是正确的实数形式。,实数在存储器中以浮点数的形式存储,根据存储实数所用的字节数,又可分为短实数格式(又称单精度浮点数),长实数格式(又称双精度浮点数)和暂存实数格式(又称扩展精度数)。它们分别占用4个字节、 8个字节和10个字节。 若想在内存中预先定义上述三种实数必须使用DD, DQ和DT伪指令。 (DD,DQ和DT为数据定义伪指令, 本章稍后将进一步介绍。 )例如: DAT1 DD -245.6 ; 定义短实数 DAT2 DQ 3578.41 ; 定义长实数 DAT3 DT -1.23E-5 ; 定义暂存实数,(2) 字符串常数。 字符串常数是指用单引号括起来的一个字符或多个字符的序列。使用时可以在单引号内直接写字符序列, 也可以写字符的ASCII码,但ASCII码之间必须用逗号作分隔(此时不需要用单引号)。 例如, MOV AH, A指令和MOV AH, 41H指令是等价的。 (3) 符号常数。符号常数是指用EQU伪指令或赋值语句“=”定义过的符号名,可作操作数项或在表达式中使用。,4 注释项 注释项不是语句的必要部分。它主要用来说明一个程序、 一段程序或重要的指令的功能,增加程序的可读性。对于较大的程序,注释项更不能少,有了注释, 程序易读,也便于日后修改和维护。 注释项可以独立存在于程序中,但必须以分号开头。汇编程序对于分号后面的内容不予汇编。利用注释项的这个特点, 在调试程序中, 也可将分号加到指令前,以暂时冻结有疑问的指令,调试正确后,再对这些指令解冻或删除, 这样可以减少语句增、 删的编辑工作。,5.2 汇编语言的表达式和运算符,汇编语言中,表达式是操作数项的常见形式, 它们经常出现在指令或伪指令语句中。表达式是由常数、变量、 标号通过运算符连接而成的。 需要提醒初学者的是:表达式中一般不允许出现寄存器,只有某些能存放段内偏移地址的寄存器才允许出现在表达式中。例如, SI, DI, BP, BX等。 另外,表达式的值只计算一次, 在汇编时完成, 而不是在程序运行时完成。 例如:,X5 XX5 ; 赋值语句在循环体中 ,5.2.1 算术运算符 算术运算符有、 *、 /、 MOD以及只能出现在表达式中的SHR和SHL运算符。其中, 、 、 *、 /是最常用的运算符, 要求参加运算的数(或地址)均为整数, 运算的结果也为整数, 除法运算的结果是商的整数部分。 MOD运算的结果是前一个操作数除以后一个操作数得到的余数, 如15 MOD 2的结果为1。 ,出现在表达式中的SHR和SHL运算符其使用时的格式为: 表达式SHR次数或表达式SHL次数。其作用是在汇编时将表达式的值右移或左移指定的次数,然后作为一个操作数。例如:,尽管算术运算符可以用在数值表达式或地址表达式中, 但在具体使用时仍要注意运算结果的物理意义是否正确。例如, 两个地址相除是无意义的,两个不同段的段基址相加、减是无意义的。另外还要注意运算对象的正确性,如: MOV AX, DX SHL 2指令中的第2个操作数项DX SHL 2是非法的,因为DX不能存放偏移地址。若DAT为已定义过的某个字节的符号, 那么MOV BL,DAT1指令中的第2个操作数是正确的,它表示要将DAT单元的地址加1,然后再将该数取出来传送给BL寄存器。,5.2.2 逻辑运算符 逻辑运算符依次为NOT, AND,OR和XOR。 逻辑运算是按位进行操作的,位与位之间没有进位和借位。其中,NOT运算符是单操作数运算符,其余三个运算符是双操作数运算符。提请读者注意的是,出现在表达式中的上述运算符不是指令,运算符指定的运算是在汇编时完成的, 而指令是在程序运行时完成的。 例如: MOV AL, NOT 0F0H MOV BH, 0F0H AND 0FH,上述两条指令汇编后与下面两条指令等效: MOV AL, 0FH MOV BH, 0,5.2.3 关系运算符 关系运算符有六种,它们用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立, 结果为真, 用全“1”表示。 反之结果为假, 用全“0”表示。 六种关系运算符分别是: EQ 相等(Equal) NE 不等(Not equal) LT 小于(Less) LE 小于或等于(Less or Equal) GT 大于(Greater) GE 大于或等于(Greater or Equal),例如: MOV AL,5 EQ 3 MOV DH,5 GT 3 汇编后分别等效于: MOV AL, 0 MOV DH, 0FFH 若有两个数据类型相同的符号地址X和Y,在DB伪指令中, 则 V DB X GT Y 汇编时,当X的偏移地址大于Y的偏移地址时,变量V的内容为0FFH,反之其内容为0。,5.2.4 数值返回运算符 数值返回运算符有五种,这些运算符的运算对象必须是变量或标号,其运算结果是变量或标号的特征值(类型属性值)或是它们对应的内存单元地址(段基址或段内偏移地址)。 带有上述运算符的表达式, 其格式可统一表示为: 运算符变量名或标号 下面介绍五种数值返回运算符。,2. SEG(Segment)运算符 当SEG运算符置于变量或标号前面时,汇编程序按SEG运算符的功能,取得了变量或标号所在段的段基址。 例如:想得到变量X的段基址并存放到AX寄存器, 可用指令 MOV AX, SEG X 上述指令执行后, AX寄存器的内容即为变量X的段基址。,3. TYPE运算符 当TYPE运算符置于变量前面时,汇编程序按TYPE运算符的功能,取得变量的类型数字,该数字表示该变量所分配的存储单元(字节)数。即类型属性为BYTE的变量返回值为1, 类型属性为WORD的变量,返回值为2, 类型属性为DWORD的变量, 返回值为4。 当TYPE运算符置于标号前面时,汇编程序按其功能,返回标号的类型属性值;当该标号为NEAR属性时,返回值为-1, 标号为FAR属性时,返回值为-2。 例如:,上述两条指令在汇编后相当于指令: MOV AL, 1MOV CX, 10H,5. SIZE运算符 SIZE运算符仅对变量起作用,汇编程序对该运算符返回的值表示该变量所分配的总字节数,此数是该变量的LENGTH值和TYPE值的乘积。 例如:上例中的A2变量,若想知道它分配的总字节数, 可用下述指令表示: MOV CX, SIZE A2汇编后相当于有指令: MOV CX, 20H即变量A2总共分配有20H个字节数。,5.2.5 属性修改运算符 1. PTR(Pointer)运算符 格式: 类型 PTR 地址表达式其中,表达式的形式可以是标号、变量或是用作地址偏移量的寄存器。PTR运算符的作用是将地址表达式的原类型属性临时修改成PTR运算符前面所指定的类型。指定的类型可以是 BYTE、WORD或DWORD。注意PTR运算符只在语句内有效。 例如:要将一个立即数20H存入以SI寄存器内容所指定的内存单元,那么SI所指向的单元是字节单元还是字单元,就可以使用PTR运算符加以说明。,MOV BYTE PTRSI, 20H或 MOV WORD PTRSI, 20H 第一条指令表示目的操作数是字节单元,第二条指令表示目的操作数是字单元。 指令 JMP FAR PTR SUB 表示标号SUB不在转移指令的同一段内。即这条指令可使程序转向另一代码段。 DAB DB 12H, 34H MOV AX, WORD PTR DAB 上述传送指令的源操作数由于使用了PTR运算符将DAB的类型属性修改成WORD类型,因此,执行该指令时是取2个字节的数送给寄存器AX的。,3. THIS运算符 格式: THIS 属性或类型 THIS运算符和PTR运算符相似, 它可以建立一个指定类型或指定距离的地址操作数。当建立一个指定类型的地址操作数时,该操作数的段基址和段内偏移地址与下一个存储单元地址相同。 例如: NEWTYPE EQU THIS BYTE WORDTYPE DW 10H, 2356H,汇编后建立一个新的地址操作数NEWTYPE,并且它的段基址,段内偏移地址和WORDTYPE相同,但前者是字节类型的,后者是字类型的。根据需要可以选择其中的符号地址,取一个字节的数据用符号地址NEWTYPE,取一个字的数据用符号地址WORDTYPE。 THIS运算符也可以建立一个指定距离属性的指令标号。 例如: BEGIN EQU THIS FARMOV CX, 0 汇编后,MOV指令有一个FAR属性的地址BEGIN,这样就允许其它代码段中的JMP指令直接跳到BEGIN处执行MOV指令。,4. HIGH和LOW运算符 格式: HIGH/LOW表达式 其中, 表达式可以是数或地址表达式。 两个运算符都是针对一个16位的数或地址表达式的,其中, HIGH运算符取其高位字节,LOW运算符取其低位字节。例如: CONST EQU 1234H MOV AH, HIGH CONST MOV AL, LOW CONST,上述指令执行后, AH寄存器值为12H, AL寄存器的值为34H。 以上分别讨论了五大类运算符,当一个表达式中出现多种运算符时,应先计算优先级别高的运算符,对优先级相同的运算符则应从左到右进行计算。 括号可用来改变计算次序,括号内的表达式应先计算。 运算符的优先级别见表5 - 1(本书未提及的运算符可查阅有关手册)。,表 5-1 运算符的优先顺序,5.3 伪指令语句,伪指令语句简称伪指令。伪指令是汇编语言程序设计的一个重要部分。程序员可以使用伪指令向汇编程序发出某些控制和操作指示,在汇编过程中完成相应的工作。伪指令与机器指令的最大区别是:伪指令由汇编程序解释后完成相应的操作, 汇编后不产生目的代码,经过汇编后得到的目的码程序中,伪指令已不复存在。机器指令语句一定有对应的目的代码,并由汇编程序翻译成机器代码,只能在程序运行时才能由CPU完成其操作。尽管不同的汇编程序提供有不同的伪指令,但绝大部分伪指令都相互兼容。,目前国内比较流行的汇编程序是Microsoft的MASM5.0版本, 它最高能支持80386和80387处理器,并且比MASM1.0至MASM4.0的汇编和链接速度更快。而MASM6.0是微软公司1991推出的宏汇编程序, 它对MASM进行了重新组织,提供了许多新的伪指令、高级语言控制结构及许多新的数据类型, 更重要的是: 它能支持80486的汇编语言程序设计。,表 5-2 伪 指 令 分 类,5.3.1 数据定义伪指令 数据定义伪指令的主要功能是负责为变量分配内存单元, 也可以预置初值,或预留内存单元。 常用的伪指令有DB, DW, DD, DQ和DT。 伪指令的格式为: 变量名 伪指令名 操作数项表其中,变量名为可选项,伪指令名可以是上述五种伪指令之一, 操作数项表表示操作数可由多个操作数组成。 操作数的形式可以是常数、表达式、字符串、?或带DUP的表达式。,不同伪指令为变量分配的内存单元有: D1 DB 操作数项表 ; 每项分配1个字节D2 DW 操作数项表 ; 每项分配2个字节D3 DD 操作数项表; 每项分配4个字节D4 DQ 操作数项表 ; 每项分配8个字节D5 DT 操作数项表 ; 每项分配10个字节,1 操作数为常数或表达式 数据定义伪指令可以为变量预置常数值或表达式值。例如: D1 DB 30H, 30 ; 变量D1的内容为30H, 它的下一个字节单元的内容为30D D2 DW 25*25 ; 变量D2的内容是625D D3 DD 12345678H ; 变量D3的内容是12345678H D4 DB 15, 45 MOD 5 ; 变量D4的内容为15, 它的下一个字节单元的内容为0,2 操作数为字符串 当使用DB伪指令, 而操作数为字符串时,必须以单引号括起来,括起来的字符个数不能超过255个,字符串将以ASCII码的形式按地址递增的顺序依次存放在以变量名开始的内存单元中。例如: ST DB THIS IS A STRING,3 操作数为? ?用于为变量预留内存单元。 例如: X1 DB ? ; 为变量X1预留1个字节单元X2 DW ?; 为变量X2预留2个字节单元X3 DD ?; 为变量X3预留4个字节单元,4 操作数为带DUP(Duplication)的表达式 当数据定义时有多个相同操作数项或要预留多个内存单元时,采用带DUP的表达式进行定义非常方便、 简捷。 DUP在汇编语言中称为重复定义操作符,DUP操作符的使用格式为: 表达式 DUP(操作数项)其中,表达式的值表示要重复定义的次数, 操作数项表示要重复的内容, 操作数项的形式仍为上述四种形式。 例如:,V1 DB 20 DUP(?) ;表示从V1开始预留20个字节V2 DW 4 DUP(3, 5) ; 表示从V2开始重复定义 4 个字, 由低到高, 第一个字为3, 第二个字为5, 第三个字为3, 第四个字为5V3 DB 5 DUP(3 DUP(2), 7) ; 表示从V3开始重复定义5个数据系列“2, 2, 2, 7”, 共占用20个字节单元V4 DB 10 DUP(ABCD) ; 表示从V4开始重复定义10个字符 串“ABCD”, 共占用40个字节单元,5.3.2 段定义伪指令 段定义伪指令主要用于将源程序划分为若干段,指出段的用途,便于汇编程序在相应的段下生成目的代码,也可经过连接程序将不同模块的同名段予以合并,生成一个结构更紧凑的可执行目标程序。段定义伪指令由SEGMENT和ENDS伪指令组成, 段定义的格式为: 段名 SEGMENT 定位类型 组合类型 类别名,段名 ENDS,段定义伪指令的作用是定义一个逻辑段,其中,段名由用户指定,一个段开始与结束使用的段名应一致。SEGMENT表示段定义开始的伪指令,ENDS(End of Segment)表示段结束伪指令。 段定义伪指令后面的三个可选项,指明段的属性,各可选项之间用空格分隔。 以下分别介绍三个属性。 ,1 定位类型 定位类型表示对当前定义的段的起始地址的要求, 可有五种选择: (1) PAGE 表示本段的起始地址(段基址)的低 8 位为 00H, 即段基址一定能被 256整除。 (2) PARA 表示本段的起始地址(段基址)的最低 4 位为 0000B,即段基址一定能被 16 整除。 (3) DWORD 表示本段的起始地址(段基址)的最低两位为 00B,即段基址一定能被 4 整除。 (4) WORD 表示本段的起始地址(段基址)的最低位为 0, 即段基址一定是偶数。 (5) BYTE 表示本段的起始地址(段基址)可从任一地址开始。,2 组合类型 组合类型用于指定段与段之间的连接关系及段的定位。 常用的组合类型有: (1) PUBLIC 在满足定位类型的前提下,本段与其它的同名段连接在一起,其连接的顺序由连接命令指定。 (2) COMMON 本段与其它同名的分段在连接时有相同的起始地址,因此会产生一个覆盖段,覆盖段的长度是参与覆盖的各个分段中长度为最长的段的段长。,(3) STACK 将所有同名段连接成一个连续段,作为堆栈段,汇编程序自动将段寄存器SS初始化为该连续段的首址, 并初始化堆栈指针SP。 (4) AT表达式 表示本段的起始地址是由表达式计算出来的16 位段基址。 (5) MEMORY 表示本段将分配在与之连接在一起的其它段的最高地址。若连接时有多个指定的MEMORY段,则把第一个遇到的段作为MEMORY段, 其它作COMMON段处理。,3 类别名 类别名由用户指定, 且必须用单引号括起来。连接时, 连接程序将类别名相同的段依次连续存放在内存中,若这些段未选择PUBLIC, COMMON组合类型, 则这些段仍然是不同的段。,5.3.3 段寻址伪指令 段寻址伪指令主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的联系。 段寻址伪指令格式为: ASSUME 段寄存器名: 段名, 段寄存器名: 段名, 其中,段寄存器名是CS、 SS、DS、ES中的一个,段名是指用SEGMEN和ENDS伪指令中定义的段名。,上述程序的代码段中,通过四条传送指令分别将数据段的段基址装入数据段寄存器DS和附加段寄存器ES中。CS和IP由汇编程序自动装入, 其中符号地址START的段基址装入CS, 符号地址START的段内偏移地址装入IP中。 由于堆栈段的定义中使用了STACK组合类型,因而汇编程序自动将堆栈段段基址装入SS中, 将堆栈长度(字节数)200装入堆栈指针SP中。 ,5.3.5 定位伪指令 汇编程序在汇编源程序时,使用汇编地址计数器记载正在汇编的数据或指令的目的代码在当前段内的偏移地址。汇编地址计数器的值可用符号表示。用户可在程序中直接使用, 表示引用当前汇编地址计数器的值。 定位伪指令用于指定汇编地址计数器的值。 定位伪指令的格式为: ORG 表达式,该伪指令执行的结果是:将表达式的值赋给汇编地址计数器,表达式中可以包括当前汇编地址计数器的值,表达式的值必须为正数。ORG伪指令可用在数据定义语句或指令语句的前面。ORG伪指令后的数据或指令代码以表达式的值作为初始的段内偏移地址。 例如:,在上例中,变量X在数据段内的偏移地址为 10H,变量Y在数据段内的偏移地址为+10。因为在X变量定义结束后汇编地址计数器的值为 12H, 所以变量Y在数据段内的偏移地址为 1CH。 而代码段中第一条MOV指令的标号START其偏移地址为 20H, 即该MOV指令从CODE段的偏移地址 20H开始存放。,5.4 指令语句,5.4.1 80286 CPU增加与增强的指令 1 新增加的第一类指令 (1) 字符串输入指令。 指令格式: INS ES: 目的地址偏移量, DX INSB ; 操作数缺省 INSW ; 操作数缺省,上述三条指令均要求从指定的端口输入一串或一个字符到指定的内存单元中。 第一条指令要求指出内存单元的地址,端口地址要预先送入DX中,该指令一旦执行,可将由DX指定的端口中输入一串字符到指定的连续内存单元中。 第二、三条指令, 操作数均为缺省,但在指令执行前, 必须将端口地址送DX,内存单元的段基址和段内偏移地址分别送入ES和DI中。第二条指令只能从端口取一个字符, 第三条指令可以从端口取二个字符。,(2) 字符串输出指令。 指令格式: OUTS DX, 段基址: 源地址偏移量 OUTSB ; 操作数缺省 OUTSW ; 操作数缺省 上述三条指令实现的功能与字符串输入指令的功能相反, 即将指定的内存单元中的字符或一个或二个输出到由DX指定的端口中。其中,第二、三条指令的操作数均为缺省。字符的内存单元地址必须由DS: SI预先指定。 第二条指令只从该地址取一个字符输出到DX指定的端口, 第三条指令是从该地址开始取两个字符输出到DX指定的端口中。,(3) 堆栈操作指令。 指令格式: PUSHA POPA 上述二条指令是 80286 新增加的堆栈操作指令。 第一条指令的功能是将所有的通用寄存器的内容压入堆栈,第二条指令的功能是将原先压入堆栈的通用寄存器内容弹出堆栈,并将它们分别送入相应的寄存器内。,(4) 内存范围检查指令。它是 80286 新增加的指令。 指令格式: BOUND REG, MEM 该指令用于检查REG指明的寄存器的值, 是否在一定的内存区间内,若在,则可以使用该寄存器,若不在,系统自动产生类型 5 的中断。 类型 5 的中断处理程序须由用户自己编写。 若该内存区间存放一个数组。 寄存器是数组的地址指针,则通过上述指令可以知道数组的地址是否越界。使用该指令前应先将MEM定义为双字,确定数组边界后,才能使用该指令,从而达到上述目的。,(5) 建立一个堆栈的指令。 它是 80286 新增加的指令。 指令格式: ENTER IMM1, IMM2 该指令中IMM1 表示要建堆栈的空间大小,为一个 16 位的常量; IMM2 表示过程嵌套的层数。该指令主要用于过程调用前先建立一个堆栈,以便过程调用,返回时存取参数和局部变量。,(6) 撤消堆栈的指令。它是 80286 新增加的指令,它的作用与ENTER相反。 指令格式: LEAVE 该指令无操作数, 它用于撤消由ENTER指令建立的堆栈, 并退出。,(7) 带符号整数乘法指令。 它是 80286 功能增强的指令。 指令格式: IMUL REG, IMM IMUL REG, OPRD, IMM 上述二条指令中, REG可以是通用寄存器, IMM表示立即数, 数的范围-32 768+32 767 之间,OPRD是第二操作数, 该数可以是寄存器或存储器中的内容。 乘积的结果均在REG中且积为16位的有符号数,超过部分自动丢弃。例如: IMUL DX, 5IMUL AX, BX, 3 IMUL CX, DATY, 8,(8) 移位指令。 它是 80286 功能增强的指令, 80286 对 8088/8086 所有移位指令的移位次数的写法进行改进,允许将移位次数(131)直接书写。避免当移位次数大于1时, 必须使用CL寄存器表示的限制。例如: SHL DX, 5RCR SI, 6,2 新增加的第二类指令 这类指令只能在 80286 保护方式下使用,仅用在操作系统及其它控制软件中,主要用于多任务、多用户的程序设计, 对一般的程序设计使用不多, 这里仅作简单介绍。 这类指令主要用来将 80286、80386 或 80486 内部寄存器的值存入内存, 或将数值存入内部寄存器。这些指令分别是: LAR REG, OPRD 装入访问权限 LSL REG, OPRD装入段界限,上述两条指令中的OPRD, 可以是寄存器或内存单元。 LGDT MEM装入全局描述符表 SGDT MEM存储全局描述符表 LIDT MEM装入中断描述符表 SIDT MEM存储中断描述符表 LLDT OPRD装入局部描述符表 SLDT OPRD存储局部描述符表 LTR OPRD装入任务寄存器 STR OPRD存储任务寄存器 LMSM OPRD装入机器标志字 SMSM OPRD存储机器标志字 ARPL OPRD, REG调整已请求特权级别 CLTS清除任务切换标志 VERR OPRD对存储器或寄存器读校验 VERW OPRD对存储器或寄存器写校验,5.4.2 80386 CPU增加与增强的指令,1 80386 新增加的指令 (1) 测试与位操作指令。 这类指令可用于对指定的位进行测试或既测试又进行位操作(取反, 置 0, 置 1)。 这类指令有BT指令, 其指令格式为: BT REG, REGBT REG, IMMBT MEM, REGBT MEM, IMM BT指令的功能是:按源操作数指出的测试位测试目的操作数中的相应位,并将该位的值复制到进位标志位中。,BTC指令,其指令操作数的格式同BT指令。该指令的功能是:按源操作数指出的测试位测试目的操作数中的相位数, 将该位的值复制到进位标志位中,然后再将目的操作数的相应位取反。 BTR指令,其指令操作数的格式亦与BT指令相同。 该指令的功能是:按源操作数指出的测试位测试目的操作数的相应位, 将该位的值复制到进位标志位中, 然后再将目的操作数的相应位置 0。 BTS指令, 其指令操作数的格式亦与BT指令相同。 该指令的功能是:按源操作数指出的测试位测试目的操作数的相应位,将该位的值复制到进位标志位中,然后再将目的操作数的相应位置 1。,(2) 位扫描指令。 这类指令用于检查寄存器或内存单元中所存数中为 1 的位, 并将 1 的位号送入目的寄存器。 该类指令有BSF指令, 其格式为: BSF REG, REGBSF REG, MEM BSF指令的功能是: 从源操作数的最低位开始一直检查到最高位,将其中的第一个或最后一个 1 的位号送入目的寄存器。 BSR指令,其指令操作数的格式同BSF指令,BSR指令的功能亦与BSF指令相同,只不过检查源操作数时,是从最高位开始一直检查到最低位。 ,(3) 数的传送与扩展指令。 这类指令既可完成数的传送又能进行数的扩展功能。 此类指令有两种, 第一种是MOVSX指令, 其指令格式为: MOVSX REG, REGMOVSX REG, MEM MOVSX指令将寄存器或存储器中的符号数传送到目的寄存器中,并将符号扩展到目的操作数的其余位。例如: MOVSX AX, BL将BL中的符号数传送到AL寄存器中,并将符号位都扩展到AH寄存器中。,第二种是MOVZX指令, 其指令格式为: MOVZX REG, REGMOVZX REG, MEM MOVZX指令将寄存器或存储器中的无符号数传送到目的寄存器中, 并将 0 扩展到目的操作数的其余位。 例如: MOVZX AX, BL 将BL中的无符号数传送到AL寄存器, 并将 0 扩展到AH寄存器中。,(4) 双精度移位指令。 这类指令可将寄存器中的数按指定的位数左移或右移到另一个寄存器或内存单元中。 此类指令有两种。 第一种是SHRD指令, 其指令格式为: SHRD REG, REG, IMM SHRD MEM, REG, IMM SHRD REG, REG, CL SHRD MEM, REG, CL,上述指令都有三个操作数,第一个操作数(最左边的)可以是 16 位或 32 位的数,它要接收第二个操作数右移过来的位, 第二操作数是要想右移的数, 必须预先放入寄存器中,第三操作数指出要右移的位数。 例如:SHRD AX, BX, 4 指令完成将BX, AX数均右移 4 位,并将BX中右移出来的 4 位二进制数移入到AX的高 4 位中。 第二种双精度移位指令是SHLD指令,其操作数的格式同SHRD指令, 与SHRD指令不同的是左移指定的位数。,(5) 条件置位指令。 这类指令用于测试由指令指定的标志位状态,并根据测试结果, 将指定的寄存器或内存单元(均为 8 位的)置 1 或置 0。 测试结果为真, 置 1; 测试结果为假, 置 0。 指令格式为: SET条件 REG8 SET条件 MEM8其中,条件类似于条件转移指令, REG8 和MEM8 表示 8 位的寄存器和 8 位的内存单元。 例如: SETZ AL指令 表示测试标志位Z。若Z位为 1,则使AL寄存器为 1;若Z位为 0, 则使AL寄存器为 0。 ,2 80386 功能增强的指令 从 80386 指令的总体而言,与同类的 80286 指令相比, 其功能都得到了提升, 即可用 80386 的指令进行 32 位的操作, 如整数乘、转换(扩展)字符串操作、 堆栈操作和中断返回操作等,下面分别介绍。(1) 整数乘指令。 80386 增加了一种形式, 它是: IMUL REG, REG IMUL REG, MEM 该指令的目的操作数和源操作数的位数必须相同, 可以是 16 位或 32 位。,(2) 转换指令。 80386 转换指令除了能使用 8088/8086 和 80286 的CBW, CWD指令外,还将转换的功能进行了扩展。能进行转换功能扩展的指令分别是CWDE和CDQ。 CWDE指令能将AX中的 16 位带符号数转换成EAX中的 32 位带符号数。CDQ指令能将EAX中的 32 位带符号数转换成由EDX: EAX寄存器对组成的 64 位带符号数。 需要注意的是:上述两条指令无操作数,它们隐含使用AX, EAX, EDX和EAX。 所以使用这两条指令前,要将转换的先放入AX或EAX中。,(3) 字符串操作指令。 80386 对下列的字符串操作指令均增强了功能(即都可以变成双字的操作), 方法是在这些指令操作符后边加D。 这些指令分别是: MOVSD, CMPSD, LODSD, SCASD, STOSD, INSD和OUTSD指令。,(4) 32 位的堆栈操作指令。 当使用 32 位代码段时,只能使用PUSHFD和POPFD指令, 它们分别实现将双字标志寄存器的内容压入堆栈,或从堆栈中弹出双字到双字标志寄存器中。 除了PUSHFD和POPFD指令外,还有两条堆栈操作指令可用于所有的 32 位通用寄存器的堆栈操作。其中: PUSHAD指令是将 8 个 32 位的通用寄存器内容压入堆栈。 POPAD指令是按相反的顺序从堆栈依次弹出各 32 位寄存器的值至相应的寄存器中。这些寄存器的名称分别是:EAX, EBX, ECX, EDX, ESP, EBP, ESI和EDI。,(5) 中断返回指令。 当使用 32 位代码段时, INT指令自动将 32 位的指令指针压入堆栈,当中断返回前必须使用IRETD指令才能从堆栈中弹出一个双字的指令指针值给EIP寄存器。,5.4.3 80486 CPU增加的指令,(1) 字节交换指令。 该指令是一个单操作数指令,能使指定的 32 位寄存器中的操作数按字节首尾交换。 其指令格式为: BSWAP EREG 例如: BSWAP EAX指令执行后能完成 b31b24 与 b7b0 交换,b23b16 与 b15b8 交换。,(2) 交换并相加指令。 该指令是两操作数指令。其中,源操作数必须为寄存器, 目的操作数可以是寄存器,也可以是内存单元。 该指令先执行源操作数和目的操作数的交换, 然后作相加运算,运算结果存在源寄存器中。 其指令格式为: XADD REG, REG XADD MEM, REG,(3) 比较与交换指令。 该指令为 3 操作数指令。其中,源操作数必须是寄存器, 目的操作数可以是寄存器,也可以是内存单元,

    注意事项

    本文(PC汇编语言程序设计ppt课件 第5章 基本汇编语言.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开