x86运算指令

来源:互联网 发布:jsp工资管理系统源码 编辑:程序博客网 时间:2024/05/23 02:28

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, bximul eax, dword ptr [si]imul ax, 4
    • 三操作数的有符号乘指令
    格式: imul opd, ops, n功能: (ops) * n --> opd注意: opd可以是16/32位的寄存器, ops可以是同类型的寄存器,存储器操作数, n为立即数imul bx, ax, 10imul 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
0 1