pentiun指令系统之算术运算指令.ppt

上传人:sh****n 文档编号:6399161 上传时间:2020-02-24 格式:PPT 页数:60 大小:540.81KB
返回 下载 相关 举报
pentiun指令系统之算术运算指令.ppt_第1页
第1页 / 共60页
pentiun指令系统之算术运算指令.ppt_第2页
第2页 / 共60页
pentiun指令系统之算术运算指令.ppt_第3页
第3页 / 共60页
点击查看更多>>
资源描述
内容 提供加 减 乘 除 转换五种基本算术操作 利用十进制调整指令和ASCII调整指令对BCD码表示的十进制数进行算术运算 对带符号数与无符号数进行乘 除运算 一 加法指令 Addition 二 减法指令 Subtraction 三 乘法指令 Multiplication 四 除法指令 Division 五 类型转换指令 TypeTrans 六 BCD码运算指令 二 算术运算指令 Arithmetic 特点 大部分都影响标志位 不同指令影响不同 1 加 减法指令影响SF ZF AF PF CF OF 2 加1和减1指令不影响CF 3 乘法指令影响CF OF 4 除法指令使大部分标志位的状态不确定 5 对BCD码调整指令对标志位的影响不同 源操作数可以是立即数 通用寄存器或者是存储器中的数 目的操作数可为通用寄存器或存储器中的数 都可以用于字节 字 双字的运算 8位二进制数可以表示十进制数的范围 8位无符号十进制数的范围 0 2558位带符号十进制数的范围 128 12716位二进制数可以表示十进制数的范围 16位无符号十进制数的范围 0 6553516位带符号十进制数的范围 32768 32767字长为n位的带符号数 补码能表示范围为 2n 1 2n 1 1如果运算结果超出该范围 叫补码溢出 简称溢出 算术运算指令涉及的一些问题 以8位二进制数为例分析一下数的溢出与进位情况 下面分4种情况加以讨论 1 带符号数和无符号数都不溢出 2 无符号数溢出 3 带符号数溢出 4 带符号数和无符号数都溢出 1 带符号数和无符号数都不溢出 二进制数 看作无符号数 看作带符号数 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 4 11 15 4 11 15 相 加 标志 CF 0 OF 0 CF 0 OF 0 溢出 不溢出 不溢出 同符号数相加 结果符号与其相同 2 无符号数溢出 二进制数 看作无符号数 看作带符号数 0 0 0 0 0 1 1 1 1 1 1 1 1 0 1 1 0 0 0 0 0 0 1 0 7 251 258 7 5 2 相 加 标志 CF 1 OF 0 CF 1 OF 0 溢出 溢出 若考虑进位所代表的数值 结果正确 不溢出 异号数相加 不可能有溢出 CF 1 3 带符号数溢出 二进制数 看作无符号数 看作带符号数 0 0 0 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 9 124 133 9 124 133 相 加 标志 CF 0 OF 1 CF 0 溢出 不溢出 溢出 正正相加 结果为负 结果错 OF 1 4 带符号数和无符号数都溢出 二进制数 看作无符号数 看作带符号数 1 0 0 0 0 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 1 1 0 0 135 245 380 121 11 132 相 加 标志 CF 1 OF 1 CF 1 OF 1 溢出 溢出 若考虑进位CF所代表的数值 结果正确 溢出 负负相加 结果为正 结果错 CF 1 结论 1 带符号数相加溢出根据OF判断带符号数产生溢出 OF 1同符号数相加 结果符号与其相反 产生溢出 结果是错误的 OF 0没有产生溢出 结果是正确的 2 无符号数相加溢出根据CF判断无符号数产生溢出 CF 1无符号数相加产生溢出 但考虑进位所代表的数值后 结果并没有错 一 加法指令 Arithmetic 1 ADD Addition 加法指令2 ADC Addwithcarry 带进位加法指令3 XADD ExchangeAdd 字节交换加法指令4 INC Incrementby1 加1指令 1 ADD Addition 加法指令指令格式 ADDdest src dest dest src Src 立即数 寄存器 存储器 dest 寄存器 存储器 例 ADDCX 1000H 寄存器 立即数ADDDX SI 寄存器 寄存器ADD BX DI AX 寄存器 存储器ADDEAX BX 2000H 存储器 寄存器ADDBYTEPTR DI 30H 存储器 立即数 特点 可以进行8位 16位的无符号数和带符号数的加法运算 源操作数和目标操作数不能同时为存储器 不能为段寄存器 指令影响标志位的情况 OF 1 8位带符号数相加 和超出范围 128 127 16位带符号数相加 和超出范围 32768 32767 CF 1 8位无符号数相加 和超过255 16位无符号数相加 和超过65535 其他条件标志 SF AF PF ZF 根据定义设定 例MOVAL 7EH AL 7EHMOVBL 5BH BL 5BHADDAL BL AL 7EH 5BH D9H影响标志位的情况 SF 1 结果最高位 1ZF 0 结果不等于0AF 1 D3位向D4有进位PF 0 1 的个数为奇数CF 0 无进位OF 1 和超过 127 两个正数相加 结果为负 反之亦是 2 ADC Addwithcarry 带进位加法指令格式 ADCdest src dest dest src CFCF 进位标志CF的现行值 上条指令CF值 特点 与ADD同 用途 主要用于多字节运算中 类型举例 ADCCX 300 寄存器 立即数 CFADCAL BL 寄存器 寄存器 CFADCDX COUNT SI 寄存器 存储器 CFADCBLOCK DI BX 存储器 寄存器 CFADCBYTEPTRMEM 6 存储器 立即数 CF 用途举例 计算两个多字节数相加3B74AC60F8H 20D59E36C1H 两个多字节数存放在 DATA1 DATA2的开始单元 流程图 多字节数内存存放 程序 MOVCX 5MOVSI 0 清SICLC 清CFLOOPER MOVAL SI DATA2 ADC SI DATA1 ALINCSI SI 1 SI DECCX CX 1 CX JNZLOOPER CX 0转HLT 停机 3 XADD ExchangeAdd 字节交换加法指令格式 XADDdest src B W DW dest dest src dest 寄存器 存储器 不能是段寄存器 功能 将目的操作数送源操作数 相加的结果送目的操作数注 XADD指令的源操作数必须为寄存器 目的操作数可为寄存器或存储器XADDAX BXXADD 1000H EAX标志位影响情况 影响SF ZF AF PF OF 不影响CF 4 INC Incrementby1 加1指令格式 INCdest B W DW dest dest 1dest 寄存器 存储器 不能是段寄存器 功能 对指定的目标操作数 1 操作数单元 用途 用于在循环程序中修改地址指针和循环次数 标志位影响情况 影响SF ZF AF PF OF 不影响CF 操作数类型 可以是寄存器 存储器 不能是段寄存器 例 INCDL 8位寄存器 1INCSI 16位寄存器 1INCBYTEPTR BX SI 存储器 1 字节操作 INCWORDPTR DI 存储器 1 字操作 INCDS 错 二 减法指令 Subtraction 1 SUB Subtraction 减法指令2 SBB Subtractionwithborrow 带进位减法指令3 DEC Decrementby1 减1指令4 NEG Negate 求补指令5 CMP Compare 比较指令6 CMPXCHG Compare Exchange 7 CMPXCHG8B Compare Exchange8byte 1 SUB Subtraction 减法指令格式 SUBdest src dest dest src Src 立即数 寄存器 存储器 Dest 寄存器 存储器 例 SUBAL 37H 寄存器 立即数SUBEBX EDX 寄存器 寄存器SUBCX VAR1 寄存器 存储器SUBARRAY SI AX 存储器 寄存器SUBWORDPTRALPHA BX DI 512H 存储器减立即数这种指令影响标志位 AF CF OF PF SF ZF标志 2 SBB Subtractionwithborrow 带进位减法指令格式 SBBdest src dest dest src CFCF 进位标志CF的现行值 上条指令CF值 Src 立即数 寄存器 存储器 dest 寄存器 存储器 指令影响标志位 B W数运算情况同SBB用途 用于多字节数相减例 SBBBX 100H 寄存器 立即数 CFSBBECX EDX 寄存器 寄存器 CFSBBAL SI DATA1 寄存器 存储器 CFSBB BP DISP BL 存储器 寄存器 CFSBBBYTEPTR SI 6 96H 存储器 立即数 CF 多字节数的加减综合举例例 x y z均为32位数 分别存放在地址为X X 2 Y Y 2 Z Z 2的存储单元中 用指令序列实现w x y 24 z 结果放在W W 2单元中 MOVAX XMOVDX X 2ADDAX YADCDX Y 2 x yADDAX 24ADCDX 0 x y 24SUBAX ZSBBDX Z 2 x y 24 zMOVW AXMOVW 2 DX 结果存入W W 2单元说明 低16位加减用不带进位的指令 高16位的加减用带进位的指令 3 DEC Decrementby1 减1指令格式 DECdest B W DW dest dest 1dest 寄存器 存储器 不能是段寄存器 功能 对指定的目标操作数 1 操作数单元 用途 用于在循环程序中修改地址指针和循环次数 标志位影响情况 影响SF ZF AF PF OF 不影响CF DEC用途举例 MOVCX 0FFFFHCYC DECCXJNZCYCHLT 用于延时时间 4 NEG Negate 求补指令格式 NEGdest B W DW dest 0 dest dest 寄存器 存储器 操作 把操作数按位求反后末位 1 dest 0FFFFH dest 1影响标志 AF CF OF PF SF ZF CF 操作数为0时求补 CF 0 一般使CF 1 OF 对 128或 32768求补 OF 1 否则OF 0 应用举例 求绝对值在内存中 从AREA1开始存放100个带符号数 求各数的绝对值 并存于AREA2开始的单元 流程图 程序 LEASI AREA1LEADI AREA2MOVCX 100CHECK MOVAL SI ORAL AL AL 内容不变 置标志JNSNEXT SF 0转NEXTNEGAL 负数 求其正数的补码NEXT MOV DI AL 送目标INCSIINCDIDECCXJNZCHECKHLT 5 CMP Compare 比较指令格式 CMPdest src B W dest src 结果不送 但影响标志位 影响标志 AF CF OF PF SF ZF src 立即数 寄存器 存储器 dest 寄存器 存储器 例 CMPAL 0AH 寄存器与立即数比较CMPECX EDI 寄存器与寄存器比较CMPAX AREA1 寄存器与存储器比较CMP BX 5 ESI 存储器与寄存器比较CMPWORDPTRGAMMA 100H 存储器与立即数比较 用途 用比较指令来比较两个数之间的关系 两者是否相等 两个数中哪个大 1 根据ZF标志 判断两者是否相等 2 根据CF标志 判断两个无符号数的大小 3 用SF OF标志 判断二个带符号数的大小 1 根据ZF标志 可判断两者是否相等例 CMPAX BXZF 1 结果为0 两者相等ZF 0 结果不为0 两者不相等 2 根据CF标志 判断两个无符号数的大小例 比较AX BX寄存器 将大数 AX CMPAX BXJNCNEXT CF 0转NEXTXCHGAX BXNEXT 结论 CF 0 AX BX CF 1 AX BX 设 被比较二个带符号数分别为 A B分四种情况讨论 A 0 B 0 A0 B0 3 用SF OF标志 判断二个带符号数的大小 四种情况讨论 操作数以8位为例 分析以上四种情况得出如下结论 OF 0时 SF 0 则 A BSF OF 0SF 1 则 ABSF OF 0SF 0 则 ABSF OF 1 则A B 带符号数找最大值若自BLOCK开始的内存缓冲区中 有100个带符号数 找出最大值 并存放到MAX单元中 CMP指令应用举例 比较指令在使用时 一般在其后紧跟一条条件转移指令 根据比较结果决定转向 思路 第一个数取出 AX 取出第二个数 第二个字单元内容 与 AX 比较 AX 第二个数 不做交换 否则 第二个字单元内容 AX 再取第三个数 经过99次比较 在 AX 中得到最大数 编程 MOVBX OFFSETBLOCKMOVAX BX INCBXINCBXMOVCX 99AGAIN CMPAX BX JGNEXT 如ZF 0且SF OF 则转NEXTMOVAX BX NEXT INCBXINCBXDECCXJNEAGAINMOVMAX AX MAX单元存放最大值 小结 根据标志位来判断比较的结果 1 根据ZF判断两个数是否相等 若ZF 1 则两数相等 2 若两个数不相等 则分两种情况考虑 比较的是两个无符号数若CF 0 则被减数 减数 若CF 1 则被减数 减数 比较的是两个有符号数若OF SF 0 则被减数 减数 若OF SF 1 则被减数 减数 6 比较并交换CMPXCHG Compare Exchange 指令 格式 CMPdest src B W DW dest src 影响标志 ZF 功能 将目的操作数和累加器中的数相比较ZF 1 源操作数送目的操作数 ZF 0 目的操作数送累加器 例 CMPXCHG 1000H BL 7 比较并交换CMPXCHG8B Compare Exchange8B 指令 格式 CMPXCHG8Bdest 功能 将EDX EAX中的8个字节与存储器中的8个字节比较 如相等 则ZF 1 并将ECX EBX中的8个字节数据送目的操作数处 ZF 0 将目的操作数送EDX EAX 例 CMPXCHG 1000H BL 进行乘法时 8位 8位 16位乘积16位 16位 32位乘积 1 无符号数的乘法指令MUL MEM REG 格式 MULsrc操作 字节操作数 AX AL src 字操作数 DX AX AX src 双字操作数 EDX EAX EAX src 注意 一个操作数隐含在AL或AX或EAX中指令例子 MULBL AL BL 乘积在AX中MULCX AX CX 乘积在DX AX中MULDWORDPTR BX 三 乘法指令MUL IMUL Multiplication 格式与MUL指令类似 只是要求两操作数均为有符号数 指令例子 IMULBL AX AL BL IMULWORDPTR SI DX AX AX SI 1 SI 2 有符号数乘法指令IMUL 注意 MUL IMUL指令中 AL AX 为隐含的乘数寄存器 AX DX AX 为隐含的乘积寄存器 除CF和OF外 对其它标志位无定义 四 除法指令DIV IDIV Division 进行除法时 16位 8位 8位商32位 16位 16位商64位 32位 32位商对被除数 商及余数存放有如下规定 被除数商余数字节除法AXALAH字除法DX AXAXDX双字除法EDX EAXEAXEDX 格式 DIVsrc操作 字节操作 AL AX SRC 的商 AH AX SRC 的余数字操作 AX DX AX SRC 的商 DX DX AX SRC 的余数指令例子 DIVCLDIVWORDPTR BX 注 若除数为零或AL中商大于FFH 或AX中商大于FFFFH 则CPU产生一个类型0的内部中断 1 无符号数除法指令DIV 2 有符号数除法指令IDIV 格式 IDIVsrc操作与DIV类似 商及余数均为有符号数 且余数符号总是与被除数符号相同 注意 对于DIV IDIV指令AX DX AX 为隐含的被除数寄存器 AL AX 为隐含的商寄存器 AH DX 为隐含的余数寄存器 src不能为立即数 对所有条件标志位均无定义 除法运算要求被除数字长是除数字长的两倍 若不满足则需对被除数进行扩展 否则产生错误 对于无符号数除法扩展 只需将AH或DX清零即可 对有符号数而言 则是符号位的扩展 可使用符号扩展指令CBW CWD CWDE CDQ 关于除法操作中的字长扩展问题 例 写出34H 25H的程序段 MOVAL 34HMOVBL 25HCBW AL的符号扩展到AHIDIVBL 0034H 25H 结果为 AH 0FH AL 01H 五 BCD码运算的十进制调整指令 专用于对BCD码运算的结果进行调整包括 DAA AAA DAS AAS AAM AAD均为隐含寻址 隐含的操作数为AL和AH为何要对BCD码的运算结果进行调整 BCD码本质上是十进制数 即应遵循逢十进一的规则 而计算机是按二进制 十六进制 进行运算 并未按十进制规则进行运算 调整原理 先看一个例子例1 000010008 00000101 50000110113结果为0DH 而在BCD码中 只允许0 9这10个数字出现 0DH不代表任何BCD码 为什么会出现这种情况呢 原因在于BCD码是逢十进一 但计算机是逢十六进一 因此 应在个位补上6 促其产生进位 对上例的结果进行加6调整 00001101 0000011000010011 13 例2000010008 00001001 900010001 1117原因在于计算机在运算过程中 如遇到低4位往高4位产生进位时 此时AF 1 是按逢十六进一的规则 但BCD码要求逢十进一 因此只要产生进位 个位就会暗中丢失一个6 这就要进行加6调正 对上例的结果进行加6调整 00010001 0000011000010111 17 总的调整原理是 凡遇到某4位二进制码对应的BCD码大于9时 则加六进行调整 凡是低4位往高4位产生了进位时 则加6进行调整 1 压缩BCD码加法调整DAA 指令操作 调整方法 若AL的低4位 9 AF 1则 AL AL 6 AF 1若AL的高4位 9 CF 1则 AL AL 60H CF 1除OF外 DAA指令影响所有其它标志 DAA指令应紧跟在ADD或ADC指令之后 1 加法的十进制调整指令 两个压缩BCD码相加结果在AL中 通过DAA调整得到一个正确的压缩BCD码 例4 0100100048HMOVAL 48H 0111010074HMOVBL 74H10111100BCHADDAL BL 0110011066HDAA100100010122H 进位 进位 执行ADD后 AL BCH 高4位低4位均大于9 故DAA指令执行加66H调整 最后结果为 AL 22H CF 1 AF 1 本指令对在AL中的由两个未组合的BCD码相加后的结果进行调整 得到一个正确的未组合的BCD码 AAA指令只影响AF和CF 其余标志无定义 AAA指令应紧跟在ADD或ADC指令之后 AAA指令的操作如下 如果AL的低4位 9 AF 1 则 AL AL 6 AH AH 1 AF 1 AL AL 0FH CF AF否则AL AL 0FH 2 非压缩BCD码加法调整AAA 假定二数在内存中均是低位在前 高位在后 另留出5个单元存放相加的结果 内存中数据存放形式见下页图 例3 有两个多位十进制数2658和3619 以非压缩的BCD码形式存放在内存中 求二者之和 即2658 3619 06H 02H 09H 01H STRING1 STRING2 08H 05H 06H 03H 被加数 加数 数据段 8 5 6 2 9 1 6 3 SUM 结果 程序段为 LEASI STRING1 STRING1偏移地址送SILEADI STRING2 STRING2偏移地址送DILEABX SUM SUM偏移地址送BXMOVCX 4 循环4次CLC 清进位标志AGAIN MOVAL SI ADCAL DI 带进位加AAA 未压缩BCD码调正MOV BX AL 结果存入SUMINCSI 调整指针INCDIINCBXDECCX 循环计数器减1JNZAGAIN 若未处理完 则转AGAIN 1 压缩BCD码减法的十进制调正指令DAS对AL中由两个压缩BCD码相减的结果进行调整 调整操作为 若AL的低4位 9 AF 1 则 AL AL 6 且AF 1若AL的高4位 9 CF 1 则 AL AL 60H 且CF 1DAS对OF无定义 但影响其余标志位 DAS指令要求跟在减法指令之后 2 减法的十进制调整指令 2 非压缩BCD码减法的十进制调正指令AAS对AL中由两个非压缩的BCD码相减的结果进行调整 调整操作为 若AL的低4位 9或AF 1 则 AL AL 6 AH AH 1 AF 1 AL AL 0FH CF AF否则 AL AL 0FH 3 乘法的十进制调正指令AAM对AX中由两个非压缩BCD码相乘的结果进行调整 隐含的操作寄存器为AL和AH AAM跟在MUL指令之后使用 影响标志位PF SF ZF 其它无定义 例5 按十进制乘法计算7 8 程序段如下 MOVAL 07H AL 07HMOVCL 08H CL 08HMULCL AX 0038HAAM AH 05H AL 06H所得结果为非压缩的BCD码 4 除法的十进制调正指令AAD 对非压缩BCD除法运算进行调整 调整操作为 先对被除数和除数进行调整 再运算 AL AH 0AH AL AH 0隐含的操作寄存器为AH AL AAD要在DIV指令之前使用 影响标志位PF SF ZF 其它无定义 例6 按十进制乘法计算55 7 程序段如下 MOVAX 0505H AX 55BCDMOVCL 07H CL 7AAD AX 0037HDIVCL AH 6 AL 7所得结果为非压缩的BCD码 商7余6
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!