第三章算术运算.ppt_第1页
第三章算术运算.ppt_第2页
第三章算术运算.ppt_第3页
第三章算术运算.ppt_第4页
第三章算术运算.ppt_第5页
已阅读5页,还剩65页未读 继续免费阅读

下载本文档

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

文档简介

4算术运算类指令 实现二进制 和十进制 数据的四则运算1 加法运算 ADDADCINC2 减法运算 SUBSBBDECNEGCMPCMPXCHGCMPXCHG8D3 乘法运算 MULIMUL4 除法运算 DIVIDIV5 符号扩展 CBWCWD6 十进制调整 DAADASAAAAASAAMAAD本节要求 本节要求 四则运算是计算机经常进行的一种操作 算术运算指令也是经常使用的一类指令 请注意算术运算指令对标志的影响重点掌握 ADD ADCSUB SBBINC DECCMP比较熟悉 NEGMUL IMULDIV IDIV一般了解 CBWCWD认真理解 DAADASAAAAASAAMAAD 加法指令ADD add ADD指令将源与目的操作数相加 结果送到目的操作数 ADD指令按状态标志的定义相应设置0或1 ADDreg imm reg mem reg reg imm reg memADDmem imm reg mem mem imm reg ADD指令的相关指令 ADCSUB 加法实例 例 加法运算 操作 moval 0fbh al 0fbhaddal 07h al 02hmovwordptr 200h 4652h 200h 4652hmovbx 1feh bx 1fehaddal bl al 00haddwordptr bx 2 0f0f0h 200h 3742h 带进位加法指令ADC addwithcarry ADC指令将源与目的操作数相加 再加上当前进位CF标志 结果送到目的操作数 ADD指令按状态标志的定义相应设置0或1 ADCreg imm reg mem reg reg imm reg mem CFADCmem imm reg mem mem imm reg CF ADC指令主要与ADD配合 实现多精度加法运算 ADC指令的相关指令 ADDSBB 多字节加法 例无符号多字节加法运算 两个无符号的五字节十六进制数的加法运算 12345678ABH98765432FEH0AAAAAABA9H解1ADD与ADC配合解2只使用ADC指令 解1ADD与ADC配合DATASEGMENTFIRSTDB0AB 78H 56H 34H 12H 00HSECONDDB0FEH 32H 54H 76H 98HDATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVAL SECOND 0 ADDFIRST 0 ALMOVCX 4 循环4次 MOVSI 1 下标初始化为1L1 MOVAL SECOND SI ADCFIRST SI ALINCSI 为下一次循环做准备LOOPL1 循环未结束时 跳转到L1MOVAL 0 将最高位产生的进位送入ADCAL 0 目的地MOVFIRST SI ALMOVAX 4C00H 返回DOSINT21HCODEENDSENDSTART 解2只使用ADC指令DATASEGMENTFIRSTDB0AB 78H 56H 34H 12H 00HSECONDDB0FEH 32H 54H 76H 98HDATAENDSCODESEGMENTASSUMECS CODE DS DATASTART MOVAX DATAMOVDS AXMOVCX 5 循环5次MOVSI 0 下标初始化为0CLC 将CF清0 L1 MOVAL SECOND SI ADCFIRST SI ALINCSI 为下一次循环做准备LOOPL1 循环未结束时 跳转到L1MOVAL 0 将最高位产生的进位送入ADCAL 0 目的地MOVFIRST SI ALMOVAX 4C00H 返回DOSINT21HCODEENDSENDSTART 增量指令INC increment INC指令对操作数加1 增量 INC指令不影响进位CF标志 按定义设置其他状态标志 INCreg mem reg mem reg mem 1 相关指令 DEC incbxincbyteptr bx INC指令和DEC指令都是单操作数指令 他们主要用于对计数器和地址指针的调整 减法指令SUB subtract SUB指令将目的操作数减去源操作数 结果送到目的操作数 SUB指令按照定义相应设置状态标志 SUBreg imm reg mem reg reg imm reg memSUBmem imm reg mem mem imm reg SUB指令的相关指令 SBBADD 带借位减法指令SBB subtractwithborrow SBB指令将目的操作数减去源操作数 再减去借位CF 进位 结果送到目的操作数 SBB指令按照定义相应设置状态标志 SBBreg imm reg mem reg reg imm reg mem CFSBBmem imm reg mem mem imm reg CF SBB指令主要与SUB配合 实现多精度减法运算 SBB指令的相关指令 SUBADC 多字运算 例3 15 双字运算 Movax x ax存放X的低字Movdx x 2 DX存放X的高字Addax y X和Y的低字相加Adcdx y 2 X和Y的高字相加Addax 24 24Adcdx 0Subax z Z的低字Sbbdx z 2 Z的高字Movw ax 结果送回WMovw 2 dx 减量指令DEC decrement INC指令对操作数减1 减量 DEC指令不影响进位CF标志 按定义设置其他状态标志 DECreg mem reg mem reg mem 1 INC指令和DEC指令都是单操作数指令 他们主要用于对计数器和地址指针的调整 decsidecbyteptr si 求补指令NEG negative NEG指令对操作数执行求补运算 用零减去操作数 然后结果返回操作数 求补运算也可以表达成 将操作数按位取反后加1 NEG指令对标志的影响与用零作减法的SUB指令一样NEGreg mem reg mem 0 reg mem 例子 类似指令 NOT 例 求补运算 movax 0ff64hnegal ax ff9ch OF 0 SF 1 ZF 0 PF 1 CF 1subal 9dh ax ffffh OF 0 SF 1 ZF 0 PF 1 CF 1negax ax 0001h OF 0 SF 0 ZF 0 PF 0 CF 1decal 不影响CF ax 0000h OF 0 SF 0 ZF 1 PF 1 CF 1negax ax 0000h OF 0 SF 0 ZF 1 PF 1 CF 0 比较指令CMP compare CMP指令将目的操作数减去源操作数 按照定义相应设置状态标志 CMP指令执行的功能与SUB指令 但结果不回送目的操作数 CMPreg imm reg mem reg imm reg memCMPmem imm reg mem imm reg 类似指令 TEST 比较实例 例 比较AL是否大于100 cmpal 100 al 100jbbelow al 100 跳转到below执行subal 100 al 100 al al 100incah ah ah 1below 执行比较指令之后 可以根据标志判断两个数是否相等 大小关系等 所以 CMP指令后面常跟条件转移指令 根据比较结果不同产生不同的分支 CMPXCHG比较并交换指令格式 CMPXCHGDST SRC功能 将累加器AC AL AX EAX 与DST比较 如果相等 则将 DST SRC 并设置ZF 1 否则将 AC DST 并设置ZF 0 CMPXCHG8B比较并交换8字节指令格式 CMPXCHG8BDST功能 将EAX和EDX中的64位字与DST比较 如果相等 则将 DST ECX EBX 并设置ZF 1 否则将 EDX ECX DST 并设置ZF 0 这两条指令只影响ZF位 对其它位没有影响 乘法指令 无符号数乘法MULr8 m8 无符号字节乘法 AX AL r8 m8MULr16 m16 无符号字乘法 DX AX AX r16 m16MULR32 M32 无符号双字乘法 EDX EAX EAX r32 m32有符号数乘法IMULSRC 与MUL的操作相同 但必需是带符号数 乘法指令的功能 乘法指令分无符号和有符号乘法指令 MUL和IMUL乘法指令的源操作数显式给出并且不为立即数 隐含使用一个操作数AX和DX 字节量相乘 AL与r8 m8相乘 得到16位的结果 存入AX中 字量相乘 AX与r16 m16相乘 得到32位的结果 其高字存入DX 低字存入AX中 字量相乘 AX与r32 m32相乘 得到64位的结果 其高双字存入EDX 低双字存入EAX中 乘法指令利用OF和CF判断乘积的高一半是否具有有效数值 说的更清楚一些 乘法指令对标志的影响 乘法指令如下影响OF和CF标志 MUL指令 若乘积的高一半 AH或DX 为0 则OF CF 0 否则OF CF 1 IMUL指令 若乘积的高一半是低一半的符号扩展 则OF CF 0 否则均为1 乘法指令对其他状态标志没有定义 指令执行后这些标志是任意的 不可预测 就是谁也不知道是0还是1 对标志没有影响是指令的执行不改变标志的状态 除法指令 无符号除法DIVr8 m8 字节除法 AX r8 m8的商存入AL 余数存入AHDIVr16 m16 字除法 DX AX r16 m16的商存入AX 余数存入DXDIVr32 m32 双字除法 EDX EAX r16 m16的商存入EAX 余数存入EDX有符号除法IDIVSRC 与MUL的操作相同 但必需是带符号数 除法指令的功能 除法指令分无符号和有符号除法指令 DIV和IDIV除法指令的除数显式给出 不能为立即数 隐含使用一个操作数AX和DX作为被除数 字节量除法 AX除以r8 m8 8位商存入AL 8位余数存入AH 字量除法 DX AX除以r16 m16 16位商存入AX 16位余数存入DX 双字量除法 EDX EAX除以r32 m32 32位商存入EAX 32位余数存入EDX 除法指令对标志没有定义 除法指令会产生结果溢出 说的更清楚一些 除法错中断 当被除数远大于除数时 所得的商就有可能超出它所能表达的范围 如果存放商的寄存器AL AX EAX不能表达 便产生溢出 8086CPU中就产生编号为0的内部中断 除法错中断 对DIV指令 除数为0 或者在字节除时商超过8位 或者在字除时商超过16位 则发生除法溢出 对IDIV指令 除数为0 或者在字节除时商不在 128 127范围内 或者在字除时商不在 32768 32767范围内 则发生除法溢出 符号扩展指令 CBW 字节转换为字 AL的符号扩展至AH 即如AL的最高有效位是0 则AH 00 AL的最高有效位为1 则AH FFH AL不变 CWD 字转换为双字 AX的符号扩展至DX 即如AX的最高有效位是0 则DX 00 AX的最高有效位为1 则DX FFH AX不变 什么是符号扩展给个实例吧符号扩展指令常用于获得倍长的数据 如被除数符号扩展指令不影响标志位 符号扩展的概念 符号扩展是指用一个操作数的符号位 即最高位 形成另一个操作数 后一个操作数的各位是全0 正数 或全1 负数 符号扩展不改变数据大小 例如 对于数据64H 表示数据100 其最高位D7为0 符号扩展后高8位都是0 成为0064H 仍表示数据100 对于数据ff00H 表示有符号数 256 其最高位D15为1 符号扩展后高16位都是1 成为ffffff00H 仍表示有符号数 256 例2 23 符号扩展 moval 80h al 80hcbw ax ff80haddal 255 al 7fhcbw ax 007fh 例2 24 有符号数除法AX BX cwdidivbx 本例中 利用符号扩展指令得到了除法指令所需要的倍长于除数的被除数 对无符号数除法应该采用直接使高8位或高16位清0的方法 获得倍长的被除数 十进制调整指令 压缩BCD码就是通常的8421码 它用4个二进制位表示一个十进制位 一个字节可以表示两个十进制位 即00 99 非压缩BCD码用8个二进制位表示一个十进制位 只用低4个二进制位表示一个十进制位0 9 高4位任意 通常默认为0 十进制数调整指令对二进制运算的结果进行十进制调整 以得到十进制的运算结果 他分成压缩BCD码和非压缩BCD码调整 BCD码 一位十进制数用4位二进制编码来表示 二进制编码的十进制数 BCD BinaryCodedDecimal 常用的是BCD码是8421BCD码 它用4位二进制编码的低10个表示0 9这十个数字 8086支持压缩BCD码和非压缩BCD码的调整运算 真值864二进制编码08H40H压缩BCD码08H64H非压缩BCD码08H0604H 压缩BCD码加 减调整指令 ADDAL i8 r8 m8 ADCAL i8 r8 m8 DAA AL 将AL的加和调整为压缩BCD码 SUBAL i8 r8 m8 SBBAL i8 r8 m8 DAS AL 将AL的减差调整为压缩BCD码 使用DAA或DAS指令前 应先执行以AL为目的操作数的加法或减法指令DAA和DAS指令对OF标志无定义 按结果影响其他标志 例如CF反映压缩BCD码相加或减的进位或借位状态请看实例 压缩BCD码的加减运算 例2 25 moval 68h al 68h 压缩BCD码表示真值68movbl 28h bl 28h 压缩BCD码表示真值28addal bl 二进制加法 al 68h 28h 90hdaa 十进制调整 al 96h 实现压缩BCD码加法 68 28 96moval 68h al 68h 压缩BCD码表示真值68movbl 28h bl 28h 压缩BCD码表示真值28subal bl 二进制减法 al 68h 28h 40hdas 十进制调整 al 40h 实现压缩BCD码减法 68 28 40 非压缩BCD码加 减调整指令 ADDAL i8 r8 m8 ADCAL i8 r8 m8 AAA AL 将AL的加和调整为非压缩BCD码 AH AH 调整的进位 SUBAL i8 r8 m8 SBBAL i8 r8 m8 AAS AL 将AL的减差调整为非压缩BCD码 AH AH 调整的借位 使用AAA或AAS指令前 应先执行以AL为目的操作数的加法或减法指令AAA和AAS指令在调整中产生了进位或借位 则AH要加上进位或减去借位 同时CF AF 1 否则CF AF 0 他们对其他标志无定义请看实例 非压缩BCD码的加减运算 movax 0608h ax 0608h 非压缩BCD码表示真值68movbl 09h bl 09h 非压缩BCD码表示真值9addal bl 二进制加法 al 08h 09h 11haaa 十进制调整 ax 0707h 实现非压缩BCD码加法 68 9 77movax 0608h ax 0608h 非压缩BCD码表示真值68movbl 09h bl 09h 非压缩BCD码表示真值9subal bl 二进制减法 al 08h 09h ffhaas 十进制调整 ax 0509h 实现非压缩BCD码减法 68 09 59 非压缩BCD码乘 除调整指令 MULr8 m8 AAM AX 将AX的乘积调整为非压缩BCD码 AAD AX 将AX中非压缩BCD码扩展成二进制数 DIVr8 m8 AAM指令跟在字节乘MUL之后 将乘积调整为非压缩BCD码AAD指令跟在字节除DIV之前 先将非压缩BCD码的被除数调整为二进制数AAM和AAD指令根据结果设置SF ZF和PF 但对OF CF和AF无定义请看实例 非压缩BCD码的乘除运算 movax 0608h ax 0608h 非压缩BCD码表示真值68movbl 09h bl 09h 非压缩BCD码表示真值9mulbl 二进制乘法 al 08h 09h 0048haam 十进制调整 ax 0702h 实现非压缩BCD码乘法 8 9 72movax 0608h ax 0608h 非压缩BCD码表示真值68movbl 09h bl 09h 非压缩BCD码表示真值9aad 二进制扩展 ax 68 0044hdivbl 除法运算 商al 07h 余数ah 05h 实现非压缩BCD码除法 68 9 7 余5 2 4节总结 四则运算是计算机经常进行的一种操作 算术运算指令也是经常使用的一类指令 这一节要重点掌握 ADD ADCSUB SBBINC DECCMP8086除直接支持二进制数的算术运算 还提供对BCD码运算的调整指令 实现了间接的十进制算术运算操作 请看表2 4 进行简单的综合 表2 38086支持的4种数据类型的算术运算 2 5位操作类指令 以二进制位为基本单位进行数据的操作1 逻辑运算 ANDORXORNOTTEST2 移位 SHLSHRSAR3 循环移位 ROLRORRCLRCR4 双精度移位指令 SHLDSHRD5 位测试并修改指令BTBTSBTRBTC6 位扫描指令BSFBSR这是一类常用的指令 都应该特别熟悉 同时 注意这些指令对标志位的影响 逻辑与指令AND 对两个操作数执行逻辑与运算 只有相 与 的两位都是1 结果才是1 否则 与 的结果为0 逻辑与的结果送到目的操作数 AND指令设置CF OF 0 根据结果设置SF ZF和PF状态 而对AF未定义 逻辑或指令OR 对两个操作数执行逻辑或运算 只要相 或 的两位有一位是1 结果就是1 否则 或 的结果为0 逻辑或的结果送到目的操作数 OR指令设置CF OF 0 根据结果设置SF ZF和PF状态 而对AF未定义 逻辑异或指令XOR 对两个操作数执行逻辑异或运算 只有相 异或 的两位不相同 结果才是1 否则 异或 的结果为0 逻辑异或的结果送到目的操作数 XOR指令设置CF OF 0 根据结果设置SF ZF和PF状态 而对AF未定义 逻辑非指令NOT 对一个操作数执行逻辑非运算 按位取反 原来是 0 的位变为 1 原来是 1 的位变为 0 NOT指令是一个单操作数指令NOT指令不影响标志位NOT指令易于NEG指令混淆例子1例子2 NOTreg mem reg mem reg mem 逻辑运算 例2 28 moval 45handal 31h 逻辑与al 01h moval 45horal 31h 逻辑或al 75h moval 45hxoral 31h 逻辑异或al 74h moval 45hnotal 逻辑非al bah 逻辑指令的应用 例2 29 AND指令可用于复位某些位 同0相与 不影响其他位 只需要将源 操作数设置成立即数 并把需要清0的位置0 其余的置1 andbl 11110110B 将BL中D3和D0位清0 其他位不变 OR指令可用于置位某些位 同1相或 不影响其他位 只需要将源 操作数设置成立即数 并把需要置1的位置1 其余的置0 orbl 00001001B 将BL中D3和D0位置1 其他位不变 XOR指令可用于求反某些位 同1相异或 不影响其他位 只需要将源操作数设置成立即数 并把需要取反的位置1 其余的置0 xorbl 00001001B 将BL中D3和D0位求反 其他位不变 测试指令TEST 对两个操作数执行逻辑与运算 只有相 与 的两位都是1 结果才是1 否则 与 的结果为0 测试指令进行逻辑与的结果不回送目的操作数 TEST指令设置CF OF 0 根据结果设置SF ZF和PF状态 而对AF未定义 功能与例子 例2 30 测试某些位为0或1 testal 01h 测试AL的最低位D0jnzthere 标志ZF 0 即D0 1 则程序转移到there 否则ZF 1 即D0 0 顺序执行there TEST指令通常用于检测一些条件是否满足 但又不希望改变原操作数的情况 这条指令之后 一般都是条件转移指令 目的是利用测试条件转向不同的程序段 要测试某位为1 只需要将源操作数设置成立即数 并把需要测试的位置1 其余的置0 再测试结果是否为0 移位指令 shift 移位指令将操作数移动一位或多位 分成逻辑移位和算术移位 分别具有左移或右移操作 SHLreg mem 1 CL 逻辑左移 最低位补0 最高位进入CF 移位指令的功能见图2 7reg mem是被移位的操作数1 CL表示移位次数 SHRreg mem 1 CL 逻辑右移 最低位进入CF 最高位补0 SARreg mem 1 CL 算术右移 最低位进入CF 最高位不变 移位指令对标志的影响移位指令的实例2 31移位指令的应用例2 32 算术左移SAL与逻辑移位SHL完全一样 实为同一条指令 图2 7移位指令的功能 循环 移位指令的操作数 移位指令的第一个操作数是指定的被移位的操作数 可以是寄存器或存储单元 后一个操作数表示移位位数 该操作数为1 表示移动一位 当移位位数大于1时 则用CL寄存器值表示 该操作数表达为CL 移位指令对标志的影响 移位指令按照移入的位设置进位标志CF根据移位后的结果影响SF ZF PF对AF没有定义如果进行一位移动 则按照操作数的最高符号位是否改变 相应设置溢出标志OF 如果移位前的操作数最高位与移位后操作数的最高位不同 有变化 则OF 1 否则OF 0 当移位次数大于1时 OF不确定 例2 31 移位指令的功能 movcl 4moval 0f0h al f0hshlal 1 al e0h CF 1 SF 1 ZF 0 PF 0 OF 0shral 1 al 70h CF 0 SF 0 ZF 0 PF 0 OF 1saral 1 al 38h CF 0 SF 0 ZF 0 PF 0 OF 0saral cl al 03h CF 1 SF 0 ZF 0 PF 1 操作 例2 32 移位指令可实现乘法功能 movsi axshlsi 1 si 2 axaddsi ax si 3 axmovdx bxmovcl 03hshldx cl dx 8 bxsubdx bx dx 7 bxadddx si dx 7 bx 3 ax 循环移位指令 rotate 循环移位指令将操作数从一端移出的位返回到另一端形成循环 分成不带进位和带进位 分别具有左移或右移操作 reg mem是被移位的操作数 1 CL表示移位次数循环移位指令对标志的影响循环移位指令的实例2 33 例2 34和例2 34 图2 8a b 图2 8c d 图2 8a b不带进位循环移位指令 图2 8c d带进位循环移位指令 循环移位指令对标志的影响 循环移位指令按照指令功能设置进位标志CF不影响SF ZF PF AF如果进行一位移动 则按照操作数的最高符号位是否改变 相应设置溢出标志OF 如果移位前的操作数最高位与移位后操作数的最高位不同 有变化 则OF 1 否则OF 0 当移位次数大于1时 OF不确定 循环移位指令的功能 例2 33 将DX AX中32位数值左移一位shlax 1rcldx 1 例2 34 把AL最低位送BL最低位但保持AL不变rorbl 1roral 1rclbl 1rolal 1 AH AL分别存放着非压缩BCD码的两位 现将它们合并成为一个压缩BCD码存入ALmovcl 4rolah cl 也可以用shlah claddal ah 也可以用oral ah 循环移位指令应用 例2 35 操作 386及后继机器新增32位双精度移位指令 双精度左移 SHLDDST REG CNT双精度右移 SHRDDST REG CNT说明 1 两个 双 字移位后得到的仍是一个 双 字 移位中SRC提供的移位值用于DST移位而引起的空缺 移位结果放在DST SRC不变 2 DST可以是除立即数以外的任一种寻址方式的字或双字数 SRC只能为REG 且与DST长度相同 CNT为1 31的立即数 或放在CL中 位测试并修改指令 1 BTDST SRC 把DST中由SRC指定位的值送标志位CF 2 BTSDST SRC 把DST中由SRC指定位的值送标志位CF 并将DST中的该位置1 3 BTRDST SRC 把DST中由SRC指定位的值送标志位CF 并将DST中的该位置0 4 BTCDST SRC 把DST中由SRC指定位的值送标志位CF 并将DST中的该位变反 注意 1 SRC的范围为1 312 DST可为MEM REG的字或双字 3 主要用于位测试 如判断某一位是1还是0 然后与JC JNC结合进行条件转移等 4 该组指令只影响CF标志位

温馨提示

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

评论

0/150

提交评论