




已阅读5页,还剩139页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 2020 4 6 微机原理 南京理工大学动力学院 2009年 2 2020 4 6 二 算术运算指令 8086 8088提供加 减 乘 除四种基本算术操作 这些操作都可用于字节或字的运算 也可以用于带符号数与无符号数的运算 带符号数用补码表示 同时8086 8088也提供了各种校正操作 故可以进行十进制算术运算 3 2020 4 6 1 加法指令 格式 ADDOPRD1 OPRD2 功能 OPRD1 OPRD2 OPRD1结果影响标志位 1 不带进位的加法 ADDdest src 加法 dest dest src ADD指令使目的操作数加上源操作数 和的结果送到目的操作数 4 2020 4 6 例 movax 7348h AX 7348Haddal 27h AL 48H 27H 6FH AX 736FH OF 0 SF 0 ZF 0 PF 1 CF 0addax 3fffh AX 736FH 3FFFH B36EH OF 1 SF 1 ZF 0 PF 0 CF 0 5 2020 4 6 2 带进位的加法 格式 ADCOPRD1 OPRD2 功能 OPRD1 OPRD2 CF OPRD1结果影响标志位 ADCdest src 加法 dest dest src CF ADC指令除完成ADD加法运算外 还要加上进位CF 结果送到目的操作数 6 2020 4 6 3 增量指令 格式 INCOPRD功能 OPRD 1 OPRD 不影响CF 影响AF OF PF SF和ZF INCreg mem 增量 加1 reg mem reg mem 1 MOVAL 0FFHINCAL ZF 1INC BX 7 2020 4 6 2 减法指令 格式 SUBOPRD1 OPRD2 功能 OPRD1 OPRD2 OPRD1结果影响标志位 1 不带借位的减法 SUBdest src 减法 dest dest src SUB指令使目的操作数减去源操作数 差的结果送到目的操作数 8 2020 4 6 subah 0f0h AH B3H F0H C3H AX C36EH OF 0 SF 1 ZF 0 PF 1 CF 1movwordptr 200h 0ef00h 200H EF00H 标志不变sub 200h ax 200H EF00H C36EH 2B92H OF 0 SF 0 ZF 0 PF 0 CF 0subsi si SI 0 OF 0 SF 0 ZF 1 PF 1 CF 0 9 2020 4 6 2 带借位的减法 格式 SBBOPRD1 OPRD2 功能 OPRD1 OPRD2 CF OPRD1结果影响标志位 SBBdest src 减法 dest dest src CF SBB指令除完成SUB减法运算外 还要减去借位CF 结果送到目的操作数 10 2020 4 6 例 无符号双字加法和减法 movax 7856h AX 7856Hmovdx 8234h DX 8234Haddax 8998h AX 01EEH CF 1adcdx 1234h DX 9469H CF 0subax 4491h AX BD5DH CF 1sbbdx 8000h DX 1468H CF 0 DX AX 82347856H 12348998H 80004491H 1468BD5DH 主要用于无符号多字节的加法和减法运算 11 2020 4 6 3 减量指令 格式 DECOPRD功能 OPRD 1 OPRD 不影响CF 影响AF OF PF SF和ZF DECreg mem 减量 减1 reg mem reg mem 1INC指令和DEC指令是单操作数指令与加法和减法指令实现的加1和减1不同的是 INC和DEC不影响CF标志 12 2020 4 6 incsi si si 1decbyteptr si si si 1 单操作数指令中操作数无法区分字量还是字节量时一定要有显式说明 MOVCX 1DECCX CX 0 ZF 1 13 2020 4 6 4 求补指令 格式 NEGOPRD 对操作数取补码后送回 功能 0 OPRD OPRD 指令影响标志位AF CF OF PF SF和ZF 此指令执行时 只有当操作数为0时 CF为0 否则CF总为1 NEGreg mem reg mem 0 reg memNEG指令对操作数执行求补运算 即用零减去操作数 然后结果返回操作数 NEG指令也是一个单操作数指令 14 2020 4 6 例 movax 0ff64hnegal AL 0 64H 9CH AX FF9CH OF 0 SF 1 ZF 0 PF 1 CF 1subal 9dh AL 9CH 9DH FFH AX FFFFH OF 0 SF 1 ZF 0 PF 1 CF 1negax AX 0 FFFFH 0001H OF 0 SF 0 ZF 0 PF 0 CF 1decal AL 01H 1 0 AX 0000H OF 0 SF 0 ZF 1 PF 1 CF negax AX 0 0 0 OF 0 SF 0 ZF 1 PF 1 CF 0 DEC指令不影响CF 1 15 2020 4 6 5 比较指令 格式 CMPOPRD1 OPRD2 功能 OPRD1 OPRD2 不送回结果 只影响标志位 比较结果影响标志位AF CF OF PF SF和ZF CMPdest src 做减法运算 dest srcFR CMP指令将目的操作数减去源操作数 但差值不回送目的操作数比较指令通过减法运算影响状态标志 用于比较两个操作数的大小关系 标志 16 2020 4 6 比较指令主要用于比较两个数之间的关系 若两者相等 相减以后结果为零 ZF标志为1 否则为0 大小的比较 假设CMPAX BX 对无符号数 若结果没有产生借位 CF 0 则AX BX 若产生了借位 CF 1 则AX BX 对带符号数 则可根据OF与SF异或运算的结果来判断 结果为1 则AX BX 结果为0 则AX BX cmpax bxcmpal 100 17 2020 4 6 加法和减法指令总结 加法指令 ADD ADC和INC减法指令 SUB SBB DEC NEG和CMP他们分别执行字或字节的加法和减法运算 除INC和DEC不影响CF标志外 其他按定义影响全部状态标志位操作数组合 运算指令助记符reg imm reg mem运算指令助记符mem imm reg 目的操作数和源操作数不能同时为存储单元操作数 段寄存器不能做运算指令的操作数 18 2020 4 6 3 乘法指令 乘法指令分无符号和有符号乘法指令MULreg mem 无符号乘法IMULreg mem 有符号乘法 约定 两个8位数相乘 有一个乘数在AL中 另一个乘数在寄存器或内存中 乘积在AX中 两个16位数相乘 有一个乘数在AX中 另一个乘数在寄存器或内存中 乘积的高16位在DX中 低16位在AX中 乘法有带符号数和无符号数两套指令 19 2020 4 6 MULr8 m8 无符号字节乘法 AX AL r8 m8MULr16 m16 无符号字乘法 DX AX AX r16 m16IMULr8 m8 有符号字节乘法 AX AL r8 m8IMULr16 m16 有符号字乘法 DX AX AX r16 m16 20 2020 4 6 乘法运算时 结果影响CF和OF AF PF SF ZF标志位无意义 对MUL指令 当乘积的高半部分不为0 CF 1 OF 1 否则 CF 0 OF 0 对IMUL指令 当乘积的高半部分是低半部分最高位的扩展 乘积的高半部分每位与低半部分最高位相同时 CF 0 OF 0 否则 CF 1 OF 1 CF 1 OF 1表示高半部分包含有结果的有效数 21 2020 4 6 例 MOVAL 0FBHMOVBH 02HIMULBH 结果 AX 0FFF6H 即 10 CF 0 OF 0 MOVAL 0FBH 表示无符号数是251MOVBH 02H 表示无符号数是2MULBH 结果 AX 01F6H 即502 CF 1 OF 1 22 2020 4 6 例 字节数据乘法 A5H 64H moval 64h AL 64H 表示无符号数是100 有符号数也是100movbl 0a5h BL A5H 表示无符号数是165 有符号数则是 91mulbl 无符号字节乘法 AX 4074H 表示16500 OF CF 1 说明AX高8位含有有效数值 不是符号扩展imulbl 有符号字节乘法 AX DC74H 表示 9100 OF CF 1 说明AX高8位含有有效数字 不是符号扩展 23 2020 4 6 4 除法指令 DIVr8 m8 16位除8位 无符号字节除法 AL AX r8 m8的商AH AX r8 m8的余数隐含第一操作数AX DIVr16 m16 32位除16位 无符号字除法 AX DX AX r16 m16的商DX DX AX r16 m16的余数隐含第一操作数DX AX 1 有符号字节除法 24 2020 4 6 IDIVr16 m16 32位除16位 有符号字除法 AX DX AX r16 m16的商DX DX AX r16 m16的余数隐含第一操作数DX AX IDIVr8 m8 16位除8位 有符号字节除法 AL AX r8 m8的商AH AX r8 m8的余数隐含第一操作数AX 2 有符号字节除法 25 2020 4 6 除法指令使状态标志没有定义 但是却可能产生溢出 当被除数远大于除数时 所得的商就有可能超出它所能表达的范围 如果存放商的寄存器AL AX不能表达 便产生溢出 8086CPU中就产生编号为0的内部中断 INT0 8086 8088规定IDIV指令运算结果中商的符号与代数规则相同 余数的符号与被除数相同 对DIV指令 除数为0 或者在字节除时商超过8位 或者在字除时商超过16位 则发生除法溢出 对IDIV指令 除数为0 或者在字节除时商不在 128 127范围内 或者在字除时商不在 32768 32767范围内 则发生除法溢出 当8位数除以8位数 16位数除以16位数时 必须对被除数进行扩展 26 2020 4 6 3 符号扩展指令 符号扩展是指用一个操作数的符号位 最高位 形成另一个操作数 后一个操作数的高位是全0 正数 或全1 负数 符号扩展虽然使数据位数加长 但数据大小并没有改变 扩展的高部分仅是低部分的符号扩展符号扩展指令有两条 用来将字节转换为字 字转换为双字CBW AL符号扩展到AH Byte Word CWD AX符号扩展到DX Word Dword 符号扩展指令常用来获得有符号数的倍长数据 例如 有符号除法的倍长于除数的被除数 对无符号数应该采用直接使高8位或高16位清0的方法 获得倍长的数据 27 2020 4 6 符号扩展指令 符号扩展指令隐含操作数只能是AL AX CBW 字节扩展到字CBW 将寄存器AL中的符号位扩展到寄存器AH CWD 字扩展到双字CWD 将寄存器AX中的符号位扩展到寄存器DX 28 2020 4 6 符号扩展例 moval 64h AL 64H 机器数 表示10进制数100 真值 cbw 将符号0扩展 AX 0064H 仍然表示100movax 0ff00h AX FF00H 表示有符号10进制数 256cwd 将符号位 1 扩展 DX AX FFFFFF00H 仍然表示 256 29 2020 4 6 5 十进制调整指令 压缩BCD码 一个字节中有两位BCD码01000101非压缩BCD码 一个字节只用低4位表示一位BCD码 高4位为0 0000010000000101 BCD码 用二进制形式表示的十进制码 每一位十进制数用4位二进制表示 运算规则是逢十进一 BCD码运算时 先用一般的二进制运算 然后再进行BCD码调整 30 2020 4 6 十进制数调整指令对二进制运算的结果进行十进制调整 以得到十进制的运算结果 以此实现十进制BCD码运算8086指令系统支持两种BCD码调整运算压缩BCD码就是通常的8421码 它用4个二进制位表示一个十进制位 一个字节可以表示两个十进制位 即00 99非压缩BCD码用8个二进制位表示一个十进制位 只用低4个二进制位表示一个十进制位0 9 高4位任意 通常默认为0 5 十进制调整指令 31 2020 4 6 编码的比较 真值 十进制 864二进制编码08H40H压缩BCD码08H64H非压缩BCD码08H0604HASCII码38H3634H 压缩BCD码加减法调整指令DAADAS非压缩BCD码加减乘除法调整指令AAAAASAAMAAD 32 2020 4 6 1 加法十进制调整DAA 执行的操作 这条指令执行前必须先执行ADD或ADC指令 加法指令必须把两个两位的压缩BCD码相加 并把结果存放在AL寄存器中 1 压缩BCD码十进制调整指令 MOVAL 15HADDAL 17H AL 2CHDAA AL 32H 压缩BCD 加法 33 2020 4 6 2 减法十进制调整DAS 执行的操作 这条指令执行之前 必须先执行SUB或SBB指令 减法指令必须把两个两位的压缩BCD码相减 并把结果存放在AL寄存器中 MOVAL 15HSUBAL 17H AL FEHDAS AL 98H 压缩BCD 减法 34 2020 4 6 累加器AL低4位大于9或辅助进位标志位AF 1 则累加器AL加06H修正且AF置1累加器AL高4位大于9或进位标志位CF 1 则累加器AL加60H修正且CF置1 如果同时满足 则累加器AL进行加66H修正且AF和CF置1 调整的方法 35 2020 4 6 压缩BCD码加法或减法十进制调整指令必须在ADD ADC 或SUB SBB 指令之后 且运算结果保存在AL寄存器中 调整结果对标志OF无影响 对其它状态标志位均有影响 减法十进制调整方法与加法十进制调整方法类同 只是将加6变为减6操作 说明 36 2020 4 6 2 非压缩BCD码十进制调整指令指令格式 加法十进制调整AAA 减法十进制调整AAS 乘法十进制调整AAM 除法十进制调整AAD 非压缩BCD 加法 37 2020 4 6 将AL的内容变换成一位非压缩的十进制数 AAA检查AL低四位 如低四位是0 9的数字且AF 0 AAA就清除AL的高四位 以及AF和CF标志 如AL低四位表示的数大于9或AF 1 AAA执行 加6到AL寄存器 加1到AH寄存器 置AF 1 CF 1 清除AL高四位为0 非压缩BCD规格化 例 ADDAL BL AL和BL中的数相加AAA 非压缩BCD码调整 1 AAA指令加法十进制调整 MOVAL 07HADDAL 05HAAA AX 0102HCF AF 1 38 2020 4 6 例 SUBAL BL AAS 检查AL低四位 如低四位表示的数是0 9的数字且AF 0 AAS清除AL高四位及CF和AF标志 如AL低四位表示的数大于9或AF 1 AAS进行如下调整 AL减去6 AH减去1 置AF 1 CF 1 清除AL中高四位 2 AAS指令 39 2020 4 6 例 MULBL AL BL AX AH 0 AAM 调整后积的高位在AH中 低位在AL中 3 AAM指令 AAM指令的作用是用10 0AH 来除AL寄存器的内容 并将除得的商和余数分别送到AH和AL来实现转换 8位乘8位 积在AX中 由于乘数和被乘数都是非压缩BCD数 积不会超过81 所以有效值只会在AL中 只需对AL进行转换就可以了 若积是81 调整后 AH 08H AL 01H 40 2020 4 6 4 AAD指令 AAD AX 将AX中的非压缩BCD码扩展成二进制数 调整操作 AL 10 AH AL AH 0非压缩BCD码除法调整指令AAD与其他的调整指令应用情况不同 它是先将存放在AX寄存器中的两位非压缩BCD码数进行调整 然后再用DIV指令除以一个非压缩BCD码数 这样得到非压缩BCD码数的除法结果 其中 要求AL AH和除数的高4位为0 AAM指令和AAD指令根据结果设置SF ZF和PF 但OF CF和AF无定义 41 2020 4 6 例 非压缩BCD码的乘法和除法运算 movax 0905h AX 0905H 作为非压缩BCD码表示95movbl 08h BL 08H 作为非压缩BCD码表示8mulbl 按照二进制数进行乘法 AL BL AX AX 05H 08H 0028Haam 按照非压缩BCD码进行调整 AX 0400H 实现非压缩BCD码乘法 5 8 40movbl 06h BL 06H 作为非压缩BCD码表示6aad 进行二进制扩展 AX 40 0028Hdivbl 除法运算 商AL 06H 余数AH 04H 实现非压缩BCD码除法 40 6 6 4 42 2020 4 6 MOVAX 0300H AX 0300H作为非压缩BCD码表示30MOVBL 05H BL 05H 作为非压缩BCD码表示5AAD AX 001EHDIVBL AX 0006H 例 两位非压缩BCD数除一位非压缩BCD数 43 2020 4 6 逻辑运算指令以二进制位为基本单位进行数据的操作当需要对字节或字数据中的各个二进制位操作时 可以考虑采用逻辑运算指令注意这些指令对标志位的影响1 逻辑运算指令ANDORXORNOTTEST2 移位指令SHLSHRSALSAR3 循环移位指令ROLRORRCLRCR 三 逻辑运算和移位指令 44 2020 4 6 双操作数逻辑指令AND OR XOR和TEST设置CF OF 0 根据结果设置SF ZF和PF状态 而对AF未定义 它们的操作数组合与ADD SUB等一样 单操作数逻辑指令NOT不影响标志位 操作数与INC DEC和NEG一样 1 逻辑运算指令 45 2020 4 6 1 逻辑非指令NOT 对一个操作数执行逻辑非运算 NOTreg mem reg mem reg mem 按位取反 原来是 0 的位变为 1 原来是 1 的位变为 0 注意 不影响标志位 46 2020 4 6 2 逻辑与指令AND 对两个操作数执行逻辑与运算 结果送目的操作数 ANDdest src dest dest src 只有相 与 的两位都是1 结果才是1 否则 与 的结果为0有 0 出 0 全 1 出 1 47 2020 4 6 3 逻辑或指令OR 对两个操作数执行逻辑或运算 结果送目的操作数 ORdest src dest dest src 只要相 或 的两位有一位是1 结果就是1 否则 结果为0 有 1 出 1 全 0 出 0 48 2020 4 6 4 逻辑异或指令XOR 对两个操作数执行逻辑异或运算 结果送目的操作数 XORdest src dest dest src 只有相 异或 的两位不相同 结果才是1 否则 结果为0 相同出0 不同出1 49 2020 4 6 5 测试指令TEST 对两个操作数执行逻辑与运算 结果并不送目的操作数 仅按AND指令影响标志 只影响标志SF ZF PF CF OF 0 TESTdest src dest src AND与TEST指令的关系 同SUB与CMP指令的关系一样 50 2020 4 6 例 逻辑运算指令应用 moval 75h AL 75Handal 32h AL 30H CF OF 0 SF 0 ZF 0 PF 1oral 71h AL 71H CF OF 0 SF 0 ZF 0 PF 1xoral 0f1h AL 80H CF OF 0 SF 1 ZF 0 PF 0notal AL 7FH 标志不变 01111111 01110101 AND00110010 00110000 00110000 OR01110001 01110001 01110001 XOR11110001 10000000 NOT10000000 51 2020 4 6 例 逻辑运算指令的应用 andbl 11110110b BL中D0和D3清0 其余位不变orbl 00001001b BL中D0和D3置1 其余位不变xorbl 00001001b BL中D0和D3求反 其余位不变 AND指令可用于复位某些位 同0相与 不影响其他位 OR指令可用于置位某些位 同1相或 不影响其他位 XOR指令可用于求反某些位 同1相异或 不影响其他位 52 2020 4 6 2 移位指令 将操作数移动一位或多位 分成逻辑移位和算术移位 分别具有左移或右移操作 按照移入的位设置进位标志CF 根据移位后的结果影响SF ZF PF 移位指令的第一个操作数是指定的被移位的操作数 可以是寄存器或存储单元 后一个操作数表示移位位数 该操作数为1 表示移动一位该操作数为CL CL寄存器值表示移位位数 移位位数大于1时只能用CL表示 53 2020 4 6 1 逻辑左移指令SHL SHLreg mem 1 CL reg mem左移1或CL位 最低位补0 最高位进入CF 0 逻辑 算术左移指令SHL SAL 操作数 54 2020 4 6 SHL和SAL指令的功能 55 2020 4 6 2 逻辑右移指令SHR SHRreg mem 1 CL reg mem右移1 CL位 最高位补0 最低位进入CF 0 逻辑右移指令SHR 操作数 56 2020 4 6 SHR指令的功能 57 2020 4 6 3 算术左移指令SAL SALreg mem 1 CL 与SHL是同一条指令 0 逻辑 算术左移指令SHL SAL 操作数 58 2020 4 6 4 算术右移指令SAR SARreg mem 1 CL reg mem右移1 CL位 最高位不变 最低位进入CF 对无符号数 SHR是除2对有符号数 SAR是除2 算术右移指令SAR 操作数 59 2020 4 6 SAR指令的功能 60 2020 4 6 例 数据移位 movdx 6075h DX 0110000001110101Bshldx 1 DX 1100000011101010B CF 0 SF 1 ZF 0 PF 0sardx 1 DX 1110000001110101B CF 0 SF 1 ZF 0 PF 0shrdx 1 DX 0111000000111010B CF 1 SF 0 ZF 0 PF 1movcl 4 CL 4 标志不变sardx cl DX 0000011100000011B CF 1 SF 0 ZF 0 PF 1 CF 61 2020 4 6 例 将AL寄存器中的无符号数乘以10 xorah ah 实现AH 0 同时使CF 0shlax 1 AX 2 ALmovbx ax BX AX 2 ALshlax 1 AX 4 ALshlax 1 AX 8 ALaddax bx AX 8 AL 2 AL 10 AL 逻辑左移一位相当于无符号数乘以2逻辑右移一位相当于无符号数除以2 62 2020 4 6 3 循环移位指令 循环移位指令类似移位指令 但要将从一端移出的位返回到另一端形成循环 分为 ROLreg mem 1 CL 不带进位循环左移RORreg mem 1 CL 不带进位循环右移RCLreg mem 1 CL 带进位循环左移RCRreg mem 1 CL 带进位循环右移 循环移位指令的操作数形式与移位指令相同 按指令功能设置进位标志CF 但不影响SF ZF PF AF标志 63 2020 4 6 ROL指令的功能 64 2020 4 6 RCL指令的功能 65 2020 4 6 例 32位数据移位 将DX AX中32位数值左移一位shlax 1rcldx 1 DX AX CF 0 考虑32位数据的右移等操作 shlax 1 rcldx 1 66 2020 4 6 例 非压缩BCD码合并为压缩BCD DBCD有2位非压缩BCD码movdl dbcd 取低字节anddl 0fh 只要低4位 CF 0movdh dbcd 1 取高字节movcl 4shldh cl 低4位移到高4位DH 90Hordl dh 合并到DL No DL 67 2020 4 6 四 程序控制指令 所有的程序控制转移类指令均不影响标志位 64KB内 段内转移 目标指令与转移指令在同一代码段中 只改变IP的值 LL 新CS IP 分为两种情况 段内转移段间转移 CS IP 68 2020 4 6 可以超过64KB 段间转移 目标指令与转移指令分别在不同的代码段 转移时需要改变CS和IP的值 CS IP LL 新CS IP 69 2020 4 6 1 无条件转移指令格式 JMPOPRD功能 控制程序无条件转向由OPRD指向的位置执行 无条件转移指令 直接转移 间接转移 短程转移 SHORT 近程转移 NEAR 远程转移 FAR 段内间接转移 段间间接转移 70 2020 4 6 1 直接转移 分为三种情况 短程 JMPSHORTOPRD近程 JMPNEARPTROPRD远程 JMPFARPTROPRD OPRD通常以标号形式出现 NEAR为默认值可以省略 71 2020 4 6 段内直接转移 近程转移 near 在当前代码段64KB范围内转移 32KB范围 不需要更改CS段地址 只要改变IP偏移地址 代码段 代码段 段内直接转移 短程转移 short 转移范围可以用一个字节表达 在段内 128 127范围的转移 段内直接转移中指令代码中提供目的地址是相对于当前IP的位移量 转移到的目的地址 转移后的IP值 就是当前IP值加上位移量 CS不变 IP IP 位移量 72 2020 4 6 段间直接转移 远转移 far 从当前代码段跳转到另一个代码段 可以在1MB范围需要更改CS段地址和IP偏移地址目标地址必须用一个32位数表达 叫做32位远指针 它就是逻辑地址 代码段 代码段 指令代码中提供目的逻辑地址 转移后的CS和IP值直接来自指令操作码后给出的目的地址操作数 一个双字的逻辑地址 其中高字送CS 低字送IP 73 2020 4 6 JMPAGAINJMPFARPTRDATCHG 例 实际编程时 程序员只需写出要转移的目标地址标号 汇编程序会根据目标地址的属性 自动处理成短转移 近转移或远转移程序员可用类型操作符short nearptr或farptr强制成为需要的转移类型 74 2020 4 6 2 间接转移指令代码中给出寄存器或存储单元 目的地址从寄存器或存储单元中间接获得 75 2020 4 6 1 段内间接转移 格式 JMPWORDPTROPRD转移地址存放在内存单元中 转移指令后给出的是内存单元的地址 格式 JMPOPRD OPRD为寄存器名 JMPBX BX IP JMPWORDPTR SI DS SI 1 DS SI IP DS SI IP 76 2020 4 6 2 段间间接转移 格式 JMPDWORDPTROPRD转移地址存放在内存单元中 一般用寄存器间接寻址 JMPDWORDPTR SI DS SI 3 SI 2 CSDS SI 1 SI IP DS SI CS IP 77 2020 4 6 1 直接短转移JMPSHORTPTROPR EBE7 操作 IP IP 8位位移量 例 JMPSHORTPTRSTART 3 段内间接转移JMPWORDPTROPR 操作 IP 有效地址 例 JMPBX E3 IP BX 寄存器间接转移JMPWORDPTRJTABLE BX FF67 IP EA 存储器间接转移 段内直接转移都是相对转移 当前IP值 78 2020 4 6 4 段间直接 远 转移JMPFARPTROPR 指令代码 EA46010030 操作 IP OPR的段内偏移地址 CS OPR所在段的段地址 例 JMPFARPTRSTART1 5 段间间接转移JMPDWORDPTROPR指令代码 FFEB 操作 IP EA 存储器间接转移 CS EA 2 例 JMPDWORDPTRJTABLE1 BX 各种存储器寻址方式给出的有效地址 79 2020 4 6 例 设下列各转移指令的第一字节在内存中的地址为CS 2000H和IP 016EH 且环境均为DS 6000H BX 16C0H 616C0H 46H 616C1H 01H 616C2H 00H 616C3H 30H 61732H 70H 61733H 17H 写出下列各无条件转移指令执行后CS和IP的值及转移类型 各指令左首的16进制编码是该指令的机器码 指令中的目的地址用相应的标号表示 1 EBE7JMPSHORTAGAIN 2 E90016JMPNEARPTROTHER 3 E3JMPBX 4 EA46010030JMPFARPTRPROB 5 FF67JMPWORDPTR0072H BX 6 FFEBJMPDWORDPTR BX 0170H FFE7H 0157H 0171H 1600H 1771H IP 16C0H IP 0146HCS 3000H IP 1770HCS 2000H IP 0146HCS 3000H 80 2020 4 6 功能 根据条件来判断程序是否转移 满足条件时程序转向指定位置执行 否则 程序顺序执行 注意 此时程序出现分支 只能转移到距当前指令 128 127字节的范围内 即一个字节的补码范围 127 128 2 条件转移指令 81 2020 4 6 条件转移指令Jcc根据指定的条件确定程序是否发生转移 其通用格式为 Jcclabel 条件满足 发生转移 IP IP 8位位移量 否则 顺序执行label是一个标号 一个8位位移量 表示Jcc指令后的那条指令的偏移地址 到目标指令的偏移地址的地址位移 8位位移量应扩展为字后与IP相加 当前IP值 Jcc只支持短转移的相对寻址方式 82 2020 4 6 Jcc指令不影响标志 但要利用标志 根据利用的标志位不同 分成三种情况 判断单个标志位状态 比较无符号数高低 比较有符号数大小 Jcc指令实际虽然只有16条 但却有30个助记符采用多个助记符 目的是为了方便记忆和使用 83 2020 4 6 条件转移指令中的条件cc 助记符标志位说明JZ JEZF 1等于零 相等JNZ JNEZF 0不等于零 不相等 JOOF 1溢出JNOOF 0无溢出 JP JPEPF 1 1 的个数为偶数JNP JPOPF 0 1 的个数为奇数 JSSF 1符号为负JNSSF 0符号为正 84 2020 4 6 条件转移指令中的条件cc 助记符标志位说明JC JB JNAECF 1进位 低于 不高于等于JNC JNB JAECF 0无进位 不低于 高于等于JBE JNACF 1或ZF 1低于等于 不高于JNBE JACF 0且ZF 0不低于等于 高于JL JNGESF OF小于 不大于等于JNL JGESF OF不小于 大于等于JLE JNGSF OF或ZF 1小于等于 不大于JNLE JGSF OF且ZF 0不小于等于 大于 CMPAX BXJcclable 85 2020 4 6 1 判断单个标志位状态 JZ JE和JNZ JNE利用零标志ZF 判断结果是否为零 或相等 JC JB JNAE和JNC JNB JAE 高于等于 利用进位标志CF 判断结果是否进位或借位 JP JPE和JNP JPO利用奇偶标志PF 判断结果中 1 的个数是偶是奇 JO和JNO利用溢出标志OF 判断结果是否产生溢出 JS和JNS利用符号标志SF 判断结果是正是负 CMPAX BXJcclable 86 2020 4 6 2 比较无符号数高低 无符号数的大小用高 Above 低 Below 表示 需要利用CF确定高低 利用ZF标志确定相等 Equal 两数的高低分成4种关系 对应4条指令JB JNAE 目的操作数低于 不高于等于 源操作数 CF 1 JCJNB JAE 目的操作数不低于 高于等于 源操作数 CF 0 JNCJBE JNA 目的操作数低于等于 不高于 源操作数 CF ZF 1 JNBE JA 目的操作数不低于等于 高于 源操作数 CF ZF 0 CMPAX BXJcclable 87 2020 4 6 3 比较有符号数大小 判断有符号数的大 Greater 小 Less 需要组合OF SF标志 并利用ZF标志确定相等与否两数的大小分成4种关系 分别对应4条指令JL JNGE 目的操作数小于 不大于等于 源操作数 SF OF 1 JNL JGE 目的操作数不小于 大于等于 源操作数 SF OF 0 JLE JNG 目的操作数小于等于 不大于 源操作数 SF OF ZF 1JNLE JG 目的操作数不小于等于 大于 源操作数 SF OF ZF 0 减的结果为负 SF 1 且无溢出 OF 0 或减的结果为正 SF 0 而有溢出 OF 1 减的结果为正 SF 0 且无溢出 OF 0 或减的结果为负 SF 1 但有溢出 OF 1 CMPAX BXJcclable 88 2020 4 6 条件转移指令常用来进行判断 以实现程序分支 CMPAL 0JAENNMOVDL 1JMPDONENN MOVDL 0DONE 程序执行完以后 若AL的值小于0 则DL 1 反之 则DL 0 如果AL存放的是有符号数 则条件转移指令应采用JGE指令 JNBNN 89 2020 4 6 下面程序段在什么情况下执行的结果是AL 0 BEGIN INAL 5FHTESTAL 80HJZA1XORAL ALJMPSTOPA1 MOVAL 0FFHSTOP HLT 当从5FH端口读到的数据的最高位为1时 90 2020 4 6 从数据区BCDBUF开始存放着10个用非压缩BCD码表示的十进制数 要求把它们分别转换成ASCII码后存入ASCBUF开始的另一缓冲区 LEASI BCDBUFLEADI ASCBUFMOVCX 10AGAIN MOVAL SI 取BCD码ORAL 30H 转换MOV DI AL 存INCSIINCDIDECCXJNZAGAIN 分析 BCD码转换成ASCII码的方法是 BCD码 30H 91 2020 4 6 3 循环指令 一段代码序列多次重复执行就是循环8088设计有针对CX计数器的计数循环指令LOOPlabel 循环指令 首先CX CX 1 然后判断 若CX 0 转移JCXZlabel 为0循环指令 如果CX 0 则转移label操作数采用相对短寻址方式还有LOOPZ LOOPE和LOOPNZ LOOPNE两条指令 92 2020 4 6 1 LOOP循环指令格式 LOOPlabel功能 1 CX CX 12 IFCX 0则转labelIFCX 0则顺序执行 93 2020 4 6 2 LOOPZ LOOPE当为零或相等时循环指令格式 LOOPZ 或LOOPE label功能 1 CX CX 12 IFCX 0且ZF 1则转labelCX 0或ZF 0则顺序执行 94 2020 4 6 3 LOOPNZ LOOPNE当不为零或不相等时循环指令格式 LOOPNZ 或LOOPNE label功能 1 CX CX 12 IFCX 0且ZF 0则转labelCX 0或ZF 1则顺序执行 95 2020 4 6 4 JCXZlabel测试CX的值为0则转移指令功能 如果CX 0则转label如果CX 0则顺序执行 在循环体内完成计数器CX的减一操作 在循环体外判断是否循环 循环体可能一次都不执行 96 2020 4 6 例 数据块传送 字节 ds sbuf es dbuf 1kb movcx 400h 设置循环次数 1K 1024 400Hmovsi offsetsbuf leasi sbuf 设置循环初值 SI指向数据段源缓冲区开始movdi offsetdbuf leadi sbuf DI指向附加段目的缓冲区开始 附加段 again moval si 循环体 实现数据传送moves di al 每次传送一个字节incsi SI和DI指向下一个单元incdiloopagain 循环条件判定 循环次数减1 不为0转移 循环 97 2020 4 6 例 数据块传送 字 movcx 200h 设置循环次数 1K 2 200Hmovsi offsetsbuf 设置循环初值 SI指向数据段源缓冲区开始movdi offsetdbuf DI指向附加段目的缓冲区开始 附加段 again movax si 循环体 实现数据传送moves di ax 每次传送一个字addsi 2 指向下一个 字 单元adddi 2loopagain deccxjnzagain 循环条件判定 循环次数减1 不为0转移 循环 98 2020 4 6 4 子程序调用和返回指令 子程序是完成特定功能的一段程序当主程序 调用程序 需要执行这个功能时 采用CALL调用指令转移到该子程序的起始处执行当运行完子程序功能后 采用RET返回指令回到主程序继续执行 转移指令有去无回子程序调用需要返回 其中利用堆栈保存返回地址 99 2020 4 6 主程序与子程序 CALLlabel 主程序 RET 子程序 回到CALL指令后的指令处 返回地址 100 2020 4 6 1 子程序调用指令CALL CALL指令分成4种类型 类似JMP CALLlabel 段内调用 直接寻址CALLr16 m16 段内调用 间接寻址CALLfarptrlabel 段间调用 直接寻址CALLfarptrmem 段间调用 间接寻址CALL指令需要保存返回地址 段内调用 入栈偏移地址IPSP SP 2 SS SP IP段间调用 入栈偏移地址IP和段地址CSSP SP 2 SS SP CSSP SP 2 SS SP IP 除了没有段内短调用外其它同JMP 101 2020 4 6 1 段内直接调用格式 CALLlabel执行的操作 SP SP 2 SP 1 SP IP IP IP D16 段内间接调用格式 CALLlabel执行的操作 SP SP 2 SP 1 SP IP IP EA 在执行CALL指令时IP的值已修改为CALL下一条指令在内存中的地址 所以进栈保护的是CALL指令后面一条指令的内存地址 当前IP值 102 2020 4 6 段间直接调用格式 CALLlabel执行的操作 SP SP 2 SP 1 SP CS SP SP 2 SP 1 SP IP IP 偏移地址 指令的第2 3个字节 CS 段地址 指令的第4 5个字节 当前CS值 当前IP值 103 2020 4 6 4 段间间接调用格式 CALLlabel执行的操作 SP SP 2 SP 1 SP CS SP SP 2 SP 1 SP IP IP EA CS EA 2 CALL指令寻找目的地址的方式与JMP指令基本相同 当前CS值 当前IP值 104 2020 4 6 2 子程序返回指令RET 根据段内和段间 有无参数 分成4种类型RET 无参数段内返回RETN 有参数段内返回RET 无参数段间返回RETN 有参数段间返回需要弹出CALL指令压入堆栈的返回地址段内返回 出栈偏移地址IPIP SS SP SP SP 2段间返回 出栈偏移地址IP和段地址CSIP SS SP SP SP 2CS SS SP SP SP 2 105 2020 4 6 段内返回RET IP SP 1 SP SP SP 2 2 段内带立即数返回RETN IP SP 1 SP SP SP 2SP SP N 位移量 PUSHAXPUSHBXCALLADDWR ADDWR RET4 106 2020 4 6 3 段间返回RET IP SP 1 SP SP SP 2CS SP 1 SP SP SP 2 107 2020 4 6 4 段间带立即数返回RETN IP SP 1 SP SP SP 2CS SP 1 SP SP SP 2SP SP N 16位移量 0 N 65535的偶数 108 2020 4 6 例 十六进制转换为ASCII码的子程序 子程序 将DL低4位的一位16进制数转换成ASCII码htoascprocanddl 0fh 只取DL的低4位ordl 30h DL高4位变成3cmpdl 39h 是0 9 还是0Ah 0Fh jbehtoend 是0 9 转移adddl 7 是0Ah 0Fh 加上7htoend ret 子程序返回htoascendp 主程序 调用子程序movdl 28hcallhtoasc 109 2020 4 6 5 中断指令和中断返回指令 中断 Interrupt 是又一种改变程序执行顺序的方法8086 8088CPU支持256个中断 每个中断用一个编号 中断向量号 区别中断指令有3条 INTNIRETINTO本节主要掌握类似子程序调用指令的中断调用指令INTN 进而掌握系统功能调用 110 2020 4 6 1 中断指令 一般格式 INTN 中断调用指令 产生N号中断 主程序使用可实现软件中断 其中N表示中断向量号 标志寄存器入栈 一般格式 INTO功能 对溢出情况进行中断响应 2 溢出中断指令 111 2020 4 6 在执行溢出中断指令INTO时 若溢出标志OF为1 则产生一个向量号为4的内部中断 被称为溢出中断 INT4 112 2020 4 6 3 中断返回指令 一般格式 IRET 中断返回指令 实现中断返回 中断服务程序使用 比RET多了恢复标志寄存器内容的工作 113 2020 4 6 五 串操作指令 用一条指令实现对一串数据或字符的操作 字符或数据的个数在CX中 每执行一次CX自动减1 直至减到零串操作自动停止 源操作数在DS SI 中 目的操作数在ES DI 中 源操作数和目的操作数都在内存中 是唯一一条从内存到内存的指令 DF 1 地址自动由高至低减量 进行串运算 DF 0 地址自动由低至高增量 进行串运算 114 2020 4 6 五 串操作类指令 8086的串操作类指令能对内存中一个连续区域的数据 如数组 字符串等 进行传送 比较等操作 指令有 传送数据串 MOVS STOS LODS检测数据串 CMPS SCAS重复前缀 REP REPZ REPNZ串操作指令采用了特殊的寻址方式利用循环程序也可以实现串操作指令的功能 115 2020 4 6 说明 源操作数用寄存器SI间接寻址 默认在数据段DS中 即DS SI 允许段超越 目的操作数用寄存器DI间接寻址 默认在附加段ES中 即ES DI 不允许段超越 每执行一次串操作 源地址指针SI和目的地址指针DI将自动修改 1或 2 116 2020 4 6 对于以字节为单位的数据串 指令助记符用B结尾 操作 地址指针应该 1对于以字为单位的数据串 指令助记符用W结尾 操作 地址指针应该 2当DF 0 执行CLD指令 地址指针应该 1或 2当DF 1 执行STD指令 地址指针应该 1或 2 117 2020 4 6 1 串传送指令MOVS 实现对数据串的传送 可以配合REP重复前缀 它们不影响标志 串传送指令MOVS将数据段中的一个字节或字数据 传送至附加段的主存单元 MOVSB MOVSBdest src 字节串传送 ES DI DS SI 然后 SI SI 1 DI DI 1MOVSW 字串传送 ES DI DS SI 然后 SI SI 2 DI DI 2 MOVAL SI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 探索教育科技企业的数字化商业机会
- 2025植物性饲料买卖合同
- 2025新能源产业园区环境保护与环境保护技术政策投资产业发展趋势解读报告
- 农产品品牌建设资金申请项目市场前景与竞争分析报告
- 幼儿园数字化美术教育工具的发展趋势与挑战
- 以市场为导向的职场人数字化技能提升策略
- 基于数产融合的数字化学习模式研究-以教育行业为例
- 如何运用数字化手段优化客户教育内容
- 亲子乐园经营模式与盈利模式探讨
- 健康科技的明天患者管理的数字化转型
- 初三数学总复习教学策略课件
- 一年级语文下册识字表(可打印最全版本)
- 结晶葡萄糖生产工艺简介课件
- 危大工程验收记录表(模板工程)
- 中班科学活动:风车转转转课件-2
- 医院职能部门监管及持续改进记录表(DOC57)
- 质量整改通知单(样板)
- 2022年教学教材《石油裂解与乙烯》精品优秀教案
- 八年级地理上册《第一章中国的疆域与人口》教案湘教
- 品质异常8D改善报告(杂项)
- 深圳城市更新工改工专题研究报告
评论
0/150
提交评论