计算机组成原理第7章.ppt_第1页
计算机组成原理第7章.ppt_第2页
计算机组成原理第7章.ppt_第3页
计算机组成原理第7章.ppt_第4页
计算机组成原理第7章.ppt_第5页
已阅读5页,还剩106页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章8086 8088汇编语言程序设计 7 1引言7 2顺序程序设计7 3分支结构程序设计7 4循环结构程序设计7 5字符串操作程序设计7 6宏 条件汇编与重复汇编7 7子程序设计7 88086 8088微处理器的其他指令与应用 2020 1 25 1 汇编语言的基本概念与学习汇编语言的重要性汇编语言是一种面向机器 处理器 的程序设计语言 是机器语言的符号化表示 汇编语言的执行语句与机器指令有着一一对应的关系 即一个执行语句对应一条机器指令 按照某种机器汇编语言的语法规则编写的源程序必须翻译成相应的机器语言才能在计算机上运行 这个翻译过程称为汇编 从汇编语言到机器语言的翻译程序叫汇编程序 本课程介绍的汇编程序是微软公司开发的MASM 交叉汇编 反汇编 7 1引言 2020 1 25 1 汇编语言的基本概念与学习汇编语言的重要性学习汇编语言有助于加深对计算机组成 寻址方式和指令集的理解 全面 客观地评价计算机 处理器的性能 使用汇编语言可以直接操作 控制计算机的底层硬件 相对于高级语言源程序经过编译得到的目标程序 汇编语言源程序经汇编得到的目标程序具有代码精练 占用存储空间小 执行速度快的特点 甚至还可以降低机器的功耗 不同的机器有不同的汇编语言 不同的汇编语言有不同的语法规则 本课程只介绍8086 8088汇编语言 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法合法的字符英文字母A Z a z 汇编语言不区分字母大小写 数字0 9符号 数据分为常量和变量在汇编期间 常量的值完全确定 在程序运行期间 常量的值不会发生变化 在汇编语言中 变量名代表的是该变量在计算机中的存储地址 和类型 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法常量二进制整数 例如 01010101B八进制整数 例如 567O 567Q十进制整数 例如 1234十六进制整数 例如 12H 0ABH字符 例如 O GOOD 十进制实数 例如 12 34E 5十六进制实数 例如 1A2B345R 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法符号常量用途 提高程序的可读性 降低发生错误的可能性通过 EQU 或 语句来定义例如 PIEQU3 141592ALPHT PI 3一个符号用 EQU 定义后就不允许对其再次定义 而用 定义的符号可以对其再次定义符号常量及其数值保存在汇编程序管理的符号表中 在汇编过程中 一旦遇到符号就用它的数值替换 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法变量两种类型 寄存器变量和主存变量寄存器变量就是寄存器名 例如 AX AH AL BX BH BL CX CH CL DX DH DL SI DI BP SP CS DS ES SS IP主存变量简称为变量 变量名具有段地址 偏移地址和类型三个属性 变量的类型有 DB DW DD DQ和DT 7 1引言 2020 1 25 一个实现字节型变量X Y Z的源程序 汇编语言源程序 在结构上与高级语言源程序是相似的 都是先定义变量 再编写对变量进行处理的语句 汇编语言的语句是计算机指令的助记符 功能单一 一行只能书写一个语句 指令 且用 回车 来标志结束 不需要在语句末尾加任何标点符号 著名诗人艾青 诗是艺术的语言 最高的语言 最纯粹的语言 您认不认为 编汇编语言程序就想写诗一样 2020 1 25 一个实现字节型变量X Y Z的源程序 注释 处理语句 也称指令性语句 说明语句 也称伪指令性 2020 1 25 2 8086 8088汇编语言的基本语法上例的伪指令有段定义伪指令 变量定义伪指令和段值设置伪指令段定义伪指令由语句 段名SEGMENT 开始 以语句 段名ENDS 结束 变量定义伪指令的格式是 变量名变量类型变量初值序列 注释 段值设置伪指令ASSUME 放在代码段的开始处ASSUMECS CODE DS DATA 7 1引言 2020 1 25 ASSUME伪指令仅仅告诉汇编程序 段寄存器与程序段的对应关系 段地址的真正设定还需要由指令性语句对段寄存器赋值来完成 不过代码段的段寄存器CS的赋值由DOS的装入模块自动完成 所以程序只需对数据段的段寄存器DS或附加数据段的段寄存器ES赋值 MOVAX DATA 数据段DATA的段地址送入AXMOVDS AX AX中的内容送入数据段段寄存器DS 2020 1 25 可见 一个段到底是数据段还是代码段与其名字无关 取决于程序把哪个段对应到哪个段寄存器 所以当源程序有多个段时 要小心编程 以免出错 2020 1 25 2 8086 8088汇编语言的基本语法上例的指令性语句有MOV指令 ADD指令和INT指令指令性语句的一般格式是 标号 指令操作符 操作数 操作数 注释 操作数分为源操作数和目的操作数 前者表示欲处理数据的源地址 后者表示处理结果的存储地址 两者的数据类型必须一致 标号是后面紧跟着冒号的标识符 代表冒号后面语句的存储地址 供转移指令或循环指令作为操作数使用标号的属性 NEAR FAR 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法标号 段名和变量名统称为标识符是一个由字母 符号或数字组成的字符串 这个字符串有三个限制 一是必须采用合法的字符 二是第一个字符必须是字母 问号 或下划线中的一个 不能是数字 三是不能使用汇编语言的保留字 标识符中字符个数没有明确的限制 但只有前面的31个字符能够被汇编程序识别 标识符的命名应该有一些含义 以增强程序的可读性和可理解性 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法MOV指令格式 MOVDst Src Dst Src 例如 MOVAX BXMOVCX 1234HMOV可以实现通用寄存器和主存单元之间的数据传送 却不能实现两个主存单元之间或两个段寄存器之间的数据传送 7 1引言 2020 1 25 2 8086 8088汇编语言的基本语法ADD指令格式 ADDDst Src Dst Src Dst 例如 ADDAX BXADDCX 1234H ADD指令影响标志位OF SF ZF AF PF CF 7 1引言 2020 1 25 汇编语言程序的开发过程编写源程序 EDIT DOS TextPad Windows 将源程序保存为XXXX asm文件使用MASM生成目标程序XXXX obj使用LINK生成可执行程序XXXX exe 7 1引言 2020 1 25 1 概述顺序程序是指不含有转移指令或分支指令的程序 语句执行的顺序就是它们排列的顺序 7 2顺序程序设计 指令格式 XORDst Src Dst Src Dst 注意对标志位的影响 2020 1 25 2 寻址方式目的大多数情况下 指令不直接给出操作数本身 而是给出存放操作数的寄存器或者是内存单元的地址 大多数情况下 操作数地址也不是直接给出 而是给出计算操作数地址的方法 称之为寻址方式 7 2顺序程序设计 2020 1 25 1 立即寻址操作数直接存放在指令中 紧跟在操作码之后 它作为指令的一部分存放在代码段里 这种操作数称为立即数 立即数可以是8位的或者16位的 386之后的机器也可以是32位的 立即数用来表示常数 它经常用来给寄存器赋初值 只能用于源操作数字段 不能用于目的操作数字段 且源操作数长度应与目的操作数长度一致 2020 1 25 立即数寻址举例MOVAX 3064H指令执行后 AX 3064H 2020 1 25 立即寻址举例 MOVAL 4EH 4E 2020 1 25 2 寄存器寻址操作数在寄存器中 指令中指定寄存器号 16位的操作数 寄存器可以是AX BX CX DX SI DI SP BP 8位的操作数 寄存器可以是AH AL BH BL CH CL DH DL 2020 1 25 例 MOVAX BX 指令执行前 AX 3064H BX 1234H 指令执行后 AX 1234H BX 1234H 寄存器寻址不需要访问存储器来取得操作数 所以可以得到较高的运算速度 2020 1 25 立即数寻址 寄存器寻址 直接寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 相对基址变址寻址 2020 1 25 2020 1 25 8086 8088段寄存器和相应存放偏移地址的寄存器之间的默认组合 2020 1 25 3 直接寻址操作数的有效地址只包含位移量一种成分 其值就存放在代码段中指令的操作码之后 位移量的值就是操作数的有效地址 例 MOVAX 2000H 假设 DS 3000H 物理地址 3000H 16 2000H 32000H 则指令执行后 AX 3050H 2020 1 25 可以用符号来代替数值地址MOVAX ADDRMOVAX ADDR 如果在附加段 则应指定段前缀MOVAX ES ADDRMOVAX ES ADDR 直接寻址中操作数地址是直接写在指令中 所以它只适用于处理单个变量 因为要处理另外一个变量 就需要用另外一条指令了 2020 1 25 4 寄存器间接寻址指令的操作数是一个寄存器 但是寄存器中的内容并不是真正的操作数 而是操作数的有效地址 因此真正的操作数需要按照这个有效地址访问主存储器才能获得 16位寻址 可用的寄存器是BX BP SI DI 使用BX SI DI 其默认段是数据段DS 使用BP 其默认段是堆栈段SS 2020 1 25 例 MOVAX BX 设 DS 2000H BX 1000H 物理地址 2000H 16 1000H 21000H 指令执行后AX 50A0H 寄存器间接寻址可用于以循环结构来处理表格 执行完一条指令后 只需修改寄存器内容就可以用同一个指令来访问表格的下一项 2020 1 25 5 寄存器相对寻址 相对寻址 意味着指令中带有位移量 操作数的有效地址为基址寄存器或变址寄存器的内容和指令中的位移量之和 例 MOVAX COUNT SI 也可以表示为MOVAX COUNT SI 请问 寄存器间接寻址与寄存器相对寻址 有何不同 2020 1 25 例 MOVAX COUNT BX MOVAX COUNT SI 当指令中使用的是基址寄存器BX或BP时 也称为基址寻址 当指令中使用的是变址寄存器SI或DI时 也称为变址寻址 2020 1 25 例 MOVAX COUNT BX 设 DS 3000H BX 2000HCOUNT 3000H 物理地址 3000H 16 2000H 3000H 35000H 指令执行后AX 1234H 2020 1 25 寄存器相对寻址 即基址寻址或变址寻址 同样可以用于以循环结构来处理表格 表格的首地址可设置为偏移量 第几列 的地址 利用修改基址或变址寄存器中的内容 第几行 来取得表格中的值 2020 1 25 6 基址变址寻址操作数的有效地址是一个基址寄存器和一个变址寄存器的内容之和 例 MOVAX BX DI 也可以表示为MOVAX BX DI 2020 1 25 指令执行后AX 1234H 例 MOVAX BX DI 设 DS 2100H BX 0158H DI 10A5H物理地址 2100H 16 0158H 10A5H 21158H 10A5H 221FDH 2020 1 25 基址变址寻址同样可以用于以循环结构来处理数组或表格 表格的首地址可存放在基址寄存器中 在处理过程中保持不变 利用变址寄存器的值作为下标来访问数组或表格中的元素 每处理完一个元素 变址寄存器的值 加一 指向下一个元素 2020 1 25 7 相对基址变址寻址 相对寻址 意味着指令中带有位移量 操作数的有效地址是一个基址寄存器与一个变址寄存器的内容和指令中的位移量之和 例 MOVAX ARRAY BX SI 也可表示为MOVAX ARRAY BX SI 2020 1 25 例 MOVAX MASK BX SI 设 DS 3000H BX 2000H SI 1000HMASK 0250H物理地址 3000H 16 2000H 1000H 0250H 33250H 假设 33250 1234H 则指令执行后AX 1234H 2020 1 25 相对基址变址寻址常用于二维数组元素的寻址 如存储器中存放着由多个记录组成的文件 则以位移量可以指向文件之首 基址寄存器指向某个记录 变址寄存器则指向该记录中的一个元素 2020 1 25 3 表达式的使用例7 232位数据X和Y的加减 结果分别存于Result1和Result2 DATASEGMENTXDD12345600HYDD11223344HResult1DD Result2DD DATAENDS 7 2顺序程序设计 2020 1 25 代码段的框架CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 核心代码 MOVAH 4CHINT21HCODEENDSENDSTART 7 2顺序程序设计 2020 1 25 代码段的核心代码MOVAX WORDPTRXMOVDX WORDPTR X 2 把1234H装入DXADDAX WORDPTRYADCDX WORDPTR Y 2 MOVWORDPTRResult1 AX 保存结果的低16位MOVWORDPTR Result1 2 DX 保存结果的高16位MOVAX WORDPTRXMOVDX WORDPTR X 2 SUBAX WORDPTRYSBBDX WORDPTR Y 2 MOVWORDPTRResult2 AXMOVWORDPTR Result2 2 DX 7 2顺序程序设计 带进位的加法 带借位的减法 表达式 2020 1 25 表达式的类型 数值表达式 常量与运算符 包括圆括号 组成的算式 它的运算结果被当作一个数值地址表达式 运算对象 包括寄存器名 常量 变量 标号及方括号 表示读主存 与运算符组成的算式 它的运算结果被当作一个主存地址 7 2顺序程序设计 2020 1 25 数值表达式的运算符类型 算术运算符 加 减 乘 除 MOD 取余数 SHR 算术右移 和SHL 算术左移 其中算术右移 左移1位相当于除以 乘以2 逻辑运算符 AND 与 OR 或 NOT 非 和XOR 异或 这4个运算符也是指令助记符 不过数值表达式在汇编时就用求出的值来代替表达式 不会与指令混淆 关系运算符 EQ 等于 NE 不等于 LT 小于 GT 大于 LE 小于等于 和GE 大于等于 它们的运算结果是0 表示不成立或者 假 或0FFFFH 表示成立或者 真 7 2顺序程序设计 2020 1 25 数值表达式的例子 MOVBX SUMLT10 AND30 OR SUMGE100 AND20符号常量SUM小于10时 将被汇编成 MOVBX 30 SUM大于等于100时 将被汇编成 MOVBX 20 SUM介于10 100时 将被汇编成 MOVBX 0 7 2顺序程序设计 2020 1 25 地址表达式的运算符类型 数值表达式中的三类运算符属性取代符类型运算符PTR段地址取代符 短地址取代符SHORT任意类型运算符THIS属性分离符 7 2顺序程序设计 2020 1 25 地址表达式的运算符类型 续 属性分离符取段地址符SEG和取偏移地址符OFFSET取类型符TYPE元素个数属性符LENGTH字节总数属性符SIZE高位字节属性符HIGH和低位字节属性符LOW 7 2顺序程序设计 2020 1 25 4 乘 除法运算的实现 1 8086 8088的乘法指令有两个 无符号数乘法指令MUL unsignedMULtiple MULsrc AX AL 8位src DX AX AX 16位src 带符号数乘法指令IMUL sIgnedMULtiple IMULsrc AX AL 8位src DX AX AX 16位src 7 2顺序程序设计 2020 1 25 4 乘 除法运算的实现 2 8086 8088的除法指令有两个 无符号数除法指令DIV unsignedDIVide DIVsrc AL AX 8位src 的商 AH AX 8位src 的余数 AX DX AX 16位src 的商 DX DX AX 16位src 的余数带符号数除法指令IDIV sIgnedDIVide IDIVsrc 同上 7 2顺序程序设计 2020 1 25 5 算术移位与逻辑移位 1 8086 8088的算术移位指令有两个 算术左移指令SAL ShiftArithmeticLeft SALopr 1SALopr CL算术右移指令SAR ShiftArithmeticRight SARopr 1SARopr CL 7 2顺序程序设计 2020 1 25 5 算术移位与逻辑移位 2 8086 8088的逻辑移位指令有两个 逻辑左移指令SHL SHiftlogicalLeft SHLopr 1SHLopr CL逻辑右移指令SHR SHiftlogicalRight SHRopr 1SHRopr CL 7 2顺序程序设计 2020 1 25 在汇编语言程序中 程序的分支是通过转移指令来实现的 8086 8088微处理器提供了两类转移指令 无条件转移指令JMP和条件转移指令JX 它们的执行均不影响标志位 7 3分支结构程序设计 2020 1 25 1 无条件转移指令JMP指令格式 JMPOPR指令功能 根据OPR更改IP 或CS 根据是否改变CS寄存器 无条件转移可以分为段内转移和段间转移 顾名思义 段内转移不改变CS 只改变IP 段间转移既改变CS 又改变IP 段内转移的三种形式 段内直接短转移 其格式是 JMPSHORTOPR段内直接近转移 其格式是 JMPOPR段内间接转移 其格式是 JMPWORDPTROPR 7 3分支结构程序设计 2020 1 25 段内直接转移以当前IP指向的地址为基准地址 加上跟在操作码后面的相对位移量D 得到目标指令的有效地址EA 为了便于实现加法 相对位移量D以补码的形式表示 2020 1 25 段内直接转移8位的相对位移量 类型为 SHORT 对应的转移范围是 128 12716位的相对位移量 类型为 NEAR 对应的转移范围是 32768 32767 例如 JMPNEARADDRJZSHORTADDR 位移量是汇编程序通过求转向的目标指令的有效地址与当前IP值之差而的 注意 当前IP已经指向转移指令的下一条指令 2020 1 25 段内间接转移转向的有效地址是一个寄存器或是一个存储单元的内容 这个寄存器或者存储单元中的内容可以用除立即数以外的任何一种寻址方式获得 IP EA 2020 1 25 假设 DS 2000H BX 1256H 21256H 3280H JMPBX执行该指令后 IP 1256HJMP BX 执行该指令后 IP 20000H 1256H 21256H 3280H 2020 1 25 假设 DS 2000H BX 1256H SI 528FH 位移量VAR 2011H 23267 3280H 284F6H 2450HJMPVAR BX 执行该指令后 IP DS 16 BX 位移量 20000H 1256H 2011H 23267H 3280HJMPVAR BX SI IP DS 16 BX SI VAR 20000H 1256H 528FH 2011H 284F6H 2450H 2020 1 25 段间转移应用于转移目标不在JMP指令所在段的场合 需要给出4字节的目标地址CS IP 段间转移有两种形式 段间直接 远 转移 JMPFARPTROPR指令直接提供转向的段地址和偏移地址 类型为 FARPTR 例如 JMPFARPTROPR IP OPR的低16位 段内偏移地址 CS OPR的高16位 段地址 2020 1 25 段间直接 远 转移段间间接寻址用存储器中的相邻两个字的内容来取代IP和CS寄存器中的原始内容 以达到段间转移的目的 存储单元的有效地址EA是由指令指定除立即数方式和寄存器方式以外的任何一种数据寻址方式获得完成的操作 IP EA CS EA 2 2020 1 25 例JMPDWORDPTR BX 8 BX 3706H DS 1000HEA BX 8 3706H 8 370EH物理地址 DS 16 EA 10000H 370EH 1370EH 指令执行后 IP 67B2H CS 3305H 2020 1 25 2 条件转移指令JX和比较指令CMPJX的格式是 JXOPR 其中OPR是目的地址标号 SHORT属性 JX的操作是 满足条件则 IP IP OPR 即跳转到目的地址处执行指令 否则不做任何操作 即IP不变 执行下一条指令 说明 X为1 3个字母 表示转移条件 为了得到条件转移指令所需的条件 通常需要先执行 比较 指令CMP CoMPare 7 3分支结构程序设计 2020 1 25 判断单个标志位状态的条件转移指令有10条 CF 1时转移JC JumpifCarry CF 0时转移JNC JumpifNotCarry ZF 1时转移JE JZ JumpifEqual orZero ZF 0时转移JNE JNZ JumpifNotEqual orNotZero SF 1时转移JS JumpifSign SF 0时转移JNS JumpifNotSign OF 1时转移JO JumpifOverflow OF 0时转移JNO JumpifNotOverflow PF 1时转移JP JPE JumpifParity orParityEven PF 0时转移JNP JPO JumpifNotParity orParityOdd 7 3分支结构程序设计 2020 1 25 比较无符号数的条件转移指令有4条 高于 不低于且不等于 CF 0且ZF 0 转移JA JNBE 高于或等于 不低于 CF 0或ZF 1 转移JAE JNB 低于 不高于且不等于 CF 1且ZF 0 转移JB JNAE 低于或等于 不高于 CF 1或ZF 1 转移JBE JNA 其中 A表示高于 Above B表示低于 Below E表示等于 Equal 7 3分支结构程序设计 2020 1 25 比较有符号数的条件转移指令有4条 大于 不小于且不等于 ZF 0且SF OF 0 转移JG JNLE 大于或等于 不小于 ZF 1或SF OF 0 转移JGE JNL 小于 不大于且不等于 ZF 0且SF OF 1 转移JL JNGE 小于或等于 不大于 ZF 1或SF OF 1 转移JLE JNG 其中 G表示大于 Greater L表示小于 Less E表示等于 Egual 7 3分支结构程序设计 2020 1 25 例7 4求三个16位无符号数中的最大值 DATASEGMENTXDW180YDW670ZDW320MAXDW DATAENDS 2020 1 25 例7 4求三个16位无符号数中的最大值 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 具体操作指令序列 MOVAH 4CHINT21HCODEENDSENDSTART 2020 1 25 例7 4求三个16位无符号数中的最大值 具体操作指令序列 MOVAX XCMPAX YJAEAXBIGMOVAX YAXBIG CMPAX ZJAEAXMAXMOVAX ZAXMAX MOVMAX AX 2020 1 25 例7 5已知三个带符号的8位二进制数x y z 将其按升序排序后重新存回x y z DATASEGMENTXDB 5YDB23ZDB7DATAENDS 2020 1 25 例7 5程序主体框架 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX 具体操作指令序列 EXIT MOVAH 4CHINT21HCODEENDSENDSTART 2020 1 25 MOVAL XCMPAL YJLXLYXCHGAL YXCHGAL XXLY CMPAL ZJLCMPYZXCHGAL ZXCHGAL XCMPYZ MOVAL YCMPAL ZJLEXITXCHGAL ZXCHGAL Y 例7 5具体操作指令序列 2020 1 25 根据是否已知循环次数 可将循环分为计数循环和条件判断循环 计数循环的循环次数是已知的 确定的 一般是将循环次数存入计数寄存器CX 然后每循环1次CX减1 当CX不为0时 循环继续 否则结束循环 这种循环结构常用LOOP指令来实现 LOOP指令的格式是 LOOP语句标号 操作是 CX CX 1 若CX 0则IP IP 语句标号 否则IP不变 即执行LOOP指令的下一条指令 7 4循环结构程序设计 2020 1 25 条件判断循环并不关心循环的次数 只关心进入循环的条件是否满足 所以这种循环可以通过条件转移指令或下列条件循环指令来实现 8086 8088的条件循环指令有 为零或相等循环指令LOOPZ LOOPE LOOPwhileZero orEqual 和非零或不相等循环指令LOOPNZ LOOPNE LOOPwhileNonZero orNotEqual LOOPZ LOOPE指令的格式是 LOOPZ LOOPE语句标号 操作是 CX CX 1 若CX 0且ZF 1 则IP IP 语句标号 否则IP不变 LOOPNZ LOOPNE指令的格式是 LOOPNZ LOOPNE语句标号 操作是 CX CX 1 若CX 0且ZF 0 则IP IP 语句标号 否则IP不变 7 4循环结构程序设计 2020 1 25 在汇编后得到的目标代码中 LOOP LOOPZ LOOPE和LOOPNZ LOOPNE指令中的操作数 语句标号 的实质是一个单字节的补码 其值等于循环控制指令与转移目标语句的距离 这些循环控制指令的执行均不影响标志位 7 4循环结构程序设计 2020 1 25 例7 6有一个首地址为ARRAY的M字数组 请编程计算该数组内容之和 并把结果存入TOTAL中 程序的数据段DATASEGMENTARRAYDW12 13 26 35 71 83MEQU ARRAY 2TOTALDW DATAENDS 7 4循环结构程序设计 2020 1 25 例7 6有一个首地址为ARRAY的M字数组 请编程计算该数组内容之和 并把结果存入TOTAL中 程序代码段的核心代码MOVAX 0MOVCX M 循环次数M送入CXMOVSI AX 效果等于 MOVSI 0 但更快STARE LOOP ADDAX ARRAY SI ADDSI 2 地址加2指向下一个字型数据LOOPSTART LOOPMOVTOTAL AX 7 4循环结构程序设计 2020 1 25 例7 7将位于数据段TEXT地址中的小写字母 转换成大写字母 然后存回原地址内 TEXT内容结束标志为 ASCII码中 大于等于 a 且小于等于 z 的字母为小写字母 通过减32 20H 可将其转换成大写字母 2020 1 25 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXLEABX TEXT EXIT MOVAH 4CHINT21HCODEENDSENDSSTART 2020 1 25 B20 MOVAL BX CMPAL 判断是否是 结束符 JEEXIT 是 则结束CMPAL a JBB30 在 a 之下 是大写字母CMPAL z JAB30 在 z 之上 不是字母SUBAL 20H 小写字母变大写字母MOV BX AL 替换原先小写字母B30 INCBX 指向下一个字母 JMPB20 2020 1 25 例7 8把BLOCK为首地址的数据区中100个连续的8位二进制数按正 负数分开 分别送到两个缓冲区PLUS DATA 存正数 和MINUS DATA 存负数 中 假设数据中不存在0 判断正数的算法 使用TEST指令测试符号位 然后判断ZF标志 TESTAL 10000000B若为正数 则 与 运算结果为0 ZF 1 2020 1 25 DATASEGMENTBLOCKDB1 2 3 4 100PLUS DATADB100DUP MINUS DATADB100DUP DATAENDS CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AX CODEENDSENDSSTART 2020 1 25 CODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXLEASI BLOCKLEADI PLUS DATALEABX MINUS DATAMOVCX 100 CODEENDSENDSSTART 2020 1 25 GOON MOVAL SI TESTAL 10000000BJNZMINUS 转去处理负数MOV DI AL 处理正数INCDI 下一正数的存储地址JMPAGAINMINUS MOV BX AL 处理负数INCBX 下一负数的存储地址AGAIN INCSI 指向下一待处理的数据LOOPGOON 一个完整的循环结构 2020 1 25 字符串操作指令和重复前缀8086 8088微处理器提供了5条字符串操作指令 传送串指令MOVS MOVeString 存回串指令STOS STOreintoString 取入串指令LODS LOAdfromString 扫描串指令SCAS SCAnString 和比较串指令CMPS COMpareString 它们都是单字节指令 指令执行一次只处理一个字符 要想让指令连续处理一个字符串 可以在指令前面加上 重复前缀 REP 重复 REPE REPZ 相等 为零重复 或REPNE REPNZ 不相等 不为零重复 重复的次数由CX中的值决定 7 5字符串操作程序设计 2020 1 25 字符串操作指令和重复前缀8086 8088微处理器提供了5条字符串操作指令 传送串指令MOVS MOVeString 存回串指令STOS STOreintoString 取入串指令LODS LOAdfromString 扫描串指令SCAS SCAnString 和比较串指令CMPS COMpareString 它们都是单字节指令 指令执行一次只处理一个字符 要想让指令连续处理一个字符串 可以在指令前面加上 重复前缀 REP 重复 REPE REPZ 相等 为零重复 或REPNE REPNZ 不相等 不为零重复 重复的次数由CX中的值决定 7 6宏 条件汇编与重复汇编 2020 1 25 7 7子程序设计 1 引言如果在一个程序中的多个地方 或多个程序中的多个地方用到了同一段程序 那么可以将这段程序抽取出来 存放在某一存储区域 每当需要执行这段程序时 就调用指令转到这段程序去 执行完毕 再返回原来的程序 把抽取出来的这段程序叫做子程序或过程 调用它的程序称为主程序或调用程序子程序允许嵌套和递归 2020 1 25 子程序的调用过程记录断点 为了返回到调用程序的合适地方 转子调用必须保留返回调用程序的下一条指令的地址 返回地址 又叫断点 即当前IP寄存器的值 保护现场 保存有关通用寄存器的内容 子程序返回主程序之前 恢复这些通用寄存器的内容参数传递的方法通过寄存器传递 适于参数较少时通过参数表传递 适合参数较多的情况通过堆栈传递 适合参数较多 且子程序有嵌套 递归的情况 2020 1 25 1 引言2 调用指令和返回指令 1 调用指令 CALL子程序名 目的地址 2 返回指令 RET n 7 7子程序设计 2020 1 25 调用指令格式 CALL子程序名 目的地址功能 段内直接近调用CALL子程序名 NEAR PUSH IP IP IP 16位的二进制数段内间接近调用CALLWORDPTR BX DI PUSH IP IP EA 2020 1 25 7 7子程序设计 段间直接远调用CALL子程序名 FAR PUSH CS PUSH IP IP 目标地址中指定的偏移地址 CS 目标地址指定的段地址段间间接远调用CALLDWORDPTR BX PUSH CS PUSH IP IP EA CS EA 2 2020 1 25 返回指令RET段内近返回 IP POP 段间远返回 IP POP CS POP 2020 1 25 7 7子程序设计 子程序设计适合编成子程序的程序一段程序在整个任务中被多次使用一段程序在多个任务中被多次使用子程序的特点节省存储空间增大了时间开销 2020 1 25 7 7子程序设计 子程序的组成框架 程序说明BTODPROCFAR NEAR 保护现场 将寄存器压入堆栈核心工作恢复现场 将堆栈弹回寄存器RET 返回BTODENDP 2020 1 25 1 引言2 调用指令和返回指令3 子程序的参数传送通过寄存器传送通过堆栈传送通过地址表传送 2020 1 25 7 7子程序设计 7 88086 8088微处理器的其他指令与应用 1 处理器控制指令 2020 1 25 1 处理器控制指令2 对标志位的操作8086 8088微处理器只提供对标志寄存器中DF 第10位 IF 第9位 和CF 第0位 三个标志位进行修改的指令 那么如何修改OF 第11位 TF 第8位 SF 第7位 ZF 第6位 AF 第4位 PF 第2位 标志位呢 7 88086 8088微处理器的其他指令与应用 2020 1 25 利用标志进栈指令PUSHF PUSHtheFlags 和标志出栈指令POPF POPtheFlags 指令 例如欲清除TF标志 可以用如下语句 PUSHF 将标志寄存器的内容压入堆栈MOVBP SP 栈顶指针送入BP寄存器AND BP 0FEFFH 将BP指向的主存单元的第8位置成0POPF 将栈顶单元的内容写入标志寄存器欲翻转OF标志 可以用如下语句 PUSHF 标志位入栈POPAX 标志位入AXXORAX 0800H 在AX中将OF翻转 其余位不变PUSHAX 修改后的标志位入栈POPF 标志位出栈存回标志寄存器 7 88086 8088微处理器的其他指令与应用 2020 1 25 利用 标志寄存器低字节送AH指令LAHF LoadAHwithFlags 和 AH送标志寄存器低字节指令SAHF StoreAHintoFlags LAHF和SAHF指令都是单字节指令 执行时间都是4个时钟周期 LAHF指令的执行不影响标志位 SAHF指令执行后低8位标志位的值由指令的操作数决定 例如 欲清除SF标志 可以用如下语句 LAHFANDAH 7FH 将标志寄存器的第7位置成0SAHF欲将标志寄存器低8位清0 可以用如下语句 MOVAH 00HSAHF 7 88086 8088微处理器的其他指令与应用 2020 1 25 1 处理器控制指令2 对标志位的操作3 中断指令在执行程序的过程中 计算机会遇到一些异常情况或特殊请求 此时处理器将保存当前的状态 转去进行必要的处理 处理完毕后返回到程序间断处继续执行 这个过程叫做中断 中断可分为由处理器外部引起的外部中断 异常情况引起的硬件中断和 中断 指令INT引起的软件中断 7 88086 8088微处理器的其他指令与应用 2020 1 25 3 中断指令INT指令的格式是 INTTYPE或INT 其中TYPE为中断类型号 它是一个取值范围在0 255之间的常数或常数表达式 例如INT21H 所有中断都有一个编号 中断类型号 类型号乘以4就是相应的中断服务程序的入口地址 格式中的INTTYPE为双字节指令 执行时间为52个时钟周期 格式中的INT为单字节指令 隐含的中断类型号为3 执行时间为51个时钟周期 INT指令执行的操作依次是 SP SP 2 SP FR SP SP 2 SP CS SP SP 2 SP IP IP TYPE 4 CS TYPE 4 2 7 88086 8088微处理器的其他指令与应用 2020 1 25 3 中断指令计算结果溢出属于一种异常 需要进行中断处理 该中断的类型号为4 为了加快溢出的处理 8086 8088微处理器专门设置了 溢出中断 指令INTO INTO指令执行的操作依次是 若OF 0 不做任何操作 否则 SP SP 2 SP FR SP SP 2 SP CS SP SP 2 SP IP IP 10H CS 12H 当OF 0时 INTO指令的执行时间为4个时钟周期 否则为53个时钟周期 INT和INTO指令执行结束后

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论