




已阅读5页,还剩145页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
指令是计算机用以控制各个部件协调工作的命令 指令系统是微处理器所能执行的指令的集合 它与微处理器有密切的联系 不同的微处理器有不同的指令系统 第3章指令系统 3 18086指令系统概述 计算机的工作就是运行程序 而程序由存储在存储器中的指令序列构成 微处理器高效软件的发展要求对每条指令的寻址方式 AddressingMode 都要相当地熟悉 机器语言指令由二进制代码组成 指令语句一般由操作码 OperatingCode 和操作数 OperatingData 两部分组成 汇编语言助记符指令书写的基本格式为 标号 操作码 操作数 注释 其中 操作码是指令语句中不可缺少的 带括号的项是可选项 如果有此项时 不能加括号 多个操作数间是以 隔开的 操作码与操作数之间必须以空格分开 助记符指令格式 操作码由便于记忆的助记符表示 通常为英文单词缩写 操作码表示计算机执行什么操作 操作数可能指明了参与操作的数本身 或规定了操作数的地址 8086 8088系统中一条指令的操作数可以是双操作数 源操作数和目的操作数 也可以是单操作数 有的指令还可以没有操作数或隐含操作数 而80386 80486系统中的指令则有多个操作数 操作数主要分为三类 立即数操作数立即数即常数 是一个固定数值的操作数 寄存器操作数寄存器操作数存放在CPU的某个寄存器中 存储器操作数存储器操作数则存放在内存的数据区中 3 2寻址方式 通过指令采用合适的方式指定操作数的地址 寻找操作数所在地址的方法称为寻址方式 在80X86系统中 寻址方式通常分为两种 一种为寻找操作数的地址 称为数据寻址 另一种为寻找要执行的下一条指令的地址 即程序转移或子程序调用时的目的地址或入口地址 称为程序转移地址寻址 3 2 1数据的寻址方式 本节中寻址方式一般针对源操作数而言 以通用传送指令为例MOVDST SRCSRC为源操作数 指令执行过程中原值保持不变 DST为目的操作数 原值不保留 MOV指令完成从源操作数向目的操作数拷贝数据的功能 3 2 1数据的寻址方式 1 立即寻址 ImmediateAddressing 操作数包含在指令码中 由指令给出 汇编语言可用多种方式描述立即数 立即操作数可以是常数 如果操作数以字母开头 汇编程序要求操作数在其前加0 立即寻址通常用于给寄存器赋值 并且只适用于源操作数字段 不能用于目的操作数字段 要求源操作数与目的操作数长度一致 MOVAL 100指令执行后 AL 64HMOVCL 01001100B指令执行后 CL 4CHMOVAX 1234H指令执行后 AX 1234H 3 2 1数据的寻址方式 立即数如果是多字节数 则高位字节存放在高地址中 低位字节存放在低地址中 3 2 1数据的寻址方式 3 2 1数据的寻址方式 3 2 1数据的寻址方式 2 寄存器寻址 RegisterAddressing 寄存器寻址是一种最普遍的数据寻址方式 指令指定寄存器号 操作数存放在指令规定的CPU内部寄存器中 可用于寄存器寻址的为通用寄存器 寄存器寻址不需要访问存储器 也不需要使用总线周期 操作在CPU内部进行 因而可取得较高的运算速度 MOVAX BX指令执行前 AX 5678H BX 1234H 指令执行后 AX 1234H BX 1234H 除上述两种寻址方式外 以下各种寻址方式的操作数均在代码段以外的存储区中 寻址方式通过不同的途径求得操作数的偏移地址 即有效地址EA EffectiveAddress 3 2 1数据的寻址方式 3 2 1数据的寻址方式 3 直接寻址 DirectAddressing 直接寻址由指令直接给出操作数的有效地址EA 操作数本身在存储单元中 通常存放在数据段 默认的段寄存器为DS 操作数有效地址格式为 数值 或符号或 符号 MOVAX 2040H 执行结果为 AX 6A4BH注意 本指令不是将立即数2040H传送到AX 而是将有效地址是2040H的存储单元的内容传送到AX 3 2 1数据的寻址方式 汇编语言指令中可以用符号地址代替数值地址 MOVAX TABLE 或MOVAX TABLE 这两者等价 此处TABLE为存放操作数单元的符号地址 如果要对其他段寄存器所指出的存储区进行直接寻址 则在指令前必须用前缀指出段寄存器名 MOVAX ES 2000H 将ES段的2000H和2001H两单元的内容传送到AX 3 2 1数据的寻址方式 3 2 1数据的寻址方式 4 寄存器间接寻址 RegisterIndirectAddressing 操作数的有效地址存放在基址寄存器或变址寄存器中 而操作数则在存储器中 对16位数进行寄存器间接寻址时可用的寄存器是基址寄存器BX BP和变址寄存器SI DI 使用BP时默认的段寄存器为SS 使用其他寄存器默认的段寄存器为DS 操作数有效地址格式为 间接寻址的寄存器 寻址寄存器放在方括号中 MOVBX BP 指令执行前 BP 4000H 执行结果为 BX 50A0H 3 2 1数据的寻址方式 3 2 1数据的寻址方式 寄存器间接寻址方式可用于表格处理 执行完一条指令后 只需修改寄存器的内容就可以取出表格中的下一项 3 2 1数据的寻址方式 5 寄存器相对寻址 RegisterRelativeAddressing 操作数的有效地址为指令中规定的间接寻址寄存器的内容和指令中指定的位移量之和 操作数存放在存储器中 操作数有效地址格式为位移量 间接寻址的寄存器 或 位移量 间接寻址的寄存器 MOVAX TAB SI 如果TAB为16位的符号地址 其值为3080H SI 2000H 默认的段寄存器为DS 则EA TAB SI 3080H 2000H 5080H 3 2 1数据的寻址方式 寄存器相对寻址可用于表格处理或访问一维数组中的元素 把表格的首地址设置为位移量 利用修改间接寄存器的值来存取表格中的任意一个元素 3 2 1数据的寻址方式 3 2 1数据的寻址方式 6 基址变址寻址 BasedIndexedAddressing 操作数的有效地址是一个基址寄存器和变址寄存器的内容之和 操作数本身在存储单元中 操作数有效地址格式为 基址寄存器 变址寄存器 MOVAX BX SI 如果 BX 0200H SI 0010H DS 3000H 则EA BX SI 0200H 0010H 0210H物理地址 DS 10H EA 3000H 10H 0210H 30210H若30210H和30211H中分别存放的数值为56H 78H 则指令执行结果 AX 7856H 3 2 1数据的寻址方式 基址变址寻址同样适用于数组或表格处理 首地址存放在基址寄存器中 变址寄存器访问数组中各元素 因两个寄存器都可以修改 所以它比寄存器相对寻址方式更灵活 需要注意的是 两个寄存器不能均为基址寄存器 也不能均为变址寄存器 3 2 1数据的寻址方式 7 基址变址相对寻址 RelativeBasedIndexedAddressing 操作数的有效地址为指令中规定的1个基址寄存器和1个变址寄存器的内容及指令中指定的位移量三者之和 位移量 基址寄存器 变址寄存器 可以表示成多种形式组合 寻址寄存器要放在方括号中 3 2 1数据的寻址方式 MOVAX TAB BX SI BX 1000H SI 2000H TAB 0150H则EA BX SI TAB 3150H执行结果 AX 1234H 3 2 1数据的寻址方式 3 2 1数据的寻址方式 基址变址相对寻址通常用于对二维数组的访问 位移量为数组起始地址 基址寄存器和变址寄存器分别存放行和列的值 利用相对基址变址寻址就可以直接访问二维数组中指定的某个元素 3 2 1数据的寻址方式 8 隐含寻址 ConcealedAddressing 有些指令的指令码中不包含指明操作数地址的部分 而其操作码本身隐含地指明了操作数的地址 如 LODSB 表示SI的内容送到AL SI指针加1 该指令将在后面串操作指令部分详细介绍 3 2 1数据的寻址方式 9 I O端口寻址I O端口寻址就是寻找输入输出设备的端口地址对I O端口的寻址有以下两种方式 1 直接端口寻址方式端口地址用8位地址码表示 INAL AXorEAX port8 OUTport8 AL AXorEAX 如 INAL 21H 表示从I O地址为21H的端口中读取数据到AL中 3 2 1数据的寻址方式 2 间接端口寻址方式端口地址为16位 并规定存放在寄存器DX中 格式如下 INAL AXorEAX DX OUTDX AL AXorEAX 如 INAL DX 这条指令表示从DX寄存器内容所指定的端口中读取数据到AL中 3 2 1数据的寻址方式 3 2 2程序转移地址寻址方式 CPU执行指令时 指令是按顺序存放在存储器中的 而程序执行顺序是由CS和IP的内容来决定的 当程序执行到某一转移或调用指令时 需脱离程序的正常顺序执行 而把它转移到指定的指令地址 程序转移及调用指令通过改变IP和CS内容 就可改变程序执行顺序 根据程序转移地址相对于当前程序地址的关系 可分为段内 段外 又根据转移地址是否直接出现在指令中 分为直接 间接 所以有四种程序转移寻址方式 段内直接寻址 段内间接寻址 段间直接寻址及段间间接寻址 3 2 2程序转移地址寻址方式 1 段内直接寻址 IntrasegmentDirectAddressing 段内直接寻址方式也称为相对寻址方式 指令码中包括一个位移量disp 转移的有效地址为 EA IP disp 当位移量是8位时 称为短程转移 当位移量是16位时 称为近程转移 JMPNEARPTR符号地址JMPSHORT符号地址 3 2 2程序转移地址寻址方式 2 段内间接寻址 IntrasegmentIndirectAddressing 程序转移的有效地址是一个寄存器或存储单元的内容 所得到的转向的有效地址用来取代IP寄存器的内容 JMP寄存器JMP存储单元由于以上两种寻址方式仅修改IP的内容 所以这种寻址方式只能在段内进行程序转移 3 2 2程序转移地址寻址方式 JMPBX如果 BX 1020H 则指令执行后 IP 1020HJMPTABLE BX SI 如果 DS 2000H BX 1020H SI 0002H TABLE 0010H 21032H 1234H 则指令执行后 IP DS 10H BX SI TABLE 2000H 10H 1020H 0002H 0010H 21032H 1234H 3 2 2程序转移地址寻址方式 3 段间直接寻址 IntersegmentDirectAddressing 指令中直接给出程序转移的代码段地址和偏移地址来取代当前的CS和IP 指令的汇编语言格式为JMPFARPTR符号地址 FARPTR表示段间转移的操作符 3 2 2程序转移地址寻址方式 4 段间间接寻址 IntersegmentIndirectAddressing 程序转移的有效地址是一个存储单元中连续4个字节的内容 这个存储单元的内容可以用数据寻址方式中除立即数和寄存器方式以外的任何一种寻址方式获得 将所寻址的存储单元前2个字节内容送IP 后2个字节内容送CS 指令的汇编语言格式为JMPDWORDPTR存储单元 3 2 2程序转移地址寻址方式 JMPDWORDPTR BX 如果 BX 1034H 且从1034H开始的连续4个存储单元内容分别为12H 34H 56H 78H 则指令执行后 IP 1234H CS 5678H 3 2 2程序转移地址寻址方式 3 38086指令系统 指令系统是指微处理器所能执行全部指令的集合 不同微处理器具有不同的指令系统 这在微处理器设计时就已决定了 80X86系列的CPU中 其指令系统的机器代码是完全向上兼容的 80X86指令系统按功能可分为以下9类 1 数据传送类指令 2 算术运算类指令 3 逻辑运算和移位类指令 4 位操作指令 5 串操作指令 6 控制转移类指令 7 处理器控制指令 8 高级语言类指令 9 操作系统型指令 3 38086指令系统 常用到的一些符号所表示的含义 src源操作数dst目的操作数data立即数disp8位或16位位移量 存储单元的内容mem存储器操作数opr表示操作数reg寄存器count移位次数 可以是1或CL 3 38086指令系统 3 3 1数据传送类指令 数据传送类指令用于实现立即数到寄存器或存储器 CPU内部寄存器之间 寄存器与存储器之间 累加器与I O口之间的数据传送 除标志位传送指令之外 数据传送类指令不会影响标志寄存器中的标志位 这类指令又分为通用数据传送 地址传送 标志传送和输入输出等4组指令 1 通用数据传送指令通用数据传送指令包括最基本的传送指令 堆栈指令 数据交换指令 换码指令 1 数据传送指令基本的传送指令包括MOV MOVSX MOVZX 其中MOVSX MOVZX仅在386及其后继机型中可用 3 3 1数据传送类指令 传送指令 move MOV指令格式 MOVDST SRC指令功能 将源操作数SRC的内容传送到目的操作数DST所指单元 完成字节 字或双字传送 源操作数可以是通用寄存器 REGn 段寄存器 SEG 立即数 DATAn 和存储单元 MEMn 目的操作数可以是REGn SEG和MEMn 存储单元可通过数据寻址的各种寻址方式寻址 3 3 1数据传送类指令 在使用MOV指令时应注意以下几点 1 目的操作数不得为立即数 如 MOV12H BL为非法指令 2 不影响标志位 3 操作数类型必须一致 如 MOVAX BL为非法指令 应为MOVAL BL 4 源操作数为非立即数时 两操作数之一必为寄存器 如 MOV DX SI 为非法指令 不能在两个存储单元之间进行数据传送 3 3 1数据传送类指令 5 目的操作数为段寄存器 CS和IP或EIP不能作为目的寄存器 源操作数不得为立即数 6 不能在段寄存器之间进行直接数据传送 如 MOVDS ES为非法指令 3 3 1数据传送类指令 几个不能传送操作的解决办法是通过AX作桥梁 存储器 存储器 MOVAX MEM1MOVMEM2 AX段寄存器 段寄存器 MOVAX SEG1MOVSEG2 AX段寄存器 立即数 MOVAX DATAMOVSEG AX 3 3 1数据传送类指令 2 堆栈操作指令堆栈指令包括压栈PUSH和出栈POP指令 堆栈是按 后进先出 LIFO 方式工作的存储区域 规定由SS指示堆栈段的段基址 堆栈指针 E SP始终指向堆栈的顶部 E SP的初值规定了所用堆栈区的大小 堆栈的最高地址叫栈底 进栈方向是由高地址向低地址发展 3 3 1数据传送类指令 压入堆栈指令指令格式 PUSHsrc指令功能 SP SP 2 SP 1 SP src 指令中的操作数可以是通用寄存器 段寄存器 存储器 但不能是立即数 例如 PUSHAX SP SP 2 SP 1 AH SP AL 3 3 1数据传送类指令 弹出堆栈指令指令格式 POPdst指令功能 dst SP 1 SP SP SP 2 操作数可以是通用寄存器 存储器 段寄存器 但不能是CS 同样 不能是立即数 POPBX BH SP 1 BL SP SP SP 2注意 堆栈指令中操作数一定是16位操作数 3 3 1数据传送类指令 例 PUSHAX如果 AX 1234H SP 0100H 则指令执行后 SP 00FEH 3 3 1数据传送类指令 例 POPAX 3 3 1数据传送类指令 例 如果将AX BX两个寄存器的内容互换 则可执行下列程序段实现 PUSHAXPUSHBXPOPAXPOPBX 3 3 1数据传送类指令 3 数据交换指令指令格式 XCHGDST SRC指令功能 将两个操作数的内容相互交换 两操作数之一必为寄存器 操作数不能为立即数 两个操作数可以同时为寄存器 但不允许同时都为段寄存器 该指令执行后不影响标志位 例如 XCHGAH BLXCHGES AXXCHGEAX ARRAY 4 EBX 3 3 1数据传送类指令 4 换码指令指令格式 XLAT指令功能 用查表方式将一种代码转换成另一种代码 如将字符的扫描码转换为ASCII码 该类指令是隐含寻址 规定BX指向存放在内存表格的首地址 AL为表格中某一元素与表格首地址之间的偏移量 表格中的内容即为要替换的代码 指令执行后在AL中得到转换后的代码 3 3 1数据传送类指令 例3 1有一个表存放数字0 9的ASCII码 其表首地址是0100H 找出7的ASCII码 MOVBX 0100H 0100 BXMOVAL 7 7 ALXLAT BX AL AL 3 3 1数据传送类指令 2 地址传送指令1 有效地址传送指令 LEA loadeffectiveaddress 指令格式 LEAREG SRC REG SRC指令功能 将源操作数的有效地址EA传送到指定寄存器中 源操作数的寻址方式只能是存储器寻址方式 即不允许是立即数和寄存器寻址方式 目的操作数的寄存器可使用16位或32位寄存器 但不能为段寄存器 3 3 1数据传送类指令 例 比较以下两条指令的执行结果 LEABX DI MOVBX DI 3 3 1数据传送类指令 2 指针传送指令LDS loadDSwithpointer 指令格式 LDSREG MEM REG MEM DS MEM 2 指令功能 将源操作数MEM所指定存储单元中连续4个单元的前两个单元的内容作为有效地址存入指令指定的16位寄存器 REG 中 后两个单元的内容装入指令指定的段寄存器 DS 中 3 3 1数据传送类指令 例 LDSBX TABLE SI 如果指令执行前 TABLE 0200H SI 0008H DS 0000H 则EA TABLE SI 0200H 0008H 0208H 指令执行后 DS 1000H BX 1234H 3 3 1数据传送类指令 3 地址指针装入ES指令指令格式 LESreg mere指令功能 与LDS指令功能类似 只是把DS换成ES 操作时将段地址传送到ES段寄存器 需要注意的是 LDS LES两条指令都是传送一个目的地址指针 包括一个偏移地址和一个段地址 共32位数据 3 3 1数据传送类指令 3 标志传送指令1 标志送AH loadAHwithflags LAHF指令格式 LAHF AH FLAGS的低字节 指令功能 将标志寄存器FLAGS的低8位中5个状态标志位 不包括OF 分别传送到AH的对应位 如图所示 该指令的执行不影响标志位 2 AH送标志寄存器 storeAHintoflags SAHF指令格式 SAHF FLAGS的低字节 AH 指令功能 SAHF指令与LAHF指令功能相反 即将AH中相应位 D7 D6 D4 D2 D0 的状态分别传送到标志寄存器FLAGS的对应位 SF ZF AF PF CF 而FLAGS其他位不受影响 3 3 1数据传送类指令 3 标志进出栈指令PUSHF pushtheflags POPF poptheflags 指令功能 将FLAGS标志寄存器中内容压入堆栈 从堆栈中弹出字FLAGS标志寄存器中 3 3 1数据传送类指令 3 3 2算术运算类指令 80X86提供了加 减 乘 除等各类算术运算指令 这些指令可处理4种类型的数据 有符号的二进制数 无符号的二进制数 无符号的压缩十进制数 压缩BCD码 和无符号非压缩十进制数 非压缩BCD码 压缩型BCD码一个字节表示两位BCD码 非压缩型BCD码一个字节表示一位BCD码 有效位在低4位 高4位为零 1 加减法指令不带进 借 位的加减法指令ADD SUB 带进 借 位的加减法指令ADC SUB 增减量指令INC DEC 特殊减法指令即求补指令NEG 比较指令CMP 3 3 2算术运算类指令 1 ADD SUB 加 减法指令 addition subtraction 指令格式 ADDDST SRC SUBDST SRC指令功能 ADD指令将目的操作数与源操作数相加之和送到目的操作数所指单元中 SUB指令将目的操作数与源操作数相减之差送到目的操作数所指单元中 指令会影响SF ZF CF AF PF和OF等6个标志位 3 3 2算术运算类指令 指令中源操作数可以是通用寄存器REGn 立即数DATAn和存储单元MEMn 目的操作数可以是REGn和MEMn 源操作数和目的操作数都不能是段寄存器 目的操作数不得为立即数 存储单元可通过数据寻址的各种寻址方式寻址 使用加 减法指令时 应注意源操作数为非立即数时 两操作数之一必为寄存器 两存储单元之间不能进行加 减法运算 两操作数类型必须一致 可以同时为字节 字或双字 3 3 2算术运算类指令 例如 ADDAX DI AX AX DI SUBBL 5FH BL BL 5FH 下边3条指令是非法的ADDDS BX 操作数不允许为段寄存器SUB DI BP 不允许两操作数都为存储单元ADD34H EAX 目的操作数不能为立即数 3 3 2算术运算类指令 2 ADC SBB 带进 借位加 减法指令 additionwithcarry subtractionwithcarry 指令格式 ADCDST SRC SBBDST SRC指令功能 将进 借位标志位的值 CF 一起与操作数相加 减 该组指令主要针对出现在8086中超过16位的数据进行多字节加 减法的运算中 其中CF的当前值是由程序中本指令之前的指令产生的 其他规定均与ADD SUB指令相同 3 3 2算术运算类指令 3 INC DEC 增减量指令 increment decrement 指令格式 INCDST DECDST指令功能 INC DEC将目的操作数的内容加 减1 用于循环程序中指针修改 该组指令影响OF SF ZF AF DF标志位 但不影响CF位 目的操作数可以是REGn和MEMn 目的操作数不能是段寄存器 不得为立即数 3 3 2算术运算类指令 4 求补指令 negate NEG指令格式 NEGDST指令功能 对一个操作数取补码 即相当于用0减去目的操作数 并将结果送回到目的操作数 可利用NEG指令得到补码表示的负数的绝对值 3 3 2算术运算类指令 5 比较指令 compare CMP指令格式 CMPDST SRC指令功能 将两个操作数相减 但不将结果送回到目的操作数 两个操作数的内容均不变 仅根据结果影响标志位 CMP指令对标志位的影响与SUB相同 目标操作数可以是寄存器或存储器 源操作数可以是立即数 寄存器或存储器 既可以进行字节比较 也可以进行字比较 一般情况下 该指令后面都会有一条条件转移指令 用来检查标志位的状态是否满足某种关系 3 3 2算术运算类指令 比较指令后面常常会跟一个跳转指令 以检测标志位 控制程序的走向 CMP指令执行后可根据标志位判断比较结果 1 根据ZF判断两个数是否相等 若ZF 1 则两数相等 2 若两个数不相等 则分两种情况考虑 比较的是两个无符号数 若CF 0 则 DST SRC 若CF 1 则 DST SRC 比较的是两个有符号数 若OF SF 0 则 DST SRC 若OF SF 1 则 DST SRC 3 3 2算术运算类指令 2 乘法指令乘法指令有单操作数的无符号数乘法指令MUL和有符号数乘法指令IMUL指令 386及其后继机型中还增加了双操作数和三操作数有符号数乘法指令IMUL指令 3 3 2算术运算类指令 1 无符号数乘法指令 multiple MUL指令格式 MULSRC指令功能 将目的操作数乘以源操作数 结果存放到目的操作数中 目的操作数是隐含寻址 必须为累加器 源操作数用于存放乘数 可以是寄存器或存储器中的数据 但不允许为立即数 乘法指令执行完后的结果总是一个两倍于原数据大小的数据 当两个8位数相乘时 16位乘积存放在AX中 当两个16位数相乘时 32位乘积存放在DX AX中 其中高位字存放在DX中 低位字存放在AX中 3 3 2算术运算类指令 当乘法指令执行完后 一些标志位 CF和OF 会改变 产生预期的结果 其他的标志位也会改变 不过它们的结果是无法预知的 因而不能被利用 CF OF表示乘积值的范围 对于无符号数 若CF OF 0 则表示AH 字节乘 DX 字乘 乘积值高位为零 3 3 2算术运算类指令 2 有符号数乘法指令 signedmultiple IMUL指令格式 IMULSRC指令功能 与MUL相同 只是必须是有符号数 对于有符号数 IMUL执行后 CF OF 0 AH 字节乘 DX 字乘 乘积值高位为符号扩展 若CF OF 1 则积的高位存在其有效值 3 3 2算术运算类指令 3 除法指令除法指令有无符号数除法指令DIV和有符号数除法指令IDIV 和乘法一样 除法指令的操作数类型可以是字节或字者 被除数的字长常常是两倍于除数字长的数据 可以用符号扩展的方法获得除法指令所需要的被除数格式 对于除法来讲 全部标志无意义 溢出处理不是使OF为1 而是当除数为0时产生0号中断 3 3 2算术运算类指令 1 无符号数除法指令 divide DIV指令格式 DIVSRC指令功能 完成两个不带符号的8位 16位二进制数的除法运算 将AX 16位 中或DX和AX 32位 中的内容 除以在指定的寄存器或存储单元中的内容 对于字节除法 所得的商存于AL 余数存于AH 对于字除法 所得的商存于AX 余数存于DX 3 3 2算术运算类指令 2 有符号数除法指令 signeddivide IDIV指令格式 IDIVSRC指令功能 有符号除法指令与无符号除法指令相同 只是操作数必须为有符号数 商和余数也必须是有符号数 且余数符号与被除数符号相同 有符号除法指令运算时先将数变为原码 并去掉符号位 然后再两数 绝对值 相除 其结果的符号按两数符号位异或运算规则确定 如果符号位为1 负数 则再取补码 此过程由计算机执行指令时自动完成 3 3 2算术运算类指令 4 BCD码 十进制 调整指令如何方便地将二进制数转换为人们日常生活中习惯使用的十进制数呢 80X86指令系统专门提供了一组相应的十进制调整指令 DAA DAS AAA AAS AAM和AAD 该类指令都是隐含寻址 BCD码总是作为无符号数看待的 学习该类指令时应重点理解并掌握它们的用途 即指令执行后的结果 指令操作过程是计算机自动完成的 只需了解即可 3 3 2算术运算类指令 1 压缩BCD码调整指令 加法的十进制调整指令 decimaladjustforaddition DAA指令格式 DAA指令功能 该指令之前必须先执行ADD或ADC指令 加法指令将两个压缩的BCD码相加 并将结果存放在AL寄存器中 而后DAA将AL中的和调整到压缩的BCD格式 3 3 2算术运算类指令 执行指令时CPU对AL中高4位 低4位进行检测 判断是否为有效的BCD码 如果AL中低4位大于9或AF 1 则将AL寄存器的内容加06H 并将AF置1 如果AL中高4位大于9或CF 1 则将AL寄存器的内容加60H 并将CF置1 如果AL中高低4位均大于9 则将AL寄存器的内容加66H 3 3 2算术运算类指令 0100100048HMOVAL 48H 0111010074HMOVBL 74H10111100BCHADDAL BL 0110011066HDAA100100010122H最后结果为 AL 22H CF 1 AF 1 减法的十进制调整指令 decimaladjustforsubtraction DAS指令格式 DAS指令功能 该指令之前必须先执行SUB或SBB指令 减法指令将两个压缩的BCD码相减 并将结果存放在AL寄存器中 而后DAS将AL中的差调整到压缩的BCD格式 3 3 2算术运算类指令 执行指令时 CPU对AL中高4位 低4位进行检测 判断是否为有效的BCD码 如果AL中低4位大于9或AF 1 则将AL寄存器的内容减去06H 并将AF置1 如果AL中高4位大于9或CF 1 则将AL寄存器的内容减去60H 并将CF置1 如果AL中高低4位均大于9 则将AL寄存器的内容减去66H 3 3 2算术运算类指令 2 非压缩BCD码调整指令 加法的ASCII码调整指令 ASCIIadjustforaddition AAA指令格式 AAA指令功能 将两个ASCII码或非压缩BCD码相加之和存放在AL中 而后进行调整 形成一个扩展的非压缩BCD码 调整后的结果低位在AL中 高位在AH中 执行指令时 CPU对AL中的低4位进行检测 如果AL中低4位大于9或AF 1 则将AL寄存器的内容加6 AH寄存器的内容加1 并将AF置1 同时将AL中的高4位清零 CF置1 3 3 2算术运算类指令 减法的ASCII码调整指令 ASCIIadjustforsubtraction AAS指令格式 AAS指令功能 将两个ASCII码或非压缩BCD码相减之差存放在AL中 而后进行调整 形成一个扩展的非压缩BCD码 调整后的结果低位在AL中 高位在AH中 执行指令时 CPU对AL中的低4位进行检测 如果AL中低4位大于9或AF 1 则将AL寄存器的内容减去06H AL寄存器的内容减去01H 并将AF置1 同时将AL中的高4位清零 CF置1 3 3 2算术运算类指令 BCD码乘法调整指令 ASCIIadjustformultiplication AAM指令格式 AAM指令功能 将存放在AL寄存器中两个一位非压缩BCD码相乘之积调整为非压缩BCD码 3 3 2算术运算类指令 BCD码除法调整指令 ASCIIadjustfordivision AAD指令格式 AAD指令功能 将AX中存放的两位非压缩BCD码调整为二进制数 3 3 2算术运算类指令 5 符号扩展指令80X86指令系统提供了一组符号扩展指令 CBW CWD CWDE和CDQ 该类指令都是隐含寻址 常用于除法运算 指令执行后不影响标志位 其中CWDE和CDQ用于80386及其后继机型中 3 3 2算术运算类指令 1 字节转换为字指令 convertbytetoword CBW指令格式 CBW指令功能 将AL中的8位数符号扩展为16位数 形成AX中的字 3 3 2算术运算类指令 2 字转换为双字指令 convertwordtodoubleword CWD指令格式 CWD指令功能 将AX中的16位数符号扩展为32位数 形成DX AX中的双字 3 3 2算术运算类指令 3 3 3逻辑运算和移位类指令 1 逻辑运算指令逻辑运算指令包括AND 与 OR 或 NOT 非 XOR 异或 和TEST 测试 等指令 可以对8位 16位操作数进行逻辑运算 除NOT不影响标志位外 其余指令将使CF OF 0 影响SF ZF PF 1 逻辑与指令 AND指令格式 ANDDSTSRC DST DST SRC 指令功能 将目的操作数与源操作数按位相与 结果送目的操作数 该指令可用来使操作数的某些位被屏蔽 3 3 3逻辑运算和移位类指令 2 逻辑或指令 or OR指令格式 ORDST SRC DST DST SRC 指令功能 将目的操作数与源操作数按位相或 结果送目的操作数 该指令可用来使操作数某些位置1 3 逻辑非指令 not NOT指令格式 NOTDST指令功能 将目的操作数按位取反 该指令常用来将某个数据取成反码 3 3 3逻辑运算和移位类指令 4 异或指令 exclusiveor XOR指令格式 XORDST SRC指令功能 将目的操作数与源操作数按位相异或 结果送目的操作数 该指令可用来使操作数某些位变反 5 测试指令 test TEST指令格式 TESTDST SRC指令功能 将目的操作数与源操作数按位相与 只影响标志位 但结果不保存 该指令可用来屏蔽某些位 或使某些位置1或测试某些位等 3 3 3逻辑运算和移位类指令 XORAX AX 清零AX CFANDAL 0FH 屏蔽高4位 保留低4位 TESTAL 01H 测AL最低位ORAL 0FH 保留高4位 使低4位置1 3 3 3逻辑运算和移位类指令 2 移位指令逻辑左移指令SHL逻辑右移指令SHR算术左移指令SAL算术左移指令SAR不带进位循环左移指令ROL不带进位循环右移指令ROR带进位循环左移指令RCL带进位循环右移指令RCR S ShiftR RotateL LeftR RightA ArithmeticC Carryflag 3 3 3逻辑运算和移位类指令 1 算术移位和逻辑移位算术移动N位 相当于把二进制数乘以或除以2N 把操作数看做有符号数 逻辑移位操作则用于截取字节或字中的若干位 把操作数看做无符号数 所有的移位指令在移位时 都会影响标志位CF OF PF SF和ZF 3 3 3逻辑运算和移位类指令 算术 逻辑左移指令 shiftarithmetic logicalleft SAL SHL指令格式 SAL SHLDST CNT指令功能 按照CNT规定的移位次数 对目的操作数DST进行左移 每移一次 最高位MSB移入CF 而最低位LSB补0 移位位数CNT放在CL寄存器中 如果只移1位 也可以直接写在指令中 CF DST 0 3 3 3逻辑运算和移位类指令 CF DST 0 逻辑右移指令 shiftlogicalright SHR指令格式 SARDST CNT指令功能 按照CNT规定的移位次数 对目的操作数DST进行右移 每移一次 最高位MSB补0 最低位LSB移入CF 3 3 3逻辑运算和移位类指令 算术右移指令 shiftarithmeticright SAR指令格式 SARDST CNT指令功能 按照CNT规定的移位次数 对目的操作数DST进行右移 每移一次 最高位MSB 符号位 保持不变 最低位LSB移入CF CF DST 3 3 3逻辑运算和移位类指令 例 设一个字节数据X存放在AL寄存器中 完成 AL 10的功能 即10X 可用移位实现乘10操作 因为10 8 2 23 21XORAH AHSALAX 1 2XMOVBX AXMOVCL 2SALAX CL 8XADDAX BX 8X 2X 10X 3 3 3逻辑运算和移位类指令 3 循环移位指令循环移位指令在移位时移出的目的操作数并不丢失 而循环送回目的操作数的另一端 循环移位指令仅影响CF和OF 3 3 3逻辑运算和移位类指令 循环左移指令 rotateleft ROL指令格式 ROLDST CNT指令功能 目的操作数每向左移位一次 其最高位MSB移入最低位LSB MSB同时也移入CF CF DST 3 3 3逻辑运算和移位类指令 循环右移指令 rotateright ROR指令格式 RORDST CNT指令功能 目的操作数每向右移位一次 其最低位LSB移入最高位MSB LSB同时也移入CF CF DST 3 3 3逻辑运算和移位类指令 带进位循环左移指令 rotateleftthroughcarry RCL指令格式 RCLDST CNT指令功能 目的操作数每向左移位一次 其最高位MSB移入CF CF移入最低位LSB CF DST 3 3 3逻辑运算和移位类指令 带进位循环右移指令 rotaterightthroughcarry RCR指令格式 RCRDST CNT指令功能 目的操作数每向右移位一次 其最低位LSB移入CF CF移入最高位MSB CF DST 3 3 3逻辑运算和移位类指令 例 将BX的高8位与低8位互换 MOVBX 1234H BX 1234HMOVCL 8ROLBX CL BX 3412H 3 3 3逻辑运算和移位类指令 串操作指令就是对一个字符串进行操作 处理 字符串可以是字串或字节串 字串操作允许对连续存放在存储器中大的数据块进行操作 80X86通过加重复前缀来实现串操作 所有串操作指令都用寄存器SI对源操作数进行间接寻址 并且默认是在DS段中 用DI为目的操作数进行间接寻址 并且默认是在ES段中 串操作指令是唯一的一组源操作数和目的操作数都在存储器中的指令 3 3 4串操作类指令 串操作时 地址的修改往往与方向标志DF有关 当DF 1时 SI和DI作自动减量修改 当DF 0时 SI和DI作自动增量修改 一条带重复前缀的串操作指令的执行过程往往相当于执行一个循环程序 在每次重复之后 都会修改地址指针SI和DI 要用CX寄存器作为重复次数计数器 指令每执行一次 CX的内容减1 直到其值减为0 3 3 4串操作类指令 1 重复前缀指令重复前缀指令控制其后的串指令重复执行 1 重复前缀指令 repeat REP功能 重复其后指令串的操作直至 CX 0 用于串传送 串装入 串存储指令前 1 判条件 若 CX 0 则退出REP 否则往下执行 2 CX CX 1 3 执行其后串指令 4 重复 1 3 3 3 4串操作类指令 2 相等 为零则重复前缀指令 repeatwhileequal zero REPE REPZ功能 相等 为零则重复串操作 用于串比较 串扫描指令前 操作 与REP类同 区别在于判断条件 当 CX 0且ZF 1时 重复执行 3 不相等 不为零则重复前缀指令 repeatwhilenotequal notzero REPNE REPNZ功能 不相等 不为零则重复串操作 用于串比较 串扫描指令前 操作 与REP类同 区别在于判断条件 当 CX 0且ZF 0时 重复执行 3 3 4串操作类指令 2 串操作指令1 串传送指令 movestring MOVS指令格式 MOVSDST SRCMOVSB 字节 ES DI DS SI SI SI 1 DI DI 1MOVSW 字 ES DI DS SI SI SI 2 DI DI 2 3 3 4串操作类指令 执行串指令之前 应先进行如下设置 1 源串首地址 末地址 SI 2 目的串首地址 末地址 DI 3 串长度 CX 4 建立方向标志 CLD使DF 0 STD使DF 1 串操作指令前面可加重复前缀完成串传送功能 3 3 4串操作类指令 例 将DS 0100H地址开始的50个字传送到ES 2000H开始的内存单元中 MOVSI 0100HMOVDI 2000HMOVCX 50CLDREPMOVSW 3 3 4串操作类指令 2 串装入指令 loadfromstring LODS指令格式 LODSSRCLODSB 字节 AL DS SI SI SI 1LODSW 字 AX DS SI SI SI 2 3 3 4串操作类指令 3 串存储指令 storeintostring STOS指令格式 STOSDSTSTOSB 字节 ES DI AL DI DI 1STOSW 字 ES DI AX DI DI 2 3 3 4串操作类指令 4 串比较指令 comparestring CMPS指令格式 CMPSDST SRCCMPSB 字节 ES DI DS SI SI SI 1 DI DI 1CMPSW 字 ES DI DS SI SI SI 2 DI DI 2 3 3 4串操作类指令 5 串扫描指令 scanstring SCAS指令格式 SCASDSTSCASB 字节 AL ES DI DI DI 1SCASW 字 AX ES DI DI DI 2 3 3 4串操作类指令 转移指令用于分支程序 它分为无条件转移和条件转移 无条件转移可转到内存中存放的任何程序段 条件转移指令对于条件的判别主要是根据标志位来判别的 对于CF OF PF SF ZF都有相应的判别指令 3 3 5控制转移类指令 1 无条件转移指令 1 JMP jump 指令指令格式 JMPDST指令功能 无条件跳转到指令指定的目标地址DST去执行指令 DST可以是标号 通用寄存器或存储器 前面已经详细介绍了四种程序转移寻址方式 段内直接寻址 段内间接寻址 段间直接寻址及段间间接寻址 3 3 5控制转移类指令 段内直接转移指令JMPnearlabel 段内直接短转移指令JMPshortlabel 段内间接转移指令JMPreg16JMPmem16 段间直接转移指令JMPFARPTRlabelname 段间间接转移指令JMPmem32 3 3 5控制转移类指令 2 子程序调用指令主程序用CALL指令来调用子程序 CALL指令的功能是先将断点地址 IP 与 CS 压入堆栈 然后将子程序的首址装入IP与CS中 从而将程序转移到子程序的入口 再顺序执行子程序 在子程序的最后应安排一条返回指令RET CPU执行RET指令时 会从堆栈中弹出断点地址 重新装入IP与CS中 从而达到返回主程序的目的 3 3 5控制转移类指令 3 3 5控制转移类指令 调用指令 call CALL指令格式 CALLDST执行操作 1 PUSHCS 2 PUSHIP 3 JMPDST目的操作数的寻址方式与JMP相似 只是没有短程调用 3 3 5控制转移类指令 返回指令 return RET指令格式 RET执行操作 1 POPIP 2 POPCS 3 3 5控制转移类指令 2 条件转移指令 jumpifcc Jcc指令格式 JccDST指令功能 如果测
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广西城轨工程建设有限公司招聘20人考前自测高频考点模拟试题及完整答案详解1套
- 2025年绍兴新昌县卫健系统第一次公开招聘人员17人模拟试卷附答案详解(突破训练)
- 2025广州医科大学校本部招聘工作人员9人(第二次)考前自测高频考点模拟试题及参考答案详解一套
- 2025年杭州市余杭区卫生健康系统事业单位招聘编外工作人员73人考前自测高频考点模拟试题及答案详解一套
- 2025安康石泉县两河镇中心卫生院招聘(2人)考前自测高频考点模拟试题附答案详解(完整版)
- 2025湖南永州市东安县招聘第一批就业见习岗位121人模拟试卷及答案详解(必刷)
- 2025贵州省计量测试院参加第十三届贵州人才博览会引才4人考前自测高频考点模拟试题及答案详解(易错题)
- 2025年宁波余姚市卫生健康事业单位公开招聘卫生技术人员179人模拟试卷参考答案详解
- 2025河南许昌市经发控股集团有限公司社会招聘拟聘人员模拟试卷及完整答案详解一套
- 2025安徽合肥师范学院高层次人才招聘63人考前自测高频考点模拟试题完整答案详解
- 2025年初级消防员理论考试题库附答案
- 仓管员补贴管理办法
- DB11-T 751-2025 住宅物业服务标准
- 个税扣除培训
- 与保密有关培训课件
- 粮食机收减损培训课件
- 农行考试试题及答案
- 2025-2030年中国抽油机行业市场现状供需分析及投资评估规划分析研究报告
- 展览会场安全风险评估及应对措施
- 十五五住房和城乡建设发展思路
- 医用废弃口罩管理制度
评论
0/150
提交评论