微机原理第3章重点_第1页
微机原理第3章重点_第2页
微机原理第3章重点_第3页
微机原理第3章重点_第4页
微机原理第3章重点_第5页
已阅读5页,还剩278页未读 继续免费阅读

下载本文档

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

文档简介

第3章指令系统和寻址方式 3 1指令系统概述3 28088 8086CPU的寻址方式3 38088 8086CPU的指令系统 3 1指令系统概述 程序是指令的有序集合 指令是程序的组成元素 通常一条指令对应着一种基本操作 一台计算机能执行什么样的操作 能做多少种操作 是由该计算机的指令系统决定的 一台计算机的指令集合 就是该计算机的指令系统 每种计算机都有自己固有的指令系统 互不兼容 但是 同一系列的计算机其指令系统是向上兼容的 8086 8088指令系统特点8086与8088指令系统由8080 8050指令系统扩展而来的 同时又能在后续的80X86系列的CPU上正确运行 其主要特点是 可变长指令 指令格式比较复杂 寻址方式多样灵活 处理数据能力比较强 字节 字 有符号 无符号二进制数据 压缩型 非压缩型十进制数据 有重复指令 乘除运算指令 扩充了条件转移 移位 循环指令 增设了加强软件中断功能和支持多处理器系统的相关指令 图3 1指令格式 指令由两部分构成 操作码 OP Code 字段 用于描述计算机所要执行的操作类型和性质 由一组二进制代码表示 在汇编语言中用助记符代表 操作数 Oprand 字段 用于描述该指令的操作对象 指令执行的操作所需要的操作数 可以使操作数本身 或操作数地址 或操作数地址计算方法 无操作数 控制类指令单操作数 只给出一个操作数地址 该操作数可在寄存器或存储器中 或指令中直接给出立即数 双操作数 源操作数 source 目的操作数 destination 一个操作数在寄存器中 另一个在寄存器或存储器中 或指令中直接给出立即数 不允许两个都在存储器中 操作码 从 到寄存器 字 字节 寻址方式 寄存器 寄存器 存储器 B1B2B3B4B5B6 可变长指令 指令长度为1 6个字节 其中B1和B2为基本字节 B3 B6根据不同指令作相应的安排 指令格式 B2字节MOD 给定指令的寻址方式 2位 MOD 00 没有位移量 MOD 01 只要第8位位移量 需将符号扩展8位 形成16位 MOD 10 有16位位偏移量 MOD 11 寄存器方式 两个操作数均为寄存器中 一个由REG字段确定 一个由R M字段确定 指令格式 3 28088 8086CPU的寻址方式 固定寻址AAA立即数寻址寄存器寻址存储器寻址 数据寻址方式 直接寻址间接寻址 寄存器间接寻址寄存器相对寻址基址变址寻址相对基址变址 指令寻址方式 其它寻址方式 串操作指令寻址I O端口寻址 转移类指令寻址 3 2 1数据寻址方式 1 固定寻址有些单字节指令 规定CPU对某个固定的寄存器进行 如 加法的BCD码调整指令AAA 规定被调整的数总位于AL中 该指令用来调整AL中的结果 指令编码为 OP0011011137H 2 立即寻址方式操作数就在指令中 当执行指令时 CPU直接从指令队列中取得立即数 而不必执行总线周期 立即数可以是8位 或16位只能是整数类型的源操作数 主要用来给寄存器赋初值 指令执行速度快 如 传送指令MOVAX 34EAH表示将34EAH送AX AH中为34H AL中为EAH 即高地址对应高字节 低地址对应低字节 图3 28位立即寻址操作示意图 图3 316位立即寻址操作示意图 立即数寻址的功能 3 寄存器寻址方式 操作数在CPU的寄存器中 指令给出寄存器名 源操作数和目的操作数均可采用寄存器寻址方式 寻址的指令长度短 操作数就在CPU内部进行 不需要使用总线周期 指令执行速度快 如 加1指令INCreg 表示将寄存器内容加1 指令编码 7320 16位 AX CX DXBX SP BP SI DI8位 AH AL BH BL CH CL DH DL000001010011100101110111 寄存器寻址的功能 例3 2 MOVAL BL操作过程如图3 4所示 图3 4寄存器寻址操作示意图 4 存储器寻址方式寻找存储器操作数 必须经总线控制逻辑电路进行存取 当EU单元需要读 写位于存储器的操作数时 根据寻址方式 指令中B2字节 由EU计算出操作数地址的偏移量 即有效地址EA 将EA送至BIU单元 同时请求BIU执行一个总线周期 BIU将某个段寄存器的内容左移4位 加上EU送来的EA 形成20位的实际地址 即物理地址PA 执行总线周期 读 写指令所需的操作数 计算EA的通式为 1 直接寻址 最简单 直观 指令中直接以位移量形式 给出操作数的有效地址EA 即EA DISP执行速度快 主要用于存取位于存储器中的简单变量 默认的段寄存器是DS 如 MOVAX 1680H 表示将1680H和1681H两单元的取入AX中 例3 3 MOVAX 1000H 假设 DS 3000H 31000H 12H 31001H 34H 指令执行完以后 AX 3412H 操作的示意图如图3 5所示 图3 5直接寻址操作示意图 8086允许在汇编指令中指定除DS寄存器以外的段寄存器作为操作数的段地址 这就是段超越前缀 其汇编格式为段寄存器名 地址表达式或段寄存器名 数字表达式或段寄存器名 地址表达式 或段寄存器名 数字表达式 例3 4 假设TABLE是在附加数据段定义的一个字节数组的首地址标号 其偏移地址为1000H 则指令MOVAL ES TABLE或MOVAL ES TABLE 或MOVAL ES 1000H或MOVAL ES 1000H 是等效的 都表示将字节数组的第一个数组元素送入AL寄存器中 24 直接寻址的执行 MOVAX DS 2000H 2 间接寻址 指寄存器寻址方式 操作数一定在存储器中 存储单元的EA由寄存器指出 基址寄存器BX 基址指针寄存器BP 变址寄存器SI和DI 书写时 寄存器带方括号 根据所采用的寄存器不同 归纳为四种 寄存器间接寻址 BX或BP或SI或DI寄存器相对寻址 BX或BP或SI或DI 位移量基址变址寻址 BX或BP SI或DI相对基址变址寻址 BX或BP SI或DI 位移量 间接寻址1 寄存器间接寻址方式 采用寄存器间接寻址方式时 操作数一定在存储器中 存储单元的有效地址由寄存器指出 这些寄存器可以为BX BP SI和DI之一 即有效地址等于其中某一个寄存器的值 BX BP EA SI DI 寄存器间接寻址可分为以下3种 以BX寄存器进行间接寻址 数据段基址寻址以BP寄存器进行间接寻址 堆栈段基址寻址以SI和DI寄存器进行间接寻址 变址寻址 汇编寻址这种方式时 汇编程序将BX SI DI或BP寄存器的地址编号写入指令的地址码字段 当机器执行含有这种寻址方式的指令时 依据地址码字段的值访问得到寄存器的值 将该值作为操作数的偏移地址 如果指令中指定的寄存器是BX SI DI 则操作数默认在数据段中 取DS寄存器的值作为操作数的段地址值 如果指令中指定的寄存器是BP 则操作数默认在堆栈段中 取SS寄存器的值作为操作数的段地址值 从而算得操作数的20位物理地址 继而访问到操作数 28 寄存器间接寻址的功能 29 寄存器间接寻址的执行 30 1 以BX寄存器进行间接寻址 数据段基址寻址用BX寄存器进行间接寻址时 默认的段寄存器为DS 因为BX称为基址寄存器 所以这种寻址方式也叫数据段基址寻址 例如 MOVAX BX 设DS 5000H BX 3000H 则本指令在执行时 将53000H和53001H两单元的内容送AX 如果要对其它段寄存器所指的区域进行寻址 则必须在地址前用前缀指出段寄存器名 例如 MOVCX ES BX 设ES 3000H BX 4000H 则本指令在执行时 将34000H和34001H两单元的内容送CX 31 2 以BP寄存器进行间接寻址 堆栈段基址寻址如果以寄存器BP对操作数进行间接寻址 操作数默认在堆栈段中 该寻址方式通常称为堆栈段基址寻址 例如 MOVBX BP 设SS 5000H BP 4000H 则本指令在执行时 将54000H和54001H两单元的内容送BX 3 以SI和DI寄存器进行间接寻址 变址寻址SI和DI寄存器分别称为源变址寄存器和目的变址寄存器 所以用这两个寄存器来进行间接寻址也叫变址寻址 变址寻址通常用于对数组元素 字符串等进行操作 操作过程中 指令会自动修改变址寄存器中的地址 以指向下一个操作数 间接寻址2 寄存器相对寻址方式操作数的偏移地址是指定寄存器的值与一个整数之和 这种寻址方式在汇编格式中表示为 BX BP 8位位移量EA SI 16位位移量 DI 汇编这种寻址方式时 汇编程序将BX或SI或DI或BP寄存器的地址编号写入指令的地址码字段 并且将变量名的偏移地址或符号名的数值或数字表达式的计算结果值作为位移量也写入指令的地址码字段 当机器执行含有这种寻址方式的指令时 依据地址码字段的编号访问得寄存器的值 将其与位移量相加 或相减 和 差 作为操作数的偏移地址 如果指令中指定的寄存器是BX SI DI 则操作数默认在数据段中 取DS寄存器的值作为操作数的段地址值 如果指令中指定的寄存器是BP 则操作数默认在附加数据段中 取SS寄存器的值作为操作数的段地址值 从而算得操作数的20位物理地址 继而访问到操作数 位移量的表示方法 变量名 符号名 数字表达式例 TABLE是在数据段定义的一个字节数组的首地址标号 变量名 则 MOVSI 5MOVAL TABLE SI 或者MOVAL TABLE SI 该类指令也可用段超越前缀重新指定段寄存器例 MOVAL ES TABLE SI 这种寻址方式一般用于访问表格 表格首地址可设置为变量名 通过修改SI或DI或BX或BP的内容来访问表格的任一数据项的存储单元 2020 4 6 35 代码段 DS 数据段 MOVAL 0024H SI 0024H SI 0 AL 12H SI 1 AL 34H SI 2 AL 56H SI 3 AL 78H SI 4 AL 9AH EA 24H SI SI 可看作数据起始单元的偏移量 数组内某元素距数组起始单元的位移 通过修改SI可遍历整个数组 利用该寻址方式对于一维数组 表格 的访问 36 将BX BP和SI DI寄存器组合起来进行间接寻址通常将BX和BP称为基址寄存器 将SI和DI称为变址寄存器 8086指令系统允许把基址寄存器和变址寄存器组成起来构成一种新的寻址方式 叫基址变址寻址 用这种寻址方式时 操作数的有效地址等于基址寄存器 BX或BP 的内容加上一个变址寄存器 SI或DI 的内容 即 EA BX SI BP DI 间接寻址3 基址变址寻址方式 37 例如 MOVAX BX SI 设DS 1000H BX 5000H SI 2000H 则上面指令在执行时 有效地址为7000H 本指令将17000H和17001H两单元的内容取到AX中 由于基址加变址的寻址方式中 允许两个地址分量分别改变 而且有一个对段寄存器的约定规则 如果基址寄存器用BX 则默认的段寄存器为DS 如果基址寄存器用BP 则默认的段寄存器为SS 例3 MOVAX BX SI 或写为MOVAX BX SI 若 DS 2000H BX 0500H SI 0010H则偏移地址 0500H 0010H 0510H20位物理地址 20000H 0510H 20510H如 20510H 12H 20511H 34H 则 AX 3412H 操作的示意图如图3 5所示 图3 基址变址寻址操作示意图 当然 也可用段超越前缀重新指定段寄存器 例如 MOVAL ES BX SI 这种寻址方式同样用于访问表格或数组 将表格或数组首地址存入基址寄存器 通过修改变址寄存器内容可访问到表格或数组的任一数据项的存储单元 由于这种寻址方式两个寄存器内容都可修改 因此它比寄存器相对寻址更灵活 间接寻址4 相对基址变址寻址方式 操作数偏移地址是一个基址寄存器的值 一个变址寄存器与相对位移量之和 汇编格式表示为 位移量的表示方法 变量名 符号名 数字表达式 例 MOVAL TABLE BX SI 也可写成 MOVAL TABLE BX SI 或MOVAL TABLE BX SI 汇编这种寻址方式时 汇编程序将基址寄存器的地址编号和变址寄存器的地址编号分别写入指令的地址码字段 并且将变量名的偏移地址 符号名的数值或数字表达式的计算结果值作为位移量也写入指令的地址码字段 当机器执行含有这种寻址方式的指令时 依据地址码字段的值访问得到基址寄存器和变址寄存器的值以及位移量 将三者相加 和作为操作数的偏移地址 如果指令中指定的基址寄存器是BX 则操作数默认在数据段中 取DS寄存器的值作为操作数的段地址值 如果指令中指定的基址寄存器是BP 则操作数默认在附加数据段中 取SS寄存器的值作为操作数的段地址值 从而算得操作数的20位物理地址 访问到操作数 例3 TABLE是数据段中定义的一个符号地址 假设它在数据段中的偏移地址是1000H 则指令MOVAX TABLE BX DI 若 DS 2000H BX 0100H DI 0020H则偏移地址 1000H 0100H 0020H 1120H20位物理地址 20000H 1120H 21120H假设 21120H 12H 21121H 34H 操作过程如图3 6所示 执行完指令以后 AX 3412H 图3 相对基址变址寻址操作示意图 在访问堆栈数组时 可以在BP中存放堆栈顶的地址 位移量表示数组第一个元素到栈顶的距离 变址寄存器SI 也可为DI 指出数组元素 该寻址方式使用起来很灵活 特别是为堆栈中数组的访问过程提供了极大的方便 46 BX SI分别存放数组的脚标 MOVAL ARRAY BX SI 之间表示相加的关系 BX SI BX SI 利用该寻址方式对于二维数组的访问 在一条指令中 若有两个操作数 可以采用不同的寻址方式 也可以采用相同的寻址方式 例如 ADDAX 3064HMOVAX CX 汇编语言中 常将 方括号中的内容作为存储单元的地址 如 BX DI 2056H 除立即数寻址和寄存器寻址外 其他寻址方式都有隐含的段寄存器 操作数实际的物理地址是由段寄存器的内容和指令码中求得的有效地址的相加来求得 Tips 存储器寻址实例例 设DS 1200H BX 05A6H SS 5000H BP 40A0H SI 2000H DI 3000H 位移量DISP 1618H 试判断下列指令的寻址方式 并求出在各种寻址方式下的EA和PA 并说明指令执行的结果 MOVAX 0618H MOVAX BX MOVAX BP MOVAX DI MOVAX BX DI MOVAX BP SI DISP MOVAX 0618H 直接寻址EA DISP 0618HPA DS左移4位 EA 12000H 0618H 12618H执行结果 把数据段12618H和12619H两单元的内容取出送AX里 MOVAX BX 间接寻址 寄存器间接寻址EA BX 05A6HPA DS左移4位 EA 12000H 05A6H 125A6H执行结果 将数据段125A6H和125A7H两单元的内容取出来送AX MOVAX BP 间接寻址 寄存器间接寻址EA BP 40A0HPA SS左移4位 EA 50000H 40A0H 540A0H执行结果 将堆栈段540A0H和540A1H两单元的内容取出来送AX MOVAX DI 间接寻址 寄存器间接寻址EA DI 3000HPA DS左移4位 EA 12000H 3000H 15000H执行结果 将数据段540A0H和540A1H两单元的内容取出来送AX MOVAX BX DI 间接寻址 基址变址寻址EA BX DI 05A6H 3000H 35A6HPA DS左移4位 EA 12000H 35A6H 155A6H执行结果 将数据段155A6H和155A7H两单元的内容取出来送AX MOVAX BP SI DISP 间接寻址 相对基址变址寻址EA BP SI DISP 40A0H 2000H 1618H 76B8HPA SS左移4位 EA 50000H 76B8H 576B8H执行结果 将堆栈段576B8H和576B9H两单元的内容取出来送AX 其它寻址方式1 串操作指令寻址方式源串操作数第1个字节 字有效地址存放在源变址寄存器SI中 目标串操作数1个字节 字有效地址存放在目标变址寄存器DI中重复操作时 自动修改SI和DI的内容 指向后面的字节 字 指令中 不必给出SI或DI的编码 故串操作指令是隐含寻址方式 其它寻址方式2 I O端口寻址 直接端口寻址 以8位立即数方式在指令中直接给出 端口号范围0 255例如 INAL n间接端口寻址通过DX间接寻址 16位逻辑地址放在DX中 端口号范围0 65536例如 OUTDX AL 其它寻址方式33 2 2指令寻址方式 转移指令及调用指令8086 8088系统中 存储器采用分段结构 转移调用类指令有段内寻址和段间寻址 条件转移指令 只允许事先段内转移 且段内短转移 即转移地址范围为 128 127字节 由指令直接给出8位地址偏移量 无条件转移指令和调用指令 段内短转移 段内直接寻址 段内间接寻址 段间直接寻址 段间间接寻址 习题 1指出下列指令中操作数寻址方式MOVSI 100HLTAAAMOVCS 3202H MOVAX 1234HMOVAX BX MOVAX BUFF SI MOVBX SI BUFF MOVAL TABLE BX SI JMPSHORTNEXT 56 2设 BX 3158H SI 12A8H DS 2100H 并假定没有使用段前缀 即把DS作为操作数对应的段寄存器 并且内存单元情况如图所示 试分析下列程序执行后AX的内容 MOVAX 1000H MOVAX BX MOVAX SI MOVAX BX SI 100H 3 38088 8086CPU的指令系统 8086指令系统中 包含133条基本指令 与寻址方式结合 再加上不同的数据形式 可构成上千种指令 按功能指令可分为6类 数据传送类算数运算类逻辑运算和移位类串操作类控制转移类处理器控制类 3 3 1数据传送指令可完成寄存器与寄存器之间 寄存器与存储器之间 寄存器与I O之间的字或字节传送 特点 除SAHF和POPF不影响标志寄存器内容 共14条 分为4小类 通用数据传送 5条 标志位专用传送指令 4条 目标地址传送指令 3条 I O数据传送 2条 1通用数据传送指令 5条 字节或字传送 MOV目的 源字压入堆栈 PUSH源字弹出堆栈 POP目的字节或字交换 XCHG目的 源字节翻译 XLAT MOVd s 将源操作数S指定的内容送到目的d 源操作数 8 16位寄存器 存储器中的某个字节 字 或者8 16位立即数 目的操作数 8 16位寄存器 存储器中的某个字节 字 不能为立即数 MOV指令需注意问题 目的操作数不能是立即寻址方式 两个内存单元之间不能直接传送数据 立即数不能直接送段寄存器 两个段寄存器之间不允许直接传送数据 不允许给CS IP PSW三个寄存器传送数据 这3个寄存器的值用户无权改变 MOV指令可传送8位数据 也可传送16位数据 但源操作数和目的操作数必须字长相等 MOV指令不影响标志位 例1 8 16位立即数送累加器AL和AX的指令 MOVAX 0 AX清0 字传送MOVAL 12H AL 12H 字节传送例2 两个存储单元 SI 和 DI 之间传送数据 MOVAL SI MOV DI AL例3 CPU内部寄存器之间 除CS IP F外 实现数据的任意传送 MOVAH AL AH AL 字节传送MOVDS AX DS AX 字传送MOVSI BP SI BP 字传送 例4 CPU内部通用寄存器和存储器之间实现数据的任意传送 MOVAL BUFFER AL 内存单元BUFFER中字节内容MOVAX SI AX SI间接寻址指示的内存两单元字内容 MOV DI CX DI CX的内容例5 将数据段首地址DATA填入DS中 MOVAX DATA AX 数据段首地址DATAMOVDS AX DS AX MOV BX 2000H 12ABH其中 BX 1200H CS 1800H IP 0500H DS 3000H 如果把CPU内部的寄存器细分为段寄存器和寄存器的话 则MOV指令有九种形式 从寄存器到寄存器 从寄存器到段寄存器 从寄存器到存储器 从段寄存器到寄存器 从存储器到寄存器 从段寄存器到存储器 从存储器到段寄存器 从立即数到寄存器 从立即数到存储器 说明 寄存器寻址有直接 间接 相对 基址变址和相对基址变址五种存储器寻址方式 2 数据进栈指令PUSH及出栈指令POPPUSHs 将源操作数 16位 压入堆栈POPd 将堆栈中当前栈顶相邻单元数据字弹出到d特点 s和d可以是16位寄存器或存储器两相邻单元 堆栈按字操作 每执行一条入栈指令 堆栈地址指针SP减2 入栈的数据位于栈顶 高位字节先入栈 放在较高地址单元 低位字节后入栈 放在较低地址单元 先进先出原则 执行弹出指令时 过程相反 栈顶指针的值加2 CS段寄存器值可以入栈 但不能反过来弹出一个字到CS PUSH指令汇编格式 PUSH源操作数执行的操作 SP SP 2先修改指针 SP 1 SP 操作数功能 将16位寄存器 段寄存器 16位存储单元数据压入堆栈 POP指令汇编格式 POP目的操作数执行操作 操作数 SP 1 SP SP SP 2后修改指针功能 将堆栈中的16位数据送入16位寄存器 段寄存器 16位存储单元中 PUSHBX其中 CS 1000H IP 0030H SS 2000H SP 0040H BX 2340H指令编码格式与操作过程 例3 10 MOVAX 1234HPUSHAX设指令执行前 SS 2000H SP 00FEH 则指令执行过程如图3 15所示 执行后 SS 2000H SP 00FCH 图3 15压栈操作示意图 a 指令执行前情况 b 指令执行后情况 例 POPCX 其中 CS 1000H IP 0020H SS 1600H SP 004CH指令编码格式与操作过程 3 数据交换指令XCHGXCHGd s 将源操作数和目的操作数 字或字节 相互交换位置特点 可以在通用寄存器与累加器之间 通用寄存器之间 通用寄存器与存储器之间交换两个存储单元之间不能交换两个操作数都不能使用立即数所有的段寄存器和IP不能作为一个源或目的操作数 例如 XCHGAX SI 0400H 其中 CS 1000H IP 0064H DS 2000H SI 3000H AX 1234H物理地址 PA DS 16 SI 0400H 20000H 3000H 0400H 23400H 执行过程 将AX内容1234H 与23400H 23401H两单元的内容ABCDH互相交换位置 执行结果 AX ABCDH 23400H 34H 23401H 12H 例3 12 XCHGBX BP SI 指令执行前 BX 1234H BP 0100H SI 0020H SS 1F00H 1F120H 0000H 则源操作数物理地址 1F00H 10H 0100H 0020H 1F00H 10H 0120H 1F120H指令执行后 BX 0000H 1F120H 1234H 4 XLAT换码指令 查表指令 换码指令 XLAT 通过查表来完成代码转换 用于实现字节翻译功能的指令 将寄存器AL设定的一个字节数值变换为内存一段连续表格中的另一相应代码 以实现编码 地址的转换 对一些无规律的代码转换比较方便 使用指令前 BX寄存器指向表的首地址AL中存放待查的码 即某一项与表首址的距离 操作步骤 建立代码转换表 最大容量256字节 讲该表定位到内存中某个逻辑段的一片连续地址中 并将表首地址的偏移量置入BX MOVBX 0030H将待转换的一个十进制数在表中的序号送入AL中MOVAL 5执行XLAT命令XLAT 例如 十进制数0 9的七段显示码表 被定位在当前数据段中 其起始地址的偏移地址值为0030H 将AL中待转换的十进制5转换成相对应的七段码 CS 2000H IP 007AH DS 4000H P61例3 13 2 地址传送指令这组指令都是将地址送到指定的寄存器中 具体有三条 如表3 2所示 表3 2地址传送指令 装入有效地址 LEA目的 源装入DS寄存器 LDS目的 源装入ES寄存器 LES目的 源 1 LEA偏移地址送寄存器指令汇编格式 LEA16位寄存器名 存储器寻址方式执行的操作 16位寄存器 源操作数的偏移地址说明 用于指定源操作数 必须是M操作数 的16位偏移地址EA 传送到一个指定的16位通用寄存器中 通常用来建立串操作指令所需的寄存器指针 例3 14 LEABX TABLETABLE是数据段中定义的地址标号 指令执行前 如果 BX 0000H DS 2000H TABLE 20020H 则指令执行后 BX 0020H 例如 LEABX SI 100AH DS 2000H SI 0300H 2130AH 字数据为1234H 执行结果是BX LEAAX 0618H 将内存单元的偏移量0618H送给AX 指令执行后 AX中的内容为0618HLEASP 3768H 使堆栈指针SP为3768HLEABX BP DI 将内存单元的偏移量BP DI送给BX 执行指令后 BX中内容为BP DI的值 注意LEA和MOV指令区别 LEASI BUFFMOVSI BUFF LEASI BUFF 执行后 SI 0002H MOVSI BUFF 执行后 SI 0048H 2 指针送指定寄存器和DS寄存器指令LDSd s 取某变量的32位地址指针的指令从源操作数所指定的存储单元开始 由4个连续存储单元中取出某变量的地址指针 共4个字节 将前两个字节 偏移地址 传送到目标操作数所指定的16位通用寄存器中 后两字节 段地址 传送到DS寄存器中 例3 15 LDSAX TABLE SI 20050H 12345678H 指令执行前 AX 0000H DS 2000H TABLE 20020H SI 0030H执行结果 偏移地址EA SI 0020H 0050H物理地址PA DS 16 EA 20000H 0050H 20050H AX 5678H DS 1234H 例如 LDSSI DI 100AH DS 2000H DI 2400H 2340AH 80H 2340BH 01H 2340CH 30H 2340DH 22H 执行结果 物理地址PA DS 16 EA 20000H 2400H 100AH 2340AH将物理地址2340AH单元开始的4个字节中 前两个字节 偏移地址 0180H传送到SI寄存器中 后两个字节 段地址 2230H传送到DS寄存器中 并取代它的原值2000H 3 指针送指定寄存器和ES寄存器指令LESd s 取某变量的32位地址指针的指令从源操作数所指定的存储单元开始 由4个连续存储单元中取出某变量的地址指针 共4个字节 将前两个字节 偏移地址 传送到目标操作数所指定的16位通用寄存器中 后两字节 段地址 传送到ES寄存器中 例如 LESDI BX DS B000H BX 080AH B080AH A2H B080BH 05H B080CH 00H B080DH 40H 执行结果 物理地址PA DS 16 EA B0000H 080AH B080AH将物理地址B080AH单元开始的4个字节中 前两个字节 偏移地址 05A2装入DI寄存器中 后两个字节 段地址 4000H装入到ES寄存器中 即DI 05A2H ES 4000H 3标志位传送指令 4条 将FR低字节装入AH寄存器 LAHF将AH内容装入FR低字节 SAHF将FR内容压入堆栈 PUSHF从堆栈中弹出FR内容 POPF LAHF 将标志寄存器F的低字节传送到AH寄存器中通过AH对标志寄存器的SF ZF AF PF CF标志位复位 SAHF 将AH寄存器中传送到标志寄存器F的低字节通过AH对标志寄存器的SF ZF AF PF CF标志位置位 PUSHF 将16位标志寄存器F内容入栈保护POPF 将当前栈顶和次栈顶中的数据字弹出 送回到标志寄存器中经常成对出现 用在子程序和中断处理程序的首尾 用来保护和恢复主程序涉及的标志寄存器内容 必要时可用来修改标志寄存器内容 例3 11 若想设置TF 1 程序段如下 PUSHFPOPAXORAH 01H 修改TF位PUSHAXPOPF 8086 8088指令系统中没有设置改变TF标志位的指令 若要改变TF值 先用PUSHF指令将标志压栈 然后设法改变对应TF标志位的位值 再用POPF指令弹出送给PSW 即可完成改变PSW中TF标志位的值 4I O数据传送指令 2条 输入字节或字 IN累加器 端口输出字节或字 OUT端口 累加器特点 I O指令只能用累加器作为执行I O数据传送的机构 直接寻址I O指令 寻址范围0 255 间接寻址I O指令 寻址范围0 65535 I O设备地址两种形式 固定端口和可变端口 IN累加器 端口号 指定端口内容输入到累加器AL AX端口号可由8位立即数直接给出 也可由DX寄存器间接给出16位端口号 汇编格式 INAL I O口地址表达式INAX I O口地址表达式执行的操作 AL I O口地址表达式 AX I O口地址表达式 1 I O口地址表达式 例如 INAL 40HCS 1000H IP 0050H 8位端口40H中的内容为55H 指令执行结果 AL 55H OUT端口号 累加器 累加器AL AX中内容输出到指定端口端口号可由8位立即数直接给出 也可由DX寄存器间接给出16位端口号 汇编格式 OUT地址表达式 ALOUT地址表达式 AX执行的操作 I O口地址 AL I O口地址 1 I O口地址 AX 例如 OUTDX AL DX 6A10H AL 66H执行结果 将累加器AL中的数据字节66H 输出到DX指定的端口6A10H中 练习 判断指令对错 并说明原因 MOVBX AL INAL BX MOVCS 3202H MOV BP BP 2 XCHGAX 1234H MOVDS 1234H MOVAX CX LEAAX 1234H 3 3 2算术运算指令无符号 有符号 8 16位二进制数运算 加减乘除有符号8 16位二进制数扩展 符号扩展指令无符号压缩型 非压缩型十进制运算 十进制调整根据运算结果影响状态标志 有时要利用某些标志才能得到正确的结果 使用时请留心有关状态标志 共20条 分为6小类 加法 3条 减法 5条 乘法 2条 除法 2条 符号扩展 2条 十进制调整 6条 算数运算类 1 加法 表示运算结果不影响标志位 表示运算结果影响标志位 ADDd s d d s功能 源操作数和目的操作数相加 结果送到目的操作数 源操作数 8 16位通用寄存器 存储器 立即数目的操作数 8 16位通用寄存器 存储器提示 目的操作数不能为立即数 源操作数和目的操作数不能同时为存储器 例1 ADD BX 106BH 1234H设 DS 2000H BX 1200H 2226BH 44H 2226CH 33H 执行结果 EA BX 106BH 226BHPA DS 16 EA 2226BH将立即数1234H 与存储器2226BH和2226CH中的3344H相加 和为4578H 结果保留在目的地址2226BH和2226CH单元中 运算结果影响标志位 例2 寄存器加法若要求将AX BX CX和DX内容累加 再将所得的16位的和数存入AX 例3 立即数加法 常数和立即数相加时 若将立即数12H取入DL 然后用立即数加法指令再34H加到DL中的12H上 所得到的结果放在DL 例4 存储器与存储器的加法 将存储器在数据段中 偏移地址为NUMB和NUMB 1连续单元的字节数据累加到AL 程序为 MOVDI OFFSETNUMB 偏移地址NUMB装入DIMOVAL 0 AL清零ADDAL 0 CF清零ADDAL DI 将NUMB单元的字节加上AL 和数存ALADDAL DI 1 累加NUMB 1单元中的字节内 容 累加结果存放在AL 例5 数组加法 存储器数组是一个按顺序排列的数据表假定数据数组 ARRAY 包括从元素0到9共10个字节数 现要求累加元素3 元素5和元素7 程序为 MOVAL 0 存放和数的AL清0MOVSI 3 将元素3的位移量给SIADDAL ARRAY SI AL 等于元素3ADDAL ARRAY SI 2 加元素5ADDAL ARRAY SI 4 加元素7 ADCd s d d s CF功能 源操作数和目的操作数相加外 再加上进位标志CF 结果送到目的操作数 CF将重新根据结果置成新的状态 ADC指令一般用在16位以上的多字节数字相加 例如 ADCAX BX AX AX BX CFADCBX BP 2 由BP 2寻址的堆栈段存储单元的字 内容 加上BX和进位位 结果存入BX 例1 假定实现BX与AX中4字节数据 与DX和CX中4字节数据相加 其结果存入BX和AX中 程序 ADDAX CX AX AX CXADCBX DX BX BX DX CF 例3 16 完成双字长相加 被加数存放在DX与AX中 加数放在BX与CX中 和放在DX与AX中 程序段如下 ADDAX CXADCDX BX 高位运算时要考虑低位的进位 INCd d d 1功能 将目的操作数当做无符号数 加1后 结果送到目的操作数 目的操作数 8 16位通用寄存器 存储器 但不允许为立即数 间接寻址存储器单元加1时 数据长度需用伪指令说明 INC指令只影响OF SF ZF AF PF5个标志 不影响CF 循环程序中 常用该指令对地址指针和循环计数值进行修改 例如 INCSP SP SP 1INCBYTEPTR BX 1000H 将数据段中由BX 1000H寻址 的内存单元的字节内容加1INCWORDPRT SI 将数据段中由SI寻址的存储单元 的字内容加1INCDATA1 将数据段中DATA存储单元的内容加1 2 减法指令减法指令包括五条指令 表示运算结果不影响标志位 表示运算结果影响标志位 SUBd s d d s功能 目的操作数减去源操作数 结果送到目的操作数 源操作数 8 16位通用寄存器 存储器 立即数目的操作数 8 16位通用寄存器 存储器提示 目的操作数不能为立即数 源操作数和目的操作数不能同时为存储器 不允许进行段寄存器减法 例1 SUBAX BX 设 DS 2000H BX 970EH 2970EH FFH 2970FH 00H AX 8811H 执行结果 EA BX 970EHPA DS 16 EA 2970EH将AX寄存器中的目的操作数8811H 减去存储器单元2970EH和2970FH中的源操作数00FFH相减 结果8712H送回AX 运算结果影响标志位 SBBd s d d s CF功能 目的操作数减去源操作数以外 再减去进位标志CF 结果送到目的操作数 CF将重新根据结果置成新的状态 SBB指令一般用于16位以上的多字节数字相减 例如 SBBAX BX AX AX BX CFSBBWORDPTR DI 50A0H 由DI寻址的数据段存储单 元的字内容 减去50A0H 及CF值 例1 假定实现BX与AX中4字节数据 与存于DX和CX中4字节数据相减 其结果存入BX和AX中 程序 SUBAX CX AX AX CXSBBBX DX BX BX DX CF 例3 17 完成双字长相减操作 被减数存放在DX与AX中 减数存放在BX与CX中 差放在DX和AX中 程序段如下 SUBAX CXSBBDX BX DECd d d 1功能 将目的操作数当做无符号数 减1后 结果送到目的操作数 目的操作数 8 16位通用寄存器 存储器 但不允许为立即数 间接寻址存储器单元减1时 数据长度需用TYPEPTR类型伪指令标志 DEC指令只影响OF SF ZF AF PF5个标志 不影响CF 循环程序中 常用该指令对地址指针和循环计数值进行修改 例如 DECBL BL BL 1DECCX CX CX 1DECBYTEPTR DI 将由DI寻址的数据段中 字节 存储单元的内容减1DECWORDPRT BP 将由BP寻址的堆栈段存储单元 的字内容加1 NEGd d d反 1 求补码指令NEGd d 0 d 如果d为正数 则是取负指令功能 将目的操作数取负后 结果送到目的操作数 目的操作数 8 16位通用寄存器 存储器 但不允许为立即数 NEG指令对标志的影响与用0做为被减数的SUB指令一样 CF OF 例1 NEGBYTEPTR BX 设 DS 2000H BX 3000H 23000H FDHEA BX 3000HPA DS 16 EA 23000H假设23000H存储单元内容为字节变量FDH即FDH 3 补则 3被送回物理地址23000H单元中 CMPd s d s 只置标志位功能 目的操作数减去源操作数 不送回结果 只根据运算结果置标志位 源操作数 8 16位通用寄存器 存储器 立即数目的操作数 8 16位通用寄存器 存储器提示 目的操作数不能为立即数 源操作数和目的操作数不能同时为存储器 不允许进行段寄存器比较 例2要将CL的内容与64H作比较 当CL大于等于64H时 程序转向存储器地址SUBER处继续执行 程序为 CMPCL 64H CL与64H作比较JAESUBER 如果等于或大于则跳转 例3用比较指令判断两个数大小无符号数 根据借位标志CF判断 ZF 1 d s ZF 0 d sCF 0 表示无借位 即d s CF 1 表示有借位 即d s 有符号数 根据溢出标志OF和符号标志SF两者的异或运算结果来判断 OF SF 0 表示d s OF SF 1 表示d s 通常 比较指令后面跟一条条件转移指令 检查标志位的状态决定程序的转向 3 乘法指令 表示标志位为任意值 表示运算结果影响标志位 MULs 无符号数乘法指令功能 完成两个无符号的8 16位二进制数相乘被乘数 隐含在累加器AL AX中乘数 指令中由s指定的源操作数 8 16位通用寄存器或存储器操作数 积 相乘后得到双倍长的积8位二进制乘法 其16位积的高8位存于AH 低8位存于AL 16位二进制乘法 其32位积的高16位存于DX 低16位存于AX 利用CF和OF标志可判断相乘结果的高位字节或高位字是否有效 高位字节或高位字有效 即AH 0或DX 0 则将CF和OF两标志位同时置1高位字节或高位字无效 即AH 0或DX 0 则将CF和OF两标志同时置0 例1 MULBYTEPTR BX 2AH 设 DS 2000H BX 0234H AX 5512H 源操作数定义为字节变量66H EA BX 2AH 025EHPA DS 16 EA 2025EH乘数 66H被乘数 12H乘积 12H 66H 072CH 放在AX里面 AH 0 故CF 1 OF 1 其余标志为任意状态 IMULsrc 有符号乘法指令功能 完成两个带符号的8 16位二进制数相乘 IMUL指令除计算对象为带符号二进制数以外 其它都与MUL一样的 但结果不同 IMUL指令对OF和CF影响 若乘积的高一半是低一半的符号扩展 则OF CF 0 否则均为1 例1 IMULCL AX AL CL IMULCX DX AX AX CX IMULBYTEPTR BX AX AX BX 即AL中的 和BX所指内存单元中的两个8位有符号 数相乘 结果送AX中 IMULWORDPTR DI DX AX AX DI 即AX中的 和DI和DI 1所指内存单元中的两个16位 有符号数相乘 结果送DX和AX中 4 除法指令 表示标志位为任意值 DIVs 无符号数除法指令功能 完成两个无符号二进制数相除 被除数 隐含在累加器AX 字节除 或DX AX 字除 中除数 指令中由s指定的源操作数8 16位通用寄存器或存储器操作数商 字节除法 商存于AL中 余数存于AH中字除法 商存于AX中 余数存于DX中余数 根据8086约定 余数符号应与被除数符号一致 若运算所得商数超过累加器容量 则系统将其当做除数为0处理 自动产生类型0中断 CPU将转去执行类型0中断服务程序作适当处理 此时所得商和余数均无效 类型0中断处理时 先将标志位进堆栈 IF和TF清零 接着CS和IP的内容进堆栈然后将0 1单元内容填入IP 2 3单元内容填入CS 最后 再进入0号中断的处理程序 例1 DIVBYTEPTR BX SI 设 DS 3000H BX 2000H SI 050EH AX 1500H DX 3300H存储器中的源操作数定义为字节变量22H EA BX SI 2000H 050EH 250EHPA DS 16 EA 3250EH被除数 1500H除数 22H商 AL 9EH余数 AH 04H IDIVs 有符号数除法指令功能 完成两个带符号二进制数相除 与DIV指令主要区别 对符号位处理的约定 如果源操作数是字节 字数据 被除数应为字 双字数据 并隐含在累加器AX 字节除 或DX AX 字除 中如果被除数也是字节 字数据在AL AX中 应将AL AX的符号位 AL7 AX15 扩展到AH DX AX中 才能开始字节 字除法 例1 IDIVBX 将DX和AX中的32位数 除以BX中的 16位数 所得的商在AX中 余数在DX中 IDIVBYTEPTR SI 将AX中的16位数 除以SI所指内存单元 的8位数 所得的商在AL中 余数在AH中 5 符号扩展指令 表示运算结果不影响标志位 CBW和CWD是两条专门为算术运算指令设置的符号扩展指令 符号扩展是指用一个操作数的符号位 最高位 形成另一个操作数 后一个操作数的高位全是0 正数 或全1 负数 符号扩展虽然使数据位数加长 但数据大小没有改变 扩展的高部分仅是低部分的符号扩展 符号扩展指令有两条 用来将字节转换成字 字转换成双字 CBW AL符号扩展成AXCWD AX符号扩展成DX MOVAL 64H AL 64H 机器数 表示 10进制数100 真值 CBW 将符号0扩展 AX 0064H 仍然表示100MOVAX 0FF00H AX FF00H 表示有符号数 10进制数 256CWD 将符号位 1 扩展 DX AX FFFFFF00H 仍然表示 256 例如 在B1 B2 B3字节型变量中 分别存有8位带符号数a b c 实现 a b c a运算 程序如下 MOVAL B1 AL aIMULB2 实现 AX a bMOVCX AX CX AX MOVAL B3 AL cCBW 扩展符号位至AH中ADDAX CX AX AX CX 完成a b cIDIVB1 完成 a b c a 商给AL 余数给AH 例3 20 使NUMB字节存储单元的内容除以NUMB1字节存储单元的内容 将商存于ANSQ字节单元中 余数存于ANSR字节单元中 程序段如下 MOVAL NUMBCBWDIVNUMB1MOVANSQ ALMOVANSR AH 6 十进制调整指令计算机不但能进行二进制运算 还能进行十进制运算 进行十进制运算时 首先将十进制数据编码为BCD码 然后用前面介绍的二进制算术运算指令进行运算 之后再进行十进制调整 即可得正确的十进制结果 真值 十进制 864二进制编

温馨提示

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

评论

0/150

提交评论