美文网首页
3.2 80×86汇编乘法和除法指令以及位数扩展

3.2 80×86汇编乘法和除法指令以及位数扩展

作者: 迎风布阵x | 来源:发表于2018-11-12 11:38 被阅读0次

    乘法指令

    • mul 源操作数
      源操作数可以是字节,字或双字,而且可以在存储器或寄存器中不能是立即数
      乘积结果以两倍操作数的空间存放

    源操作数
    字节 ax = al × 源操作数
    字 dx:ax = ax × 源操作数
    双字 edx = eax × 源操作数

    注意:
    如果乘积结果高位部分不为零,那么进位标志位CF和溢出标志位OF将置为1

    • imul 源操作数
      可以理解为带符号的mul指令。和mul指令类似,不过是有符号数的乘法指令
      用法与mul指令相同

    • imul 寄存器,源操作数
      源操作数可以在寄存器中,存储器中,或者是立即数
      另一个乘数在寄存器中,它也作为目的地址

    • imul 寄存器,源操作数,立即数
      第一个操作数-寄存器仅用来存放乘积。
      第二个操作数可能在寄存器中或者在存储器中。
      第三个操作数为立即数。
      第一个操作数和第二个操作数长度相同,都是16位或都是32位。如果乘积和目的寄存器长度一致,那么CF和OF清零,否则置1.


    除法指令

    • div 源操作数
      无符号数除法指令
    • idiv 源操作数
      有符号数除法指令
      源操作数就是除数,除数可以存放在寄存器或存储器中,但不能是立即数。idiv和div使用隐式的被除数(该操作数被除)。

    单操作数除法指令
    被除数长度默认是源操作数长度的两倍。例如,若源操作数是一个字长,则双字长度的被除数高16位存放在DX寄存器中,低16位存放在AX寄存器中

    源操作数(除数) 第二个操作数(被除数) 余数
    字节 AX AL AH
    DX:AX AX DX
    双字 EDX:EAX EAX EDX


    除法指令的两种常见错误

    1. 除数为零
    2. 商太大而不能存入单倍长的目的地址中(这时就要用到位数扩展)


    位数扩展(cdw,cwd,cdq用于有符号的除法指令)

    • 正的被除数高位必须用0扩展,负的被除数高位必须用1扩展
    指令 含义
    cbw(字节转换为字) 将AL寄存器中的二进制补码数扩展位AX中的字长
    cwd(字转换为双字) 将AX寄存器中的二进制补码数扩展为DX和AX中的双字
    cdq(将双字转换为四字) EAX -> EDX:EAX
    cwde(字 to 双字) AX -> EAX(不和除法指令配套使用)
    movzx 寄存器,源操作数 用0来扩展源操作数
    movsx 寄存器,源操作数 复制符号位来扩展源操作数

    说明:

    1. movzx和movsx指令源操作数可以存放在寄存器或存储器,源操作数可以是8位,16位,目的地址寄存器可以是16位或32位

    相关文章

      网友评论

          本文标题:3.2 80×86汇编乘法和除法指令以及位数扩展

          本文链接:https://www.haomeiwen.com/subject/tqgxfqtx.html