




已阅读5页,还剩109页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 本章主要教学内容指令格式及寻址的有关概念8086CPU指令系统的寻址方式及其应用8086CPU各类指令的表示 功能 特点及其应用Pentium微处理器新增指令和寻址方式介绍汇编语言的基本表达方式和内容汇编语言程序设计的基本步骤和基本方法顺序 分支 循环 子程序基本结构和设计方法常用的DOS和BIOS中断调用简介 第3章 指令系统与汇编语言程序设计 2 本章教学目的及要求通过学习 使学生掌握指令的寻址方式 指令系统及其应用 学会程序设计的基本方法 掌握程序设计的技巧 保证程序设计的质量 第3章 指令系统与汇编语言程序设计 3 第3章 3 1指令格式及寻址1 指令系统与指令格式在计算机中要执行的各种操作命令称为指令 计算机所能执行的全部命令的集合即为该计算机的指令系统 计算机指令以二进制编码的形式存放在存储器中 用二进制编码形式表示的指令称为机器指令 CPU可以直接识别机器指令 人们采用一些助记符 通常是指令功能的英文单词的缩写 如数据传送指令用助记符MOV MOVE的缩写 这样表示的指令称为符号指令 也称为汇编指令 汇编指令具有直观 易理解 好记忆的特点 指令系统与汇编语言程序设计 4 第3章 指令系统与汇编语言程序设计 计算机中的汇编指令由操作码字段和操作数字段两部分组成 1 操作码字段 操作码表示计算机要执行的某种指令功能 由它来规定指令的操作类型 说明计算机要执行的具体操作 例如传送 运算 移位 跳转等操作 同时还指出操作数的类型 操作数的传送方向 寄存器编码或符号扩展等 是指令中必不可少的组成部分 2 操作数字段 操作数表示计算机在操作中所需要的数据 或者所需数据的存放位置 也称为地址码 还可以是指向操作数的地址指针或其它有关操作数据的信息 5 8086的指令格式如图3 1所示 指令的长度范围是1 6个字节 其中 操作码字段为1 2个字节 B1 B2 操作数字段为0 4个字节 B3 B6 每条具体指令的长度将根据指令的操作功能和操作数的形式而定 图3 18086的指令格式 第3章 指令系统与汇编语言程序设计 6 第3章 指令系统与汇编语言程序设计 2 寻址及寻址方式的概念计算机的指令中通常要指定操作数的位置 即给出操作数的地址信息 在执行时需要根据这个地址信息找到需要的操作数 这种寻找操作数的过程称为寻址 寻址方式就是寻找操作数或操作数地址的方式 不同机器的指令系统都规定了一些寻址方式以供编程时选择使用 根据给定的寻址方式 就可以方便地访问各类操作数 7 第3章 指令系统与汇编语言程序设计 8086指令中的操作数有三种可能的存放位置 1 操作数直接在指令中 即跟随在指令操作码之后 指令的操作数部分就是操作数本身 这种操作数叫立即操作数 2 操作数存放在CPU的某个内部寄存器中 这时指令的操作数部分是CPU内部寄存器的一个编码 称为寄存器操作数 3 操作数存放在内存储器的数据区中 这时指令的操作数部分包含此操作数所在的内存地址 称为存储器操作数 8 第3章 指令系统与汇编语言程序设计 3 28086CPU的寻址方式3 2 1立即数寻址立即数寻址方式是指操作数直接存放在给定的指令中 紧跟在操作码之后 立即数可以是8位或16位二进制数 例如 给定如下指令 采用立即数寻址 MOVAL 10 十进制数 MOVAL 00100101B 二进制数 MOVAX 263AH 十六进制数 9 第3章 指令系统与汇编语言程序设计 3 2 2寄存器寻址寄存器寻址方式是在指令中直接给出寄存器名 寄存器中的内容即为所需操作数 在寄存器寻址方式下 操作数存在于指令规定的8位 16位寄存器中 寄存器可用来存放源操作数 也可用来存放目的操作数 寄存器寻址方式是CPU内部的操作 不需要访问总线周期 因此指令的执行速度比较快 对于16位操作数 寄存器可以是AX BX CX DX SI DI SP BP等 对于8位操作数 寄存器可以是AH AL BH BL CH CL DH DL等 10 第3章 指令系统与汇编语言程序设计 3 2 3存储器寻址计算机中访问内存的寻址方式有多种 不管哪一种寻址方式 最终都将得到存放操作数的物理地址 采用存储器寻址时 指令中需要给出操作数的地址信息 存储器操作数的有效地址EA的计算方法和寻址方式有着密切地联系 而操作数物理地址PA的计算则和操作数的具体存放位置有关 11 第3章 指令系统与汇编语言程序设计 1 直接寻址方式 直接寻址方式是一种针对内存的寻址方式 在这种寻址方式下 指令中给出的地址码即为操作数的有效地址EA 它是一个8位或16位的位移量 在默认方式下 操作数存放在数据段DS中 如果要对除DS段之外的其他段如CS ES SS中的数据寻址 应在指令中增加前缀 指出段寄存器名 这称为段跨越 在直接寻址方式的指令中 操作数的有效地址EA已经给出 那么操作数的物理地址为 PA DS 10H EA 12 第3章 指令系统与汇编语言程序设计 2 寄存器间接寻址方式寄存器间接寻址方式是指操作数的有效地址EA在指定的寄存器中 这种寻址方式是在指令中给出寄存器 寄存器中的内容为操作数的有效地址 16位操作数寻址时 EA放在基址寄存器BX BP或变址寄存器SI DI中 所以该方式下操作数的物理地址计算公式有以下几个 物理地址PA DS 10H BX 物理地址PA DS 10H DI 物理地址PA DS 10H SI 物理地址PA SS 10H BP 13 第3章 指令系统与汇编语言程序设计 3 寄存器相对寻址方式这种寻址方式是在指令中给定一个基址寄存器或变址寄存器和一个8位或16位的相对偏移量 两者之和作为操作数的有效地址 当选择间址寄存器BX SI DI时 指示的是数据段中的数据 选择BP作间址寄存器时 指示的是堆栈段中的数据 有效地址计算为 EA reg 8位或16位偏移量 其中reg为给定寄存器 物理地址计算为 PA DS 10H EA 使用BX SI DI间址寄存器 PA SS 10H EA 使用BP作为间址寄存器 14 第3章 指令系统与汇编语言程序设计 4 基址变址寻址方式在基址变址寻址方式中 有效地址EA是基址寄存器加变址寄存器 即两个寄存器的内容之和为操作数的有效地址 在该寻址方式中 当基址寄存器和变址寄存器的默认段寄存器不同时 一般由基址寄存器来决定默认用哪一个段寄存器作为段基址指针 若在指令中规定了段跨越 则可以用其他寄存器作为段基地址 基址变址寻址方式的物理地址计算公式为 物理地址PA DS 10H BX SI 物理地址PA SS 10H BP DI 15 第3章 指令系统与汇编语言程序设计 5 相对基址变址寻址方式这种寻址方式是在指令中给出一个基址寄存器 一个变址寄存器和8位或16位的偏移量 三者之和作为操作数的有效地址 基址寄存器可取BX或BP 变址寄存器可取SI或DI 如果基址寄存器采用BX 则段寄存器使用DS 如果基址寄存器采用BP 则段寄存器使用SS 其物理地址计算为 PA DS 10H BX SI 或 DI 偏移量PA SS 10H BP SI 或 DI 偏移量 16 第3章 指令系统与汇编语言程序设计 3 2 4I O端口寻址由于8086CPU的I O端口采用独立编址方式 可有64K个字节端口或32K个字端口 指令系统中设有专门的输入指令IN和输出指令OUT来进行访问 I O端口的寻址方式有直接端口寻址和寄存器间接端口寻址两种 17 第3章 指令系统与汇编语言程序设计 1 直接端口寻址直接端口寻址是在指令中直接给出要访问的端口地址 一般采用2位十六进制数表示 可访问的端口数为0 255个 例如 IN例如 INAL 30H 表示从I O端口地址为30H的端口中取出字节数据送到8位寄存器AL中 INAX 50H 表示从I O端口地址为50H和51H的两个相邻端口中取出字数据送到16位寄存器AX中 18 第3章 指令系统与汇编语言程序设计 2 寄存器间接端口寻址当访问的端口地址数 256时 直接端口寻址不能满足要求 要采用I O端口的间接寻址方式 它是把I O端口的地址先送到寄存器DX中 用16位的DX作为间接寻址寄存器 此种方式可访问的端口数为0 65535个 例如 MOVDX 283H 将端口地址283H送到DX寄存器 OUTDX AL 将AL中的内容输出到DX所指定的端口中 19 第3章 指令系统与汇编语言程序设计 3 38086CPU的指令系统8086指令系统是80X86 Pentium微处理器的基本指令集 指令的操作数可以是8位或16位 偏移地址是16位 按功能可将指令分成六大类 即 数据传送类指令 算术运算类指令 逻辑运算与移位类指令 串操作类指令 控制转移类指令和处理器控制类指令 20 第3章 指令系统与汇编语言程序设计 3 3 1数据传送类指令数据传送类指令的基本功能是把操作数或操作数的地址传送到指定的寄存器或存储单元中 数据传送类指令共有14条 根据传送的内容可分成以下4组 1 通用数据传送指令 2 累加器专用传送指令 3 地址传送指令 4 标志寄存器传送指令 21 第3章 指令系统与汇编语言程序设计 1 通用数据传送指令 1 传送指令MOV格式 MOVdst srcMOV指令的功能是把源操作数src传送至目的操作数dst 执行后源操作数内容不变 目的操作数内容与源操作数内容相同 源操作数可以是通用寄存器 段寄存器 存储器以及立即数 目标操作数可以是通用寄存器 段寄存器 CS除外 或存储器 22 数据之间的传送关系如图3 5所示 图3 5数据之间的传送关系 23 第3章 指令系统与汇编语言程序设计 使用MOV指令进行数据传送时要注意以下几点 1 段寄存器CS及立即数不能作为目标操作数 2 两个存储单元之间不允许直接传送数据 3 立即数不能直接传送到段寄存器 4 两个段寄存器之间不能直接传送数据 5 传送数据的类型必须匹配 6 MOV指令不影响标志位 24 第3章 指令系统与汇编语言程序设计 2 堆栈操作指令PUSH POP进栈指令 PUSHopr SP SP 2 将源操作数opr压入堆栈出栈指令 POPopr 栈顶弹出字数据到目标操作数opr SP SP 2堆栈是存储器中的一个特殊区域 主要用于存入和取出数据 堆栈是以 先进后出 的方式进行数据操作的 在8086的堆栈组织中 堆栈从高地址向低地址方向生长 它只有一个出入口 堆栈指针寄存器SP始终指向堆栈的栈顶单元 25 第3章 指令系统与汇编语言程序设计 3 XCHG交换指令XCHG指令用来将源操作数和目的操作数的内容进行交换 它可以实现字节数据交换 也可以实现字数据交换 该指令的操作数必须有一个是在寄存器中 即可以在两个通用寄存器之间或寄存器与存储器之间交换数据 但不能在两个存储器之间交换数据 指令执行结果不影响标志位 26 第3章 指令系统与汇编语言程序设计 2 累加器专用传送指令8086指令系统中将累加器AX作为数据传输的核心 系统的输入 输出指令IN OUT和换码指令XLAT就是专门通过累加器来执行的 称之为累加器专用传送指令 27 第3章 指令系统与汇编语言程序设计 3 地址传送指令8086的地址传送指令用于控制寻址机构 它可将存储器操作数的地址传送到16位目标寄存器中 这类指令有以下3种形式 1 有效地址送寄存器指令 LEAreg srcLEA指令功能是将存储器操作数src的有效地址传送到16位的通用寄存器reg 2 地址指针送寄存器和DS指令 LDSreg src该指令完成一个32位的地址指针传送 地址指针包括段地址和偏移地址两部分 3 地址指针送寄存器和ES指令 LESreg srcLES指令执行的操作与LDS指令相似 不同之处是以ES代替DS 28 第3章 指令系统与汇编语言程序设计 4 标志寄存器传送指令8086可通过这类指令读出当前标志寄存器中各标志位的内容 也可以重新设置各标志位的值 标志寄存器的传送指令共有4条 均位单字节指令 指令的操作数以隐含形式出现 隐含为AH寄存器 1 取标志指令LAHF 2 置标志位指令SAHF 3 标志寄存器入栈指令PUSHF 4 标志寄存器出栈指令POPF 29 第3章 指令系统与汇编语言程序设计 3 3 2算术运算类指令8086的算术运算类指令包括加 减 乘 除4种基本运算指令 以及为进行BCD码十进制数运算而设置的各种较正指令 8086的基本算术运算指令中 除加1和减1指令外 其余均为双操作数指令 两个操作数中除了源操作数可为立即数外 必须有一个操作数在寄存器中 而单操作数指令则不允许采用立即数方式 30 第3章 指令系统与汇编语言程序设计 加减法运算在执行过程中会产生溢出 无符号数运算时 如果加法运算最高位向前产生进位或减法运算最高位向前有借位 则表示出现溢出 采用标志位CF 1来表示 带符号数采用补码运算时 符号位也参与运算 出现溢出则表示运算结果发生了错误 采用标志位OF 1来表示 31 第3章 指令系统与汇编语言程序设计 算术运算指令除加1指令INC不影响CF标志外 其余指令对CF OF ZF SF PF AF等6个标志位均可产生影响 其规则如下 无符号数运算产生溢出时 CF 1 带符号数运算产生溢出时 OF 1 当运算结果为0时 ZF 1 当运算结果为负数时 SF 1 当运算结果中有偶数个1时 PF 1 当操作数为BCD码 低4位出现进位1时 AF 1 32 第3章 指令系统与汇编语言程序设计 1 加法指令 1 不带进位加法指令 ADDdst src指令功能为 dst dst src 2 带进位的加法指令 ADCdst src指令功能为 dst dst src CF 3 加1指令 INCopr指令功能为 opr opr 1 33 第3章 指令系统与汇编语言程序设计 2 减法指令 1 不带借位减法指令 SUBdst src指令功能为 dst dst src 2 带借位的减法指令 SBBdst src指令功能为 dst dst src CF 3 减1指令 DECopr指令功能为 opr opr 1 4 求补指令 NEGopr该指令将opr中的内容取2的补码 相当于将opr中的内容按位取反后末位加1 5 比较指令 CMPopr1 opr2指令功能为 opr1 opr2 34 第3章 指令系统与汇编语言程序设计 3 乘法运算指令乘法指令包括无符号数和带符号数相乘的指令 指令中只给出乘数 被乘数隐含给出 两个8位数相乘时被乘数放入AL中 16位数的乘积存放到AX中 两个16位数相乘时被乘数先放入AX寄存器中 32位数的乘积放到DX和AX两个寄存器中 规定DX中存放高16位 AX中存放低16位 35 第3章 指令系统与汇编语言程序设计 1 无符号数乘法指令 MULsrc若src为字节数据 执行AX AL src 若src为字数据 执行DX AX AX src 2 带符号数乘法指令 IMULsrc该指令的执行功能与MUL相同 36 第3章 指令系统与汇编语言程序设计 4 除法运算指令除法指令可用来实现两个无符号数或带符号数的除法运算 包括字和字节两种操作 该指令隐含使用AX和DX作为一个操作数 指令中给出的源操作数为除数 1 无符号数除法指令 DIVsrcDIV指令的被除数 除数 商和余数全部为无符号数 2 带符号数除法指令 IDIVsrcIDIV指令的被除数 除数 商和余数均为带符号数 且余数的符号位同被除数 两条指令执行的操作功能如下 当除数src为字节数据时 用AX除以src 得到的8位商保存在AL中 8位余数保存在AH中 当除数src为字数据时 用DX AX除以src 得到的16位商保存在AX中 16位余数保存在DX中 37 第3章 指令系统与汇编语言程序设计 5 符号扩展指令符号扩展指令是指用一个操作数的符号位形成另一个操作数 后一个操作数的各位是全0 正数 或全1 负数 符号扩展指令虽然使数据位数加长 但数据的大小并没有改变 该指令的执行不影响标志位 1 字节转换为字指令CBW该指令的功能是将AL中的符号位D7扩展到AH中 2 字转换为双字指令CWD该指令的功能是将AX中的符号位扩展到DX中 38 第3章 指令系统与汇编语言程序设计 6 十进制调整指令十进制数在计算机中是采用二进制数来表示的 这就是BCD码 要对十进制的BCD码进行算术运算 必须对得到的结果进行调整 否则结果无意义 8086指令系统提供了以下两类十进制调整指令 1 组合BCD码加法 减法调整指令DAA 组合BCD码加法调整指令 将AL中的和调整为组合BCD码DAS 组合BCD码减法调整指令 将AL中的差调整为组合BCD码 39 第3章 指令系统与汇编语言程序设计 2 非组合BCD加法 减法调整指令AAA 非组合BCD加法调整指令 将AL中的和调整为非组合BCD码AAS 非组合BCD减法调整指令 将AL中的差调整为非组合BCD码AAA和AAS分别用于加法指令 ADD ADC 或减法指令 SUB SBB 之后 执行时对AL进行测试 若AL中的低四位 09H 或AF 1 则进行AL AL 06H修正 AL的高4位为0 同时AH AH 1 CF AF 1 调整后的结果放在AX中 40 第3章 指令系统与汇编语言程序设计 3 3 3逻辑运算与移位类指令1 逻辑运算指令有以下5条逻辑运算指令 它们可对8位或16位操作数按位进行逻辑运算 1 逻辑与指令 ANDdst src 2 逻辑或指令 ORdst src 3 逻辑异或指令 XORdst src 4 逻辑非指令 NOTdst 5 测试指令 TESTdst src 41 第3章 指令系统与汇编语言程序设计 2 移位指令移位操作类指令可以对字节或字数据中的各位进行算术移位 逻辑移位或循环移位 移位指令的格式为 SHL SAL SHR SARdst 1 CL循环移位指令的格式为 ROL ROR RCL RCRdst 1 CL上述指令分别对操作数进行逻辑左移SHL 算术左移SAL 逻辑右移SHR 算术右移SAR 循环左移ROL 循环右移ROR 带进位的循环左移RCL 带进位的循环右移RCR等操作 操作数可以是字节或字操作 图3 7为各种移位操作的功能示意 42 图3 7移位指令的操作功能示意 43 第3章 指令系统与汇编语言程序设计 3 3 4串操作类指令数据串是存储器中的一串字节或字的数据序列 8086指令系统中设置了串操作指令 其操作对象是内存中地址连续的字节串或字串 在每次操作后能够自动修改地址指针 为下一次操作作准备 基本串操作指令有串传送 MOVS 串比较 CMPS 串扫描 SCAS 串存取 LODS STOS 等 任何一个基本串操作指令的前面都可以加一个重复操作前缀 使指令操作重复 这样在处理长数据串时要比用循环程序速度快得多 44 第3章 指令系统与汇编语言程序设计 3 3 5控制转移类指令程序的执行一般是按指令顺序逐条执行的 但有时需要改变程序的执行流程 控制转移类指令就是用来改变程序执行的方向 也就是修改IP和CS的值 通过控制转移指令可实现各种结构化程序设计 如分支结构程序 循环结构程序等 1 如果指令给出改变IP中内容的信息 转移的目标位置和转移指令在同一个代码段 则称为段内转移 2 如果指令给出改变IP中内容的信息 又给出改变CS中内容的信息 转移的目标位置和转移指令不在同一个代码段 则称为段间转移 根据转移指令的功能 可分为无条件转移指令 条件转移指令 循环控制指令 子程序调用和返回指令4类 45 第3章 指令系统与汇编语言程序设计 1 无条件转移指令无条件转移指令JMP用来控制程序转移到指定的位置去执行 指令中要给出转移位置的目标地址 通常有以下5种形式 JMPSHORTopr 段内直接短转移JMPNEARPTRopr 段内直接近转移JMPWORDPTRopr 段内间接转移JMPFARPTRopr 段间直接转移JMPDWORDPTRopr 段间间接转移 46 第3章 指令系统与汇编语言程序设计 2 条件转移指令条件转移指令是根据上一条指令所设置的条件码来测试 被测试的内容为状态标志位 满足测试条件则转移到指令中指定的位置去执行 如果不满足条件则顺序执行下一条指令 条件转移指令根据判断的标志位不同 通常可以归纳为3类 即判断单个标志位状态 比较无符号数高低和比较带符号数大小 这3类指令在使用之前 应该有比较CMP 测试TEST 加减或逻辑运算等指令 47 第3章 指令系统与汇编语言程序设计 3 循环控制指令将一段代码程序执行多次操作即为循环 采用循环控制指令实现 循环控制转向的目的地址是在以当前IP内容为中心的 128 127的范围内 指令采用CX作为计数器 每执行一次循环 CX内容减1 直到为零后循环结束 1 循环控制指令LOOP 2 为零或相等时循环控制指令LOOPZ LOOPE 3 不为零或不相等时循环控制指令LOOPNZ LOOPNE 48 第3章 指令系统与汇编语言程序设计 4 子程序调用和返回指令 1 子程序调用指令指令格式为 CALLNEARPTRopr 段内调用CALLFARPTRopr 段间调用 2 子程序返回指令RET指令格式 RET或RET表达式 49 第3章 指令系统与汇编语言程序设计 3 3 6处理器控制类指令这类指令主要用于修改状态标志位 控制CPU的功能如使CPU暂停 等待 空操作等 50 第3章 指令系统与汇编语言程序设计 3 4Pentium微处理器新增指令和寻址方式3 4 1Pentium微处理器寻址方式1 Pentium微处理器的内部寄存器和指令格式由于Pentium微处理器采用32位指令 它的内部寄存器和指令格式与16位微处理器存在不同 主要有以下几方面 1 指令的操作数可以是8位 16位或32位 2 根据指令的不同操作数字段可以是0 3个 3 在部分不存放结果的单操作数指令中 可以采用立即数作为操作数 51 第3章 指令系统与汇编语言程序设计 4 部分指令对操作数的数据类型不是简单地要求一致 而是要有不同的匹配关系 5 立即数寻址方式中 操作数可以是32位的立即数 寄存器寻址方式中 操作数可以是32位通用寄存器 6 存储器操作数寻址方式中 操作数可达32位 寻址方式既可采用16位的地址寻址方式也可采用32位的扩展地址寻址方式 7 16位微处理器原有的4个通用数据寄存器扩展为32位 更名为EAX EBX ECX和EDX 8 原有的4个用于内存寻址的通用地址寄存器同样扩展为32位 更名为ESI EDI EBP ESP 52 第3章 指令系统与汇编语言程序设计 9 指令指针寄存器扩展为32位 更名为EIP 10 在原有的4个段寄存器基础上 增加了2个新的段寄存器FS和GS 11 32位微处理器增加了4个系统地址寄存器 12 标志寄存器也扩展为32位 更名为EFLAGS 除了原有的状态 控制标志外 还增加了2位 13 新增加了5个32位的控制寄存器 命名为CR0 CR4 14 新增了8个用于调试的寄存器DR0 DR7 2个用于测试的寄存器TR6 TR7 53 第3章 指令系统与汇编语言程序设计 2 Pentium微处理器的新增寻址方式如前所述 8086微处理器有固定寻址 立即数寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址和相对基址变址寻址等8种寻址方式 而Pentium微处理器有11种寻址方式 与8086相比新增加的3种寻址方式分别是比例变址寻址方式 基址加比例变址寻址方式和带位移量的比例变址寻址方式 54 第3章 指令系统与汇编语言程序设计 3 4 2Pentium系列微处理器专用指令Pentium系列处理器的指令集是向上兼容的 它保留了8086和80X86微处理器系列的所有指令 因此 所有早期的软件可直接在奔腾机上运行 Pentium处理器指令集中新增加了以下3条专用指令 1 比较和交换8字节数据指令CMPXCHG8B2 CPU标识指令CPUID3 读时间标记计数器指令RDTSC 55 第3章 指令系统与汇编语言程序设计 3 4 3Pentium系列微处理器控制指令Pentium处理器指令集中新增加了3条系统控制指令 1 读专用模式寄存器指令RDMSR2 写专用模式寄存器指令WRMSR3 恢复系统管理模式指令RSM 56 第3章 指令系统与汇编语言程序设计 3 5汇编语言简述计算机可直接识别的是机器指令 用机器指令编写的程序称为机器语言程序 由于机器指令是用二进制编码来表示的 既不直观又难以记忆 所以使得机器指令编写的程序在使用上受到了限制 为了解决机器语言使用上的不便 人们开始使用容易记忆和识别的符号指令来编写程序 汇编语言就是用与操作功能含义相应的缩写英文字符组成的符号指令作为编程用的语言 57 第3章 指令系统与汇编语言程序设计 使用汇编语言编写的程序计算机是不能够直接地识别和执行的 必须经过 翻译 将汇编语言程序 翻译 成机器语言程序 这个 翻译 是由汇编程序来完成的 汇编程序是系统预先提供的系统软件之一 它把源文件转换成二进制编码表示的目标文件 OBJ 这个过程称为汇编 在汇编过程中对源程序进行语法检查 又称扫描 得到无语法错误的结果后 还要经过连接程序 使目标程序成为计算机的可执行文件 EXE 58 汇编语言程序转换成为计算机可运行的程序的过程如图3 8所示 图3 8汇编语言程序的执行过程 59 第3章 指令系统与汇编语言程序设计 3 5 1汇编语言语句的类型和格式汇编语言源程序是由指令 伪指令及宏指令组成的 每条指令又可称为一条语句 汇编语言程序中一条完整的语句格式由以下4项内容组成 name operationoperand comment 1 名字项name 名字通常为一符号序列 表示本条语句的符号地址 名字项可用作标号和变量 作为标号表示的是符号地址 其后跟冒号 作为变量表示的是一个数据 其后不跟冒号 60 第3章 指令系统与汇编语言程序设计 标号和变量具备以下3种属性 段属性 该属性定义了标号和变量的段起始地址 其值必须在一个段寄存器中 标号的段是它所出现的对应代码段 由CS指示 变量的段通常由DS或者ES指示 偏移属性 该属性表示标号和变量相距段起始地址的字节数 该数是一个16位无符号数 类型属性 该属性对于标号而言 用于指出该标号是在本段内引用还是在其他段中引用 标号的类型有NEAR 段内引用 和FAR 段间引用 对于变量 其类型属性说明变量有几个字节长度 这一属性由定义变量的伪指令确定 61 第3章 指令系统与汇编语言程序设计 2 操作码项operation 为操作码助记符 可以是指令 伪指令及宏指令名 汇编程序可以将指令翻译成对应的机器码 伪指令是在汇编过程中完成相应的控制操作 又称为汇编控制指令 宏指令是采用有限的一组指令来定义的代号 汇编时将展开成相应的具体操作指令 3 操作数项operand 为操作码提供数据及操作信息 操作数项可以是常数 变量 表达式等数据 也可以是操作数的地址或地址表达式 当有两个或两个以上的操作数时 各操作数之间要用逗号隔开 62 第3章 指令系统与汇编语言程序设计 4 注释项comment 为语句注释 说明所在语句行的功能 以 开头 是语句的非执行部分 通常 注释用来说明一段程序或几条语句的功能 一段完整的程序注释是很重要的 它可使程序思路显得更清楚 特别是在模块化程序设计中可通过注释将各模块的功能描述出来 大大增强了程序的可读性 此外 语句格式中带方括号 的部分表示任选项 可根据需要加以选择 汇编语言要求上面的4项内容之间必须留有空格 否则会被认为是错误的命令 63 第3章 指令系统与汇编语言程序设计 汇编语言的标识符 表达式和运算符 1 标识符 如前所述 汇编语言语句格式第一个字段是它的名字项 名字可以是标号或变量 这两者又称为标识符 标号和变量可以用LABLE和EQU伪指令来定义 相同的标号或变量的定义在同一程序中只能允许出现一次 2 表达式和运算符 表达式中的运算符充当着重要的角色 8086宏汇编有算术运算符 逻辑运算符 关系运算符 分析运算符和综合运算符共5种 64 第3章 指令系统与汇编语言程序设计 算术运算符用于完成算术运算 加 减 乘 除运算都是整数运算 除法运算得到的是商的整数部分 求余运算是指两数整除后所得到的余数 逻辑运算符对操作数进行按位操作 运算后产生一个逻辑运算值 供给指令操作数使用 不影响标志位 NOT是单操作数运算符 其它3个为双操作数运算符 关系运算符的运算对象是两个性质相同的项目 其结果只能是两种情况 关系成立或不成立 当关系成立时 运算结果为1 否则为0 分析运算符用于对存储器地址进行运算 它可以将存储器地址的段 偏移量和类型属性分离出来 返回到所在的位置作操作数使用 故又称为数值返回运算符 综合运算符用来建立和临时改变变量或标号的类型以及存储器操作数的存储单元类型 也称为属性修改运算符 65 第3章 指令系统与汇编语言程序设计 3 5 2汇编语言的源程序结构一个汇编语言源程序包含了以下几个结构形式 1 汇编源程序一般应该由3个逻辑段组成 即数据段 堆栈段和代码段 数据段用来在内存中建立一个适当容量的工作区 以存放常数 变量等程序需要对其进行操作的数据 堆栈段用来在内存中建立一个适当的堆栈区 以便在中断 子程序调用时使用 代码段包括了许多以符号表示的指令 以完成程序规定的操作 2 每个逻辑段以SEGMENT语句开始 以ENDS语句结束 整个源程序以END语句结束 每个逻辑段内有若干条语句以完成某种特定操作功能 66 第3章 指令系统与汇编语言程序设计 3 汇编源程序的主模块要用ASSUME伪指令告诉汇编程序 各个段地址与段寄存器之间的对应关系 以便对源程序模块进行汇编时确定段中各项的偏移量 DOS的装入程序在执行时 将把CS初始化为正确的代码段地址 把SS初始化为正确的堆栈段地址 在源程序中不需要再对它们进行初始化 由于装入程序已经将DS寄存器留作它用 所以在源程序中要对DS进行初始化 4 汇编语言源程序存放在存储器中 无论是取指令还是存取操作数 都要访问内存 所以 程序的编写必须分段进行 以满足存储器分段管理的要求 67 第3章 指令系统与汇编语言程序设计 3 5 3伪指令我们前面所分析的大都是机器指令 这是CPU指令系统中提供的命令 在运行时由CPU执行 每条指令对应CPU的一种特定的操作 例如传送 加 减法等 经汇编以后 每条CPU指令产生一一对应的目标代码 而伪指令是用来对相关语句进行定义和说明的 它不产生目标代码 所以又称伪操作 宏汇编程序MASM提供了约几十种伪指令 主要有数据定义 符号定义 段定义 过程定义 模块定义 结构等 68 第3章 指令系统与汇编语言程序设计 1 数据定义伪指令数据定义伪指令用来定义变量的类型 给变量分配存储单元 数据定义伪指令的一般格式为 变量名 伪指令数据项 注释 数据定义伪指令有以下5种形式 1 DB DefineByte 定义字节变量 每个数据占1个字节 2 DW DefineWord 定义字变量 每个数据占1个字 即2个字节 3 DD DefineDoubleword 定义双字变量 每个数据占2个字 即4个字节 4 DQ DefineQuadrupleword 定义4字变量 每个数据占4个字 即8个字节 5 DT DefineTenbyte 定义10字节变量 每个数据占10个字节 69 第3章 指令系统与汇编语言程序设计 2 符号定义伪指令符号定义伪指令主要是为程序中的表达式赋予一个符号名 或定义新的类型属性等 它为程序的编写和使用带来了许多方便 1 EQU 等值 伪指令 将表达式的值或符号赋予EQU前面的一个名字 可以用这个名字来代替给定的表达式 需要注意的是 一个符号一经EQU伪指令赋值后 在整个程序中不允许再对同一符号重新赋值 2 等号 伪指令 其功能与EQU伪指令基本相同 主要区别在于它可以对同一个名字重复定义 3 LABLE 标号 伪指令 其用途是在原来标号或变量的基础上定义一个类型不同的新的标号或变量 4 PTR 属性修改 伪指令 用于临时指定或修改操作数的类型属性 70 第3章 指令系统与汇编语言程序设计 3 段定义伪指令段定义伪指令可对代码段 数据段 堆栈段及附加段进行定义和赋名 并指明段的定位类型 组合类型及类别 代码段的内容主要是指令及伪指令 数据段 堆栈段及附加段主要是定义数据 分配存储单元等 有以下两种段定义伪指令 1 SEGMENT ENDS伪指令格式 段名 定位类型 组合类型 类别 段内语句系列 段名ENDS 71 第3章 指令系统与汇编语言程序设计 2 ASSUME伪指令格式 ASSUME段寄存器名 段名 段寄存器名 段名 ASSUME段寻址伪指令放置在代码段的开始处 可以设定多个段与段寄存器之间的对应关系 中间用逗号分开 当汇编程序汇编一个逻辑段时 可利用相应的段寄存器寻址该逻辑段中的指令或数据 72 第3章 指令系统与汇编语言程序设计 4 过程定义伪指令汇编语言中的子程序是以过程的形式出现的 过程的调用和返回采用CALL和RET指令来完成 过程定义伪指令的格式如下 格式 过程名PROC NEAR FAR 过程中的语句系列 RET 过程中的语句系列 过程名ENDP 73 第3章 指令系统与汇编语言程序设计 5 结构定义伪指令结构是将逻辑上相互关联的一组数据以某种形式组合在一起 形成一个整体以便进行数据处理 结构的使用需要经过结构定义 结构预置和结构引用等过程 结构采用伪指令STRUC和ENDS进行定义 把相关数据定义语句组合起来 便构成一个完整的结构 其格式如下 结构名STRUC 数据定义语句序列 结构名ENDS 74 第3章 指令系统与汇编语言程序设计 6 模块定义伪指令一个较大的汇编语言源程序 按任务分配可以由多个模块组成 每个模块都是具有独立功能的逻辑单位 为了实现模块之间的连接 调用 相互访问 变量传送等功能 通常使用以下几个伪指令 1 NAME伪指令 用于给源程序汇编以后得到的目标程序指定模块名 在汇编连接时使用 2 END伪指令 表示源程序结束 指示汇编程序停止汇编 END后面的语句可以不予理会 3 PUBLIC伪指令 用于定义本模块中的某些符号是全局符号名 允许程序中的其它模块直接引用 4 EXTRN伪指令 指明本模块中所用的某些符号在程序的其它模块中已经定义 且出现在其它模块的PUBLIC伪指令中 75 第3章 指令系统与汇编语言程序设计 7 定位伪指令ORG和程序计数器 1 ORG伪指令 ORG是起始位置设定伪指令 用来指定某条语句或某个变量的偏移地址 在程序设计中 如果需要将存储单元分配在指定位置 可以使用ORG伪指令来改变位置计数器的值 2 程序计数器 字符 出现在在程序中的表达式里 它的值为程序下一个所能分配的存储单元的偏移地址 称为程序计数器 用来表示位置计数器的当前值 76 第3章 指令系统与汇编语言程序设计 3 5 4宏指令与高级汇编技术在汇编语言中 有的程序段需要多次重复使用 为了减少编程的工作量 可将它们定义为一条宏指令 需要时 直接在程序中将宏指令当作一条指令一样来引用 汇编程序在源程序的汇编过程中 将宏指令对应的程序段目标代码嵌入到该宏指令处 宏指令实际上也是一种伪指令 比起前面介绍的伪指令功能更强 使用更灵活 在源程序中采用宏指令可简化程序 77 第3章 指令系统与汇编语言程序设计 1 宏汇编所谓 宏 是指源程序中一段具有独立功能的代码 宏指令代表一段源程序 当宏汇编时 宏指令就被自动地展开成为相应的机器码而插入源程序中的宏调用处 宏调用指令在汇编过程中对宏定义体作宏展开操作 宏展开就是用宏定义体取代源程序中的宏指令名 并用实参取代宏定义中的形参 而且要求实参要与形参一一对应 宏定义语句格式是 宏指令名MACRO 形参1 形参2 形参n 宏体ENDM 78 第3章 指令系统与汇编语言程序设计 2 宏调用 经定义的宏指令 可以在源程序中调用 称为宏调用 宏调用的格式为 宏指令名 实参1 实参2 实参n 3 宏展开 宏展开就是将宏指令语句用宏定义中宏体的程序段目标代码替换 在汇编源程序时 宏汇编程序将对每条宏指令语句进行宏展开 取调用提供的实参替代相应的形参 对原有宏体目标代码作相应改变 79 第3章 指令系统与汇编语言程序设计 2 重复汇编在编写汇编程序的过程中 有时需要重复编写相同或几乎完全相同的一组代码 为避免重复编写的麻烦 可以使用重复汇编 重复汇编伪指令有以下3种 1 定重复伪指令REPT ENDM REPT和ENDM必须成对出现 两者间之的重复内容是要重复汇编的部分 重复汇编次数用表达式的值来表示 2 不定重复伪指令IRP ENDM 此伪指令重复执行重复内容中所包含的语句 重复的次数由参数表中的参数个数决定 3 不定重复字符伪指令IRPC ENDM 此伪指令重复执行重复内容中的语句 重复汇编的次数等于字符串中字符的个数 80 第3章 指令系统与汇编语言程序设计 3 条件汇编 条件汇编也是汇编语言提供的一组伪操作 伪操作指令中指出汇编程序所进行测试的条件 汇编程序将根据测试的结果有选择地对源程序中的语句进行汇编处理 条件伪操作的一般格式 IF 表达式 条件程序块1 ELSE 条件程序块2 ENDIF 81 第3章 指令系统与汇编语言程序设计 3 5 5汇编语言程序上机过程1 汇编语言的工作环境帮助建立汇编语言源程序和支持汇编语言程序运行的软件主要包括以下几个方面 1 DOS操作系统 汇编语言源程序的建立和运行都是在DOS操作系统的支持下进行的 2 编辑程序 是用来输入和建立汇编语言源程序的一种通用的系统软件 源程序的修改也可在编辑状态进行 3 汇编程序 一般选用宏汇编MASM EXE 将源程序汇编成目标程序 4 连接程序 8086汇编语言使用的连接程序是LINK EXE 5 调试程序 作为一种辅助工具来帮助编程者进行程序的调试 常采用动态调试程序DEBUG COM 82 第3章 指令系统与汇编语言程序设计 2 汇编语言上机步骤通常 在计算机上运行汇编语言程序的步骤主要有以下几方面 1 用编辑程序 例如EDIT COM 建立扩展名为 ASM的汇编语言源程序文件 2 用汇编程序 例如MASM EXE 将源程序文件汇编成用机器码表示的目标程序文件 其扩展名为 OBJ 3 用连接程序 例如LINK EXE 把目标文件转化成可执行文件 其扩展名为 EXE 如果在汇编过程中出现语法错误 根据错误的信息提示 如错误位置 错误类型 错误说明 用编辑软件重新调入源程序进行修改 4 生成可执行文件后 在DOS命令状态下直接键入文件名就可执行该文件 83 第3章 指令系统与汇编语言程序设计 3 6基本程序设计程序设计的目的是把解决实际问题的方法转化为计算机程序 在汇编程序设计过程中 首先对要解决的问题进行具体的描述 对于较小的程序可以使用程序流程图 对于较大的程序可以采用模块化程序设计方法 无论采用流程图还是模块化的方法设计都要使用程序设计的基本程序结构来表现出来 基本的程序结构包括顺序结构 分支结构 循环结构及子程序结构 84 第3章 指令系统与汇编语言程序设计 3 6 1程序设计的步骤和程序的基本结构1 程序设计的基本步骤用汇编语言设计程序 一般按下述步骤进行 1 分析问题 抽象出数学模型 2 确定算法或解题思想 3 绘制流程图 4 程序编制 5 程序的运行 检查与调试 85 第3章 指令系统与汇编语言程序设计 2 程序的基本结构程序的基本结构通常可以分为顺序结构 分支结构和循环结构3种 每一个结构只有一个入口和一个出口 3种结构的有机组合和嵌套可构成结构化程序 1 顺序结构 该结构是按照语句的先后次序执行一系列的顺序操作 没有分支和跳转 2 分支结构 也叫条件选择结构 可根据不同情况做出判断和选择 以便执行不同的程序段 分为双分支结构和多分支结构 3 循环结构 循环实际上是分支结构的一种扩展 循环是否继续是依靠条件判断语句来完成的 按照条件判断的位置 可以把循环分为 当型循环 和 直到型循环 86 第3章 指令系统与汇编语言程序设计 3 6 2顺序结构程序设计顺序结构是一种最简单的程序设计结构形式 采用这种结构只能完成简单的任务程序设计 顺序结构在任何结构的程序中都会出现 因此 它是构成复杂程序的基础 例3 32 用顺序结构来编程实现求S X2 Y2 Z的值 将最后结果放入RESULT单元保存 本题中要定义4个变量 X Y Z是计算表达式涉及到的数据 RESULT单元是结果的存放单元 为方便数据的重复使用 采用寄存器来存放中间结果X2和Y2 87 参考程序如下 DATASEGMENT 定义数据段XDB5 给X Y Z赋初值YDB7ZDB2RESULTDB 定义RESULT单元 预留空间DATAENDS 数据段结束CODESEGMENT 定义代码段ASSSUMECS CODE DS DATASTART MOVAX DATA 初始化DSMOVDS AXMOVAL X 将数据X送ALMULX 计算X2MOVBX AX 将中间结果保存到BXMOVAL Y 将数据Y送ALMULY 计算Y2ADDAX BX X2 Y2 结果保存到AXDIVZ 计算 X2 Y2 ZMOVRESULT AL 最后结果送RESULT单元MOVAH 4CH 返回DOSINT21HCODEENDS 代码段结束ENDSTART 汇编结束 88 第3章 指令系统与汇编语言程序设计 3 6 3分支结构程序设计在解决某些实际问题时 采用的方法会随着某些条件的不同而不同 这种在不同条件下处理的程序称为分支程序 采用分支结构设计的程序结构上清晰 易于阅读及调试 程序中所产生的分支是由条件转移指令来完成的 汇编语言提供了多种条件转移指令 可以根据使用不同的转移指令所产生的结果状态选择要转移的程序段 对给定问题进行处理 89 第3章 指令系统与汇编语言程序设计 1 单分支程序设计单分支结构是分支程序中最简单的一种形式 由它可组成其它复杂程序的基本结构 程序设计时要明确需要判断的条件 并选择合适的条件转移语句 例3 33 编程实现将键盘输入的小写字母转换为大写字母显示出来 从键盘接收数据后 在程序内要判断接收的是否是小写字母 是则进行转换 否则不予转换 这样就需要判断所输入字符是否在 a 和 z 的范围内 采用单分支结构即可实现 转换后结果的显示通过DOS功能调用的02号功能 将要显示字符的ASCII码放在DL中 90 参考程序如下 CODESEGMENTASSUMECS CODESTART MOVAL 01H 采用DOS调用的01号功能 从键盘输入字符INT21HCMPAL a 与字符 a 进行比较JBEXIT 小于 a 转向结束CMPAL z 与字符 z 进行比较JAEXIT 大于 z 转向结束SUBAL 20H 大小写字母间相差20HMOVDL AL 转换后 结果送DLMOVAH 02H DOS调用02号功能 显示结果INT21HEXIT MOVAH 4CH 返回DOSINT21HCODEEND 代码段结束ENDSTART 汇编结束 91 第3章 指令系统与汇编语言程序设计 2 多分支程序设计当程序中需要根据不同判断条件进行多项操作时 就要用到多路分支结构形式 例3 34 编写程序 完成下面的分段函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026届江西省抚州市南城县第一中学化学高二上期末达标检测模拟试题含答案
- 2026届广东省吴川一中化学高三第一学期期末教学质量检测试题含解析
- 2025年教师资格证考试(中学科目二)教育知识与能力专项强化训练试卷
- 王道课件邓平速写
- 民法典学习课件
- 玉米趣味农业科普知识培训课件
- 玉石鉴定师知识培训课件
- 2025年国家级科研实验室项目聘用人员服务协议
- 2025新型车库物业管理及设施升级改造合同
- 2025年工艺美术品定制生产合作协议
- 2025年注册安全工程师考试(初级)安全生产法律法规试题及答案
- 电机电路安全知识培训课件
- 2025年建筑师考试备考策略与实战经验
- 13.2.1三角形的边 教案 人教版数学八年级上册
- 2025年固定矫治器粘接护理常规流程试题(含答案)
- 成人手术后疼痛处理专家共识
- 读书分享-《教育的情调》
- 《材料力学》说课-课件
- 物资采购付款报销单
- 政务云收费标准 云托管收费标准
- 飞灰螯合物运输服务方案
评论
0/150
提交评论