• 80X86指令总结


    一、数据传送指令

    指令名称

    汇编语句格式

    功能

    影响标志位

    传送
    move data
    mov opd, ops (ops) → opd;分为主存储器、通用寄存器、段寄存器,不可同时使用主存储器,类型要匹配:byte,word,dword
    带符号扩充的传送
    move with sign-extend
    movsx opd, ops 将ops的符号向前扩展成与opd相同的数据类型后 → opd
    ops不能为立即数,
    带0扩展的传送
    move with zero-extend
    movzx opd, ops 将ops的高位向前补0扩展成与opd相同的数据类型后 → opd
    数据交换
    exchange
    xchg opd, ops 将(opd)与(ops)交换
    源操作数不能是立即操作数
    32位寄存器字节交换
    byte swap
    bswap reg
    (reg,代表寄存器,下同)
    将从第一个与第四个字节交换,将第二个字节和第三个字节交换
    (按字节反序),32位寄存器
    交换并相加
    exchange and add
    xadd opd, ops 将(opd)与(ops)互换,(opd)+(ops) → opd af,of,pf,
    sf,zf,cf
    查表转换
    table look-up translation
    xlat ops 或 xlatb (ds:[bx/ebx+al]) → al (求和之前al作无符号扩展),
    一般把数表的首地址放到bx/ebx中,lea bx, buf  ;al就是在buf中的位置
    传送偏移地址
    load effective address
    lea reg,ops ops → reg
    传送偏移地址和数据段首地址
    load data segment register
    lds reg, ops (ops)→ reg   
    (ops+2/4)→ ds;ops一定是存储器地址,类型为dword/fword
    传送偏移地址和附加段首地址
    load far pointer to extra segment
    les/lfs/lgs reg, ops 同上,只是段寄存器分别为es,fs,gs
    传送偏移地址和堆栈首地址
    load stack segment
    lss reg, ops 同上,段寄存器为ss
    进栈
    push word/dword onto stack
    push ops
    pushw ops 或pushd ops
    16位段:(sp) – 2/4 → sp    (ops) → [sp]; 可以为两个字节,
    或四个字节32位段:(esp) – 2/4 → esp  (ops) → [esp]; 同上
    所有16位通用寄存器进栈
    pushall 16-bit general registers
    pusha (sp/esp) –2 → sp/esp 重复8次压入ax,cx,dx,bx,sp(指令执前),bp,si,di;是先改变sp/esp 再把数据写入
    所有32位通用寄存器进栈
    pushall 32-bit general registers
    pushad (sp/esp) – 4 → sp/esp 重复8次压入eax,ecx,edx,ebx,
    esp(指令执行前),ebp,esi,edi;是先改变sp/esp 再把数据写入
    出栈
    pop a word/dword frome the stack
    pop opd 16位段:[sp]→ (opd) ; (sp) + 2/4 → sp   ;可以为两个字节,或四个字节
    32位段:[esp]→ (opd) ; (esp) + 2/4 → esp ;  同上
    出栈到所有16位通用寄存器
    pop stack into all 16-bit registers
    popa 将栈顶的16个字节依次出栈到di,si,bp,丢弃2个字节,bx,dx,cx,ax,
    (sp/esp)+16 → sp/esp  
    出栈到所有32位通用寄存器
    pop stack into all 32-bit registers
    popad 将栈顶的16个字节依次出栈到edi,esi,ebp,丢弃4个字节,ebx,edx,ecx,eax,
    (sp/esp)+32 → sp/esp  
    标志进栈
    push flags onto stack
    pushf (sp/esp) – 2 → sp/esp
    (flags) → [sp/esp]
    扩展标志出栈
    push eflags onto stack
    pushfd sp/esp – 4 → sp/esp
    (eflags) → [sp/esp]
    标志出栈
    pop stack into flags
    popf [sp/esp] → flags
    sp/esp + 4 → sp/esp
    扩展标志出栈
    pop stack into eflags
    popfd [sp/esp] → eflags
    sp/esp + 4 → sp/esp
    标志传送到ah
    load ah from flags
    lahf (flags7-0) →  ah
    将ah传送到flags
    store ah into flags
    sahf (ah) → flags7-0 sf,zf,af,pf,cf
    输入
    input from port
    in opd, ops ([ops]) →  opd;
    opd只能是al、ax、eax;ops为立即数(<255)或者dx
    输出
    output to port
    out opd, ops (ops) → [opd];
    ops只能是al、ax、eax;opd为立即数(<255)或者dx

    二、算术运算指令

    指令名称

    汇编语句格式

    功能

    影响标志位

    加 1
    increment
    inc opd (opd) + 1 → opd af,of,pf,
    sf,zf

    addition
    add opd, ops (opd) + (ops) → opd af,of,pf,
    sf,zf
    带进位加
    add with carry
    adc opd, ops (opd) + (ops) + cf → opd af,of,pf,
    sf,zf
    减 1
    decrement
    dec opd (opd) – 1 → opd af,of,pf,
    sf,zf
    求补
    two's complement negation
    neg opd 0 – (opd) → opd af,of,pf,
    sf,zf

    subtract
    sub opd, ops (opd) – (ops) → opd af,of,pf,
    sf,zf
    带借位减
    subtract with borrow
    sbb opd, ops (opd) – (ops) – cf → opd af,of,pf,
    sf,zf
    比较
    compare
    cmp opd, ops (opd) – (ops)
    一般用于转移前的控制,应用于跳转
    af,of,pf,
    sf,zf
    无符号乘
    unsigned multiply
    mul ops 字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
    双字乘:(eax) * (ops) → edx:eax
    cf,of
    单操作数的有符号乘
    signed integer multiply
    imul ops 字节乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax;
    双字乘:(eax) * (ops) → edx:eax
    cf,of
    双操作数的有符号乘
    signed integer multiply
    imul opd, ops (opd) * (ops) → opd;opd可为16/32的寄存器,ops可为同类型的寄存器、存储器或立即数 cf,of
    三操作数的有符号乘
    signed integer multiply
    imul opd, ops, n (ops) * n → opd;同上,n为立即数 cf,of
    将字节转换成字
    convert byte to word
    cbw 将al中的符号扩展到ah中,数据的补码数值没有变
    将字转换成双字
    convert word to double word
    cwd 将ax中的符号扩展到dx的高位中
    将字转换成双字
    convert word to double word
    cwde 将ax中的符号扩展到eax的高位中
    将双字转换成4字
    convert double word to quadword
    cdq 将eax中的符号扩展到edx中
    无符号除
    unsigned divide
    div ops 字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商),
    dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数)
    af,of,pf,
    cf,sf,zf
    有符号除
    signed integer divide
    idiv ops 字节除:(ax)/(ops)→al(商),ah(余数);字除:(dx:ax)/(ops) → ax(商),
    dx(余数) 双字除: (edx:eax)/(ops) → eax(商),edx(余数)
    af,of,pf,
    cf,sf,zf

    三、控制转移指令

    指令名称

    汇编语句格式

    功能

    影响标志位

    相等/等于0转移
    jump if equal/zero
    je/jz 标号 zf = 1 转移
    不相等/不等于0转移
    jump if not equal/zero
    jne/jnz 标号 zf = 0 转移
    为负转移
    jump if sign
    js 标号 sf = 1 转移
    为正转移
    jump if positive
    jns 标号 sf = 0 转移
    溢出转移
    jump if overflow
    jo 标号 of = 1 转移
    无溢出转移
    jump if not overflow
    jno 标号 of = 0 转移
    有进位转移
    jump if carry
    jc 标号 cf = 1 转移
    无进位转移
    jump if not carry
    jnc 标号 cf = 0 转移
    偶检验/偶性转移
    jump if parity/parity even
    jp/jpe 标号 pf = 1 转移
    奇检验/奇性转移
    jump if no parity/parity odd
    jnp/jpo 标号 pf = 0 转移
    小于/不大于也不等于 转移
    jump if less/not greater nor equal
    jl/jnge 标号 sf ≠ of 转移
    不小于/大于或等于转移
    jump if not less/greater or equal
    jnl/jge 标号 sf = of 转移
    大于/不小于或不等于转移
    jump if greater/not less or not equal
    jg/jnle 标号 sf = of, 且zf = 0 转移
    不大于/小于或等于转移
    jump if not greater /less or equal
    jng/jle 标号 sf ≠ of 或zf =  1 转移
    低于/不高于且不等于转移(无符号)
    jump if below/not above not equal
    jb/jnae 标号 cf = 1 转移
    不低于/高于或等于转移(无符号)
    jump if now below/above or equal
    jnb/jae 标号 cf = 0 转移
    高于/不低于且比等于转移(无符号)
    jump if above/not below nor equal
    ja/jnbe 标号 cf = 0 且 zf = 0 转移
    不高于/低于或等于
    jump if not above/below or equal
    jna/jbe 标号 cf = 1 或 zf =1 转移
    无条件转移
    jump unconditionally
    jmp opd 相对转移:(opd)+ip/eip → ip/eip 近转移:(opd) → ip/eip
    远转移:(opd) → ip/eip, (opd+2/4) → cs,或根据描述符决定
    cx为0转移
    jump if cx is zero
    jcxz 标号
    或jecxz 标号
    若(cx/ecx) = 0 转移
    循环
    loop
    loop 标号
    或loopw/loopd 标号
    (cx/ecx) – 1 → cx/ecx, 若(cx/ecx) ≠ 0 则转移
    相等/为0循环
    loop if equal/zero
    loope/loopz 标号 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 1 则转移
    不相等/不为0循环
    loop if not equal/not zero
    loopne/loopnz 标号 (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 0 则转移
    检查数组下标边界
    check array index against bounds
    bound reg, ops 若reg的索引值小于ops指定的下边界或大于ops指定的上边界,则变成5号异常
    调用子程序
    call a procedure
    call opd 调用opd所指定的子程序(32位段的远调用时,CS被扩展成4字节后压栈) 任务切换有影响,否则无
    从子程序返回
    return from procedure
    ret [n]
    n代表16位常量,[]表可选
    从子程序返回到调用语句的下一个语句处,若n存在,则(sp/esp)+n → sp/esp;32位段远返回时,cs出栈时改变4字节的栈指针
    中断调用
    interrupt
    int n (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值 0→tf,if,返回时复原
    溢出中断
    interrupt if overflow
    into (flags/eflags) 入栈,0→if,tf;(cs) 入栈;(4*n)→ip,(4*n+2)→cs或根据idt给eip,cs赋值;of=1时产生int 4 0→tf,if,返回时复原
    中断返回
    interrupt return
    iret 或iretd(32位段)
    或iretf
    ip出栈,cs出栈,flags/eflags出栈,根据nt标志做相应的处理 都有影响

    四、串操作指令

    指令名称

    汇编语句格式

    功能

    影响标志位

    串传送
    move byte/word string
    movs opd, ops
    movsb,movsw,movsd
    (ds:[si/esi]) → es:[di/edi],(ops所在的段可以取代ds),(si/esi)±1/2/4 → si/esi, (di/edi)±1/2/4 → di/edi
    串比较
    compare string
    cmps ops, opd
    cmpsb,compsw,compsd
    (ds:[si/esi]) – (es:[di/edi]),(si/esi)±1/2/4 → si/esi,
    (di/edi)±1/2/4 →di/edi
    af,cf,of,pf,
    sf,zf
    串搜索
    scan string
    scas opd
    scasb,scasw,scasd
    (al/ax/eax) – (es:[di/edi]),(di/edi)±1/2/4 →di/edi af,cf,of,pf,
    sf,zf
    取字符串
    load string
    lods ops
    lodsb, lodsw,lodsd
    (ds:[si/esi]) → al/ax/eax,(ops所在的段可以取代ds),
    (si/esi)±1/2/4 →si/esi
    存字符串
    store string
    stos opd
    stosb,stosw,stosd
    (al/ax/eax)→es:[di/edi],(di/edi)±1/2/4 →di/edi
    输入串
    input from port to string
    ins opd, dx
    insb,insw,insd
    ([dx]) →es:[di/edi],(di/edi)±1/2/4 →di/edi
    输出串
    output string port
    outs opd, ops
    outsb,outsw,outsd
    (ds:[si/esi])→[dx],(si/esi)±1/2/4 →si/esi
    重复前缀
    repeat string operation
    rep 串操作指令
    repe/repz 串操作指令
    repne/repnz 串操作指令
    若(cx/ecx) ≠ 0,执行一个串操作,(cx/ecx)-1→cx/ecx,返回再做
    若(cx/ecx) ≠ 0且zf=1,执行一次串操作,(cx/ecx)-1→cx/ecx,返回
    若(cx/ecx) ≠ 0且zf=0,执行一次串操作,(cx/ecx)-1→cx/ecx,返回

    五、位操作指令

    指令名称

    汇编语句格式

    功能

    影响标志位

    求反
    one's complement negation
    not opd ▁▁▁▁▁
    (opd)→opd
    逻辑乘
    and
    and opd, ops (opd)∧(ops)→opd pf,sf
    位测试
    bit test
    bt opd, ops 将(ops)作为位偏移(0~31)指明的opd对应位的值→CF cf
    位测试并求补
    bit test and complement
    btc opd, ops 在bt指令的基础上,将opd的对应位求反后→opd cf
    位测试并清0
    bit test and reset
    btr opd, ops 在bt指令的基础上,将0→opd的对应位 cf
    位测试并置1
    bit test and set
    bts opd, ops 在bt指令的基础上,将1→opd的对应位 cf
    正向位扫描
    bit scan forward
    bsf reg, ops 从0位开始扫描ops各位,若均为0,则zf=1,否则将第一个为1的位置值
    →reg,zf=0
    zf
    反向位扫描
    bit scan reverse
    bsr reg, ops 从最高位开始扫描ops各位,若均为0,则zf=1,否则,将首先碰到的为1的位置值→reg,zf=0 zf
    测试
    test
    test opd, ops (ops)∧(opd) sf,zf,pf;
    0→of,cf
    逻辑加
    inclusive or
    or opd, ops (opd)∨(ops)→opd sf,zf,pf;
    0→of,cf
    按位加
    exclusive or
    xor opd, ops 加法,就是用异或的计算方法了 sf,zf,pf;
    0→of,cf
    算术左移
    shift arithmetic left
    sal opd, 1 ;sal opd, cl;
    sal opd, 8位立即数
    cf中的值是最后移入位的值 sf,zf,pf,cf
    逻辑左移
    shift logic left
    shl opd, 1; shl opd, cl
    shl opd, 8位立即数
    cf中的值是最后移入位的值 sf,zf,pf,cf
    双精度左移
    double precision shift left
    shld opd, reg,八位立即数
    shld opd, reg, cl
    将reg的最高n位移入opd的低n位中,reg保持不变,opd最后移入的一位保存在cf中 cf,sf,zf,pf
    算术右移
    shift arithmetic rigtht
    sar opd,1; sar opd, cl
    sar opd, 8位立即数
    将(opd)向右移动n个指定的次数且最高位保持不变,cf的内容为最后移入位的值 sf,zf,pf,cf
    逻辑右移
    shift logical right
    shr opd, 1; shr opd cl
    shr opd, 8位立即数
    将(opd)向右移动n规定的次数,最高位补入0,cf的内容为最后移入位的值 sf,zf,pf,cf
    双精度右移
    double precision shift right
    shrd opd, reg,8位立即数
    shrd opd, reg, cl
    将reg的最低n位移入opd高n位中,reg保持不变,opd最后移出的一位保存在cf中 cf,sf,zf,pf
    循环右移
    rotate rigth
    ror opd, 1; ror opd cl
    ror opd, 8位立即数
    将目的操作数的最高位和最低位连接起来,组成一个环,将环中的所有位一起向右移动n位规定的数目(cl或立即数确定),cf为最后移入位的值 cf
    循环左移
    rotate left
    rol opd,1; rol opd cl
    rol opd, 8位立即数
    同上,向左移动 cf
    带进位的循环右移
    rotate right through carry
    rcr opd, 1; rcr opd, cl
    rcr opd, 8位立即数
    cf在最低位,与目的操作数连成环,移动 cf
    带进位的循环左移
    rotate left through carry
    rcl opd, 1; rcl opd, cl
    rcl opd, 8位立即数
    cf在最高位,与目的操作数连成环,移动指定的位数 cf

    六、寻址方式

    寻址方式

    格式

    功能

    实例

    寄存器寻址 R 寄存器R的内容就是操作数(R是任意寄存器个别指令的限制除外)
    R可以是ax,bx,cx,dx,cs,ds,ss,es…….
    inc bx
    寄存器间接寻址 [R]
    SS:[R]; 堆栈段
    DS:[R]; 数据段
    操作数在主存储器中,而操作数的偏移地址EA在指明的寄存器中
    16位:只能是bx,bp,si,di
    32位:通用寄存器(eax,ebx,ecx,edx,edi,esi,ebp,esp)
    未指明段时,bp,ebp,esp为堆栈段,其余是数据段
    mov a, [si]
    mov cx, [ebp]
    变址寻址 16位:[R+V],[R]+V,V[R]
    32位:[R*F+V],
    [R*F]+V,V[R*F]
    操作数在主存储器中,偏移地址EA在指定寄存器R的内容乘以比例因子F与给出位移量V的和。
    位移量V是不超过16位或不超过32位的二进制补码表示的有符号数(立即数),也可以是符合语法规则的数值表达式变量标号,
    最后计算的偏移量是无符号数,
    未明确段时,规则如上
    mov al, [ebx*2]+5
    add –2[bp], ax
    mov 2*10h[si]

    基址加变址寻址 16位:[bx/bp+si/di+V]
            V[bx/bp][si/di]
            V[bx/bp+si/di]
    32位:[BR+IR*F+V],
            V[BR][IR*F],
            V[BR+IR*F]
    操作数在主存储器中,偏移地址EA是指令中基址寄存器的内容、变址寄存器的内容乘以比例因子、位移量V三项之和
    32位时IR不能是esp,
    br中的来确定段
    mov ax, 8[bx][si]
    mov eax, –6[edi*2][ebp]
    立即寻址 n 所提供额操作数是紧跟在指令码后面的一个采用8位、16位或32位二进制补码表示的有符号书,构成指令的一部分
    n是立即数,可以是占用1个字节,2个字节,4个字节的存储单元,具体的类型必须要表示出来,根据指令的其它部分来决定,n只能是常数或结果为确定值的表达式,且只能做源操作数
    mov word ptr [si],12h
    add eax, -12345678h
    直接寻址 段寄存器名:[n]
    变量
    变量+常量
    操作数在主存储器中,
    n是一个数值或数值表达式时,直接表明操作数的偏移地址值,且为无符号数,[n]不能指明段寄存器,所以加了一个段说明符,
    变量或变量+常量的地址表达式在汇编过程中被转换成“段寄存器名:[n]”的形式,期中n是汇编程序计算地址表达式得到的结果,
    mov ds:[20h], cl
    inc buf; (buf是定义的变量)
    mov ax, array1
    mov array, bx
    sub cx, array3
    mov dx, array4+3
    (array* 是定义的变量)
  • 相关阅读:
    hdu2138(求素数)
    hdu2104
    poj1664(放苹果)
    数塔问题给你有哪些启示?
    汉诺塔问题(1)
    算法的力量(转李开复)
    最长子序列问题之系列一
    forward和redirect的区别
    group by 和having
    java中的多态三要素是什么?
  • 原文地址:https://www.cnblogs.com/wh4am1/p/6818187.html
Copyright © 2020-2023  润新知