x86运算指令

x86指令详解

运算指令

乘法指令

  • 有符号乘指令

    • 单操作数的有符号乘指令
    格式: imul ops
    功能:字节乘法 (al) * ops --> ax 
          字乘法 (ax) * (ops) --> dx, ax
          双字乘法 (eax) * (ops) --> edx, eax
    注意: mov eax, 700000
            mov ebx, 100000
            imul ebx; 可以看出将乘法高位存储到 edx中,低位存储到eax中
    如果乘积的高位不是低位的符号扩展的话,CF = 1 OF = 1, 否则 CF = 0 OF = 0
    乘法指令不影响 SF ZF AF PF位            
    • 双操作数的有符号乘指令
    格式: imul opd, ops
    功能: (opd) * (ops) --> opd
    注意: opd可以是16/32位的寄存器, ops可以是同类型的寄存器,存储器操作数或者是立即数
    实例: 
    imul ax, bx
    imul eax, dword ptr [si]
    imul ax, 4
    • 三操作数的有符号乘指令
    格式: imul opd, ops, n
    功能: (ops) * n --> opd
    注意: opd可以是16/32位的寄存器, ops可以是同类型的寄存器,存储器操作数, n为立即数
    imul bx, ax, 10
    imul eax, dword ptr [si], 3
  • 无符号乘指令
格式: mul ops
功能: 字节乘法 (al) * (ops) --> ax
        字乘法 (ax) * (ops) --> dx, ax
        双字乘法 (eax) * (ops) --> edx, eax
如果高位不为0,则CF = 1 OF = 1, 否则CF = 0 OF = 0

符号扩展指令

在编写 mov si, al 语句的时候,操作数类型不一致出现错误
如果al 无符号数的话,可以使用一下方式替代
mov ah, 0
mov si, ax
如果al 是有符号的话,先判断 al 是正数还是负数,决定ah扩展为0还是 0ffh

  • 将字节转换为字指令
格式:cbw
功能:将 al 中的符号扩展到 ah 中
实例:
    mov al, 80h
    cbw ; ax = 0ff80h
  • 将字转换双字指令
格式: cwd
功能: 将 ax 中的符号扩展到 bx 中
实例:
    mov ax, 8000h
    cwd ; (dx) = 0ffff (ax) = 8000h
  • 带符号扩充传送
    movsx opd, ops
    将 ops 的符号位向前扩展成 opd

除法指令

  • 有符号除指令
格式:idiv ops
功能:字节除法 (ax) / (ops) --> al(商) ah(余数) ; 注意ah为0
        字除法 (dx, ax) / (ops) --> ax(商) dx(余数)   ;注意dx为0
        双字除法 (edx, eax) / (ops) --> eax(商) edx(余数) ;注意edx为0
实例:
    字节除法
    mov ax, 32;注意 ah需要为0 否则出错,  进行的是字节除法,被除数为 al
    mov bl, 2
    idiv bl
    自除法
    mov ax, 4000h
    cwd ;将ax 扩展为 dx, ax
    mov cx, 4
    idiv cx
  • 无符号除指令
格式: div ops
功能: 字节除法 (ax) / (ops) --> al(商) ah(余数)  ; ah为0
        字除法 (dx, ax) / (ops) --> ax(商) dx(余数) ; dx为0
        双字除法 (edx, eax) / (ops) --> eax(商) edx(余数) ; edx为0
实例:
    mov ax, 400
    mov dx, 0
    mov bx, 3
    idiv bx

你可能感兴趣的:(x86运算指令)