分享
分享赚钱 收藏 举报 版权申诉 / 46

类型Intel汇编_Chapter_07_整数算术指令.ppt

  • 上传人:dzzj200808
  • 文档编号:5750638
  • 上传时间:2019-03-15
  • 格式:PPT
  • 页数:46
  • 大小:417.50KB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    Intel汇编_Chapter_07_整数算术指令.ppt
    资源描述:

    1、第7章 整数算术指令,要点:,简介 移位和循环移位指令 移位和循环移位的应用 乘法和除法指令 扩展加法和减法 ASCII和未压缩十进制算术指令,1. 简介,如何使用移位和循环移位指令移动数字的若干位? 为什么计算机能实现大整数的加减法? 编译器如何将复杂的表达式分解并翻译成独立的机器语言指令的? 在将表达式翻译成汇编语言的时候如何使用运算符优先级和寄存器优化规则?,2. 移位和循环移位指令,SHL/SHR:逻辑左右移位 SAL/SAR:算术左右移位 ROL/ROR:循环左右移位 RCL/RCR:带进位的循环左右移位 SHLD/SHRD:双精度左右移位,所有指令都影响CF和OF,SHL指令,SH

    2、L(shift left):对目的操作数执行逻辑左移操作,低位以0填充,移出的最高位被送到CF中;SHL 目的操作数,移位位数格式:SHL reg/mem,imm8/CL,例1:mov bl,8fhshl bl,1,SHL指令,快速乘法,SHR指令,SHR(shift right):对目的操作数执行逻辑右移操作,移出的数据位以0填充,最低位被送到CF中;SHR 目的操作数,移位位数格式:SHR reg/mem,imm8/CL,例2:mov al,0d0hshr al,1,快速除法(无符号),SHR指令,SAL指令与SHL指令等价; SAR指令:用最高位填充空出的位,最低位拷贝至CF; 比较SA

    3、R与SHR:,SAL和SAR指令,MOV AL, 0F0H SAR AL, 1,MOV AL, 0F0H SHR AL, 1,快速除法(有符号),ROL指令,ROL(rotate left)指令向左移动,并将最高位同时拷贝到CF和最低位中;,MOV AL, 40H ROL AL, 1 ROL AL, 1 ROL AL, 1,MOV AL, 26H ROL AL, 4,交换一个字节的高4位和低4位!,ROR指令,ROR(rotate right)指令向右移动,并将最低位同时拷贝到CF和最高位中;,MOV AL, 01H ROR AL, 1 ROR AL, 1,RCL和RCR指令,RCL(rota

    4、te carry left)指令按位左移,并将CF拷贝到最低有效位,然后将最高有效位拷贝至CF中;,CLC MOV BL, 88H RCL BL, 1 RCL BL, 1,.data testval byte 01101010b .code shr testval, 1 jc quit rcl testval, 1,RCL和RCR指令,RCR(rotate carry right)指令按位右移,并将CF拷贝到最高有效位,然后将最低有效位拷贝至CF中;,STC MOV AH, 10H RCR AH, 1,SHLD/SHRD指令,SHLD (shift left double)指令将目的操作数左移

    5、指定的位数;左移空出来的位用源操作数的高位来填充; SHLD 目的操作数,源操作数,移位位数 格式: SHLD reg16/32, reg16/32, imm8/CL SHLD mem16/32, mem16/32, imm8/CL,SHLD/SHRD指令,SHRD (shift right double)指令将目的操作数右移指定的位数;右移空出来的位用源操作数的低位来填充; SHRD 目的操作数,源操作数,移位位数 格式: SHRD reg16/32, reg16/32, imm8/CL SHRD mem16/32, mem16/32, imm8/CL,SHLD/SHRD指令,将wval左移

    6、4位并且将ax的高4位插入到wval的低4位中 .data wval word 9ba6h .code mov ax, 0ac3bh shld wval, ax, 4 ; shrd wval, ax, 4,3. 移位和循环移位的应用,多双字移位 二进制乘法 显示二进制位 分离位串,多双字移位,例子:一个包含三个双字的数组内所有位集体向右移动1位: 将ESI设置为array的偏移值; 将ESI+8位置处的双字右移一位,最低位拷贝到CF中; 将ESI+4处的值右移一位,最高位以CF值填充,最低位拷贝到CF中; 将ESI+0处的双字右移一位,最高位以CF值填充,最低位拷贝到CF中;,二进制乘法,为了

    7、应用SHL,将任意二进制乘数分解成2的幂的和: EAX * 36 = EAX * 32 + EAX * 4= EAX * 25 + EAX * 22,显示二进制位,字节数据在每次左移的时候,最高位都会被拷贝至CF中,我们可以利用这一点!,分离位串,将要提取的位移位到寄存器的最低部分,然后清除不相关的位。,4. 乘法和除法指令,无符号乘法MUL指令 有符号乘法IMUL指令 无符号除法DIV指令 有符号整数除法 算术表达式的实现,MUL指令,MUL指令:无符号乘法指令将8位、16位、32位的操作数与AL、AX、EAX相乘。单操作数指令 指令格式: MUL r/m8 ;AX MUL r/m16 ;D

    8、X:AX MUL r/m32 ;EDX:EAX,MUL指令,mov al , 5h mov bl , 10h mul bl,被乘数是AL,乘积被放入AX中 根据乘积中高半部分是否为0,设置或清除CF位和OF位 因为处理的是无符号数,所以只关心CF标志位,AX=0050H CF = 0,.data val1 word 2000h val2 word 0100h .code mov ax , val1 mul val2,MUL指令,被乘数是AX,乘积被放入DX:AX中; 根据乘积中高半部分是否为0,设置或清除CF位和OF位; 因为处理的是无符号数,所以只关心CF标志位;,AX=0000H DX=0

    9、020H CF = 1,MUL指令,mov eax , 12345h mov ebx , 1000h mul ebx,被乘数是EAX,乘积被放入EDX:EAX中; 根据乘积中高半部分是否为0,设置或清除CF位和OF位; 因为处理的是无符号数,所以只关心CF标志位;,EAX = 12345000H EDX = 00000000H CF = 0,IMUL指令,IMUL指令:有符号乘法指令保留乘积的符号位 指令格式: 单操作数 IMUL r/m8 ;AX IMUL r/m16 ;DX:AX IMUL r/m32 ;EDX:EAX,双操作数 会根据目的操作数的大小裁减乘积 如果有效位丢失,则设置CF和

    10、OFIMUL r16/32, r/m16/32 IMUL r16/32,imm8IMUL r/m16/32,imm16/32 三操作数IMUL r16/32,r/m16/32,imm8IMUL r16/32,r/m16/32,imm16/32,IMUL指令,mov al , 48 mov bl , 4 imul bl,被乘数是AL,乘积被放入AX中 根据乘积中高半部分是不是低半部分的扩展,设置或清除CF位和OF位 因为处理的是有符号数,所以关心OF标志位,IMUL指令,AX=00C0H OF = 1,mov al , -4 mov bl , 4 imul bl,AX=FFF0H OF = 0,

    11、mov ax ,-16 mov bx , 2 imul bx,ax,被乘数是BX,乘积被放入BX中 根据乘积中的有效位是否被裁减,设置或清除CF位和OF位 因为处理的是有符号数,所以关心OF标志位,IMUL指令,BX=-32 OF = 0,mov ax ,-32000 imul ax,2,AX=0600H OF = 1,乘法操作的性能测试,编程用移位指令和乘法指令测试其性能。,DIV指令:无符号除法指令执行8位、16位、32位无符号除法单操作数指令被除数、商以及余数都有除数的大小决定,DIV指令,DIV指令,mov ax , 0083h mov bl , 2 div bl,除数是8位的,那么被

    12、除数就应该放入16位的AX中 商被放入AL中,余数被放入AH中,AL = 41H AH = 01H,DIV指令,mov dx , 0 mov ax , 8003h mov cx , 100h div cx,除数是16位时,那么被除数的高16位放入DX中,低16位放入AX中 商被放入AX中,余数被放入DX中,AX = 0080H DX = 0003H,.data dividend qword 000000080030020h divisor dword 00000100h .codemov edx , dword ptr dividend+4mov eax , dword ptr dividen

    13、ddiv divisor,EAX = 08003000H EDX = 00000020H,DIV指令,有符号除法,CBW、CWD、CDQ指令 IDIV指令 除法溢出,三条整数符号扩展的指令,CBW、CWD、CDQ指令 用于整数符号扩展 CBW指令将AL中的符号位扩展到AH中 CWD指令将AX中的符号位扩展到DX中 CDQ指令将EAX中的符号位扩展到EDX中,三条整数符号扩展的指令,.data byteVal sbyte -65 .codemov al,byteValcbw,.data wordVal sword -65 .codemov ax,wordValcwd,.data dwordVal

    14、 sdword -65 .codemov eax,dwordValcdq,IDIV指令,IDIV指令:有符号除法指令,指令格式DIV相同当执行8位除法指令前必须把被除数符号扩展到AH中; 当执行16位除法指令前必须把被除数符号扩展到DX中; 当执行32位除法指令前必须把被除数符号扩展到EDX中;,8位有符号除法,.data byteVal sbyte -48 .codemov al,byteValcbwmov bl , 5idiv bl,必须将被除数的符号位从AL扩展到AH 商被放入AL中,余数被放入AH中,AL = -9 AH = -3,16位有符号除法,.data wordVal swor

    15、d -5000 .codemov ax,wordValcwdmov bx , 256idiv bx,必须将被除数的符号位从AX扩展到DX 商被放入AX中,余数被放入DX中,AX = -19 DX = -136,32位有符号除法,.data dwordVal sword -5000 .codemov eax,dwordValcdqmov ebx , 256idiv ebx,必须将被除数的符号位从EAX扩展到EDX 商被放入EAX中,余数被放入EDX中,EAX = -195 EDX = +80,除法溢出,当除法产生的商太大而无法容纳在目的操作数中的时候,就会导致除法溢出 试图执行除0运算时 这会导

    16、致CPU触发一个中断,当前程序会被终止,算术表达式的实现,下列内存操作数均为32位整数: var4 = (var1 + var2) * var3 var4 = (var1 * 5) / (var2 3) var4 = (var1 * -5) / (-var2 % var3),5.扩展加法和减法,加减任意大小的数: ADC指令 扩展加法的例子 SBB指令,ADC指令,ADC指令将源操作数、目的操作数和进位标志CF相加 指令格式和MOV相同 结果 DL:AL,DX:AX,EDX:EAX,SBB指令,SBB指令从目的操作数中减去源操作数和进位标志CF 指令格式: SBB reg/mem , reg/mem/imm 结果 AX,DX:AX,EDX:EAX,

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:Intel汇编_Chapter_07_整数算术指令.ppt
    链接地址:https://www.docduoduo.com/p-5750638.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开