精华内容
下载资源
问答
  • X86汇编指令集

    千次阅读 2019-05-13 15:12:32
    汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下! X86和X87汇编指令大全(有注释) ---------- 一、数据传输指令 ----------------...

    说明:本文为转载,如有侵权告知删除,转载便于个人查询!

    原文:https://blog.csdn.net/bjbz_cxy/article/details/79467688
     

    汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下!

    X86和X87汇编指令大全(有注释)  
    ---------- 一、数据传输指令 ----------------------------------------------------  
    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.  
    1. 通用数据传送指令.  
        MOV     传送字或字节.  
        MOVSX   先符号扩展,再传送.  
        MOVZX   先零扩展,再传送.  
        PUSH    把字压入堆栈.  
        POP     把字弹出堆栈.  
        PUSHA   把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.  
        POPA    把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.  
        PUSHAD  把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.  
        POPAD   把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.  
        BSWAP   交换32位寄存器里字节的顺序  
        XCHG    交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)  
        CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)  
        XADD    先交换再累加.(结果在第一个操作数里)  
        XLAT    字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)  
    2. 输入输出端口传送指令.  
        IN      I/O端口输入. ( 语法: IN   累加器,    {端口号│DX} )  
        OUT     I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时,    其范围是 0-255; 由寄存器 DX 指定时,其范围是    0-65535.  
    3. 目的地址传送指令.  
        LEA     装入有效地址.例: LEA DX,string ;把偏移地址存到DX.  
        LDS     传送目标指针,把指针内容装入DS.例: LDS SI,string   ;把段地址:偏移地址存到DS:SI.  
        LES     传送目标指针,把指针内容装入ES.例: LES DI,string   ;把段地址:偏移地址存到ES:DI.  
        LFS     传送目标指针,把指针内容装入FS.例: LFS DI,string   ;把段地址:偏移地址存到FS:DI.  
        LGS     传送目标指针,把指针内容装入GS.例: LGS DI,string   ;把段地址:偏移地址存到GS:DI.  
        LSS     传送目标指针,把指针内容装入SS.例: LSS DI,string   ;把段地址:偏移地址存到SS:DI.  
    4. 标志传送指令.  
        LAHF    标志寄存器传送,把标志装入AH.  
        SAHF    标志寄存器传送,把AH内容装入标志寄存器.  
        PUSHF   标志入栈.  
        POPF    标志出栈.  
        PUSHD   32位标志入栈.  
        POPD    32位标志出栈.  
    ---------- 二、算术运算指令 ----------------------------------------------------  
        ADD     加法.  
        ADC     带进位加法.  
        INC     加 1.  
        AAA     加法的ASCII码调整.  
        DAA     加法的十进制调整.  
        SUB     减法.  
        SBB     带借位减法.  
        DEC     减 1.  
        NEG     求反(以    0 减之).  
        CMP     比较.(两操作数作减法,仅修改标志位,不回送结果).  
        AAS     减法的ASCII码调整.  
        DAS     减法的十进制调整.  
        MUL     无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
        IMUL    整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
        AAM     乘法的ASCII码调整.  
        DIV     无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).  
        IDIV    整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).  
        AAD     除法的ASCII码调整.  
        CBW     字节转换为字. (把AL中字节的符号扩展到AH中去)  
        CWD     字转换为双字. (把AX中的字的符号扩展到DX中去)  
        CWDE    字转换为双字. (把AX中的字符号扩展到EAX中去)  
        CDQ     双字扩展. (把EAX中的字的符号扩展到EDX中去)  
    ---------- 三、逻辑运算指令 ----------------------------------------------------  
        AND     与运算.  
        OR      或运算.  
        XOR     异或运算.  
        NOT     取反.  
        TEST    测试.(两操作数作与运算,仅修改标志位,不回送结果).  
        SHL     逻辑左移.  
        SAL     算术左移.(=SHL)  
        SHR     逻辑右移.  
        SAR     算术右移.(=SHR)  
        ROL     循环左移.  
        ROR     循环右移.  
        RCL     通过进位的循环左移.  
        RCR     通过进位的循环右移.  
                  以上八种移位指令,其移位次数可达255次.  
                  移位一次时, 可直接用操作码. 如 SHL AX,1.  
                  移位>1次时, 则由寄存器CL给出移位次数.  
                  如 MOV CL,04   SHL AX,CL  
    ---------- 四、串指令 ----------------------------------------------------------  
                  DS:SI 源串段寄存器 :源串变址.  
                  ES:DI 目标串段寄存器:目标串变址.  
                  CX 重复次数计数器.  
                  AL/AX 扫描值.  
                  D标志   0表示重复操作中SI和DI应自动增量; 1表示应自动减量.  
                  Z标志   用来控制扫描或比较操作的结束.  
        MOVS    串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )  
        CMPS    串比较.( CMPSB 比较字符. CMPSW 比较字. )  
        SCAS    串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.  
        LODS    装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字.    LODSD 传送双字. )  
        STOS    保存串.是LODS的逆过程.  
        REP         当CX/ECX<>0时重复.  
        REPE/REPZ   当ZF=1或比较结果相等,且CX/ECX<>0时重复.  
        REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.  
        REPC        当CF=1且CX/ECX<>0时重复.  
        REPNC       当CF=0且CX/ECX<>0时重复.  
    ---------- 五、程序转移指令 ----------------------------------------------------  
    1. 无条件转移指令 (长转移)  
        JMP         无条件转移指令  
        CALL        过程调用  
        RET/RETF    过程返回.  
    2. 条件转移指令   (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )  
        JA/JNBE     不小于或不等于时转移.  
        JAE/JNB     大于或等于转移.  
        JB/JNAE     小于转移.  
        JBE/JNA     小于或等于转移.  
            以上四条,测试无符号整数运算的结果(标志C和Z).  
        JG/JNLE     大于转移.  
        JGE/JNL     大于或等于转移.  
        JL/JNGE     小于转移.  
        JLE/JNG     小于或等于转移.  
            以上四条,测试带符号整数运算的结果(标志S,O和Z).  
        JE/JZ       等于转移.  
        JNE/JNZ     不等于时转移.  
        JC          有进位时转移.  
        JNC         无进位时转移.  
        JNO         不溢出时转移.  
        JNP/JPO     奇偶性为奇数时转移.  
        JNS         符号位为 "0" 时转移.  
        JO          溢出转移.  
        JP/JPE      奇偶性为偶数时转移.  
        JS          符号位为 "1" 时转移.  
    3. 循环控制指令(短转移)  
        LOOP            CX不为零时循环.  
        LOOPE/LOOPZ     CX不为零且标志Z=1时循环.  
        LOOPNE/LOOPNZ   CX不为零且标志Z=0时循环.  
        JCXZ            CX为零时转移.  
        JECXZ           ECX为零时转移.  
    4. 中断指令  
        INT         中断指令  
        INTO        溢出中断  
        IRET        中断返回  
    5. 处理器控制指令  
        HLT         处理器暂停,  直到出现中断或复位信号才继续.  
        WAIT        当芯片引线TEST为高电平时使CPU进入等待状态.  
        ESC         转换到外处理器.  
        LOCK        封锁总线.  
        NOP         空操作.  
        STC         置进位标志位.  
        CLC         清进位标志位.  
        CMC         进位标志取反.  
        STD         置方向标志位.  
        CLD         清方向标志位.  
        STI         置中断允许位.  
        CLI         清中断允许位.  
    ---------- 六、伪指令 ----------------------------------------------------------  
        DW          定义字(2字节).  
        PROC        定义过程.  
        ENDP        过程结束.  
        SEGMENT     定义段.  
        ASSUME      建立段寄存器寻址.  
        ENDS        段结束.  
        END         程序结束.  
    ---------- 七、处理机控制指令:标志处理指令 ------------------------------------  
        CLC     进位位置0指令  
        CMC     进位位求反指令  
        STC     进位位置为1指令  
        CLD     方向标志置1指令  
        STD     方向标志位置1指令  
        CLI     中断标志置0指令  
        STI     中断标志置1指令  
        NOP     无操作  
        HLT     停机  
        WAIT    等待  
        ESC     换码  
        LOCK    封锁  
    ========== 浮点运算指令集 ======================================================  
    ---------- 一、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)----  
    FINIT                 初始化浮点部件                  机器码  9B DB E3  
    FCLEX                 清除异常                         机器码  9B DB E2  
    FDISI                 浮点检查禁止中断                 机器码  9B DB E1  
    FENI                  浮点检查禁止中断二            机器码  9B DB E0  
    WAIT                  同步CPU和FPU                    机器码  9B  
    FWAIT                 同步CPU和FPU                    机器码  D9 D0  
    FNOP                  无操作                          机器码  DA E9  
    FXCH                  交换ST(0)和ST(1)                机器码  D9 C9  
    FXCH ST(i)            交换ST(0)和ST(i)                机器码  D9 C1iii  
    FSTSW ax              状态字到ax                       机器码  9B DF E0  
    FSTSW   word ptr mem  状态字到mem                      机器码  9B DD mm111mmm  
    FLDCW   word ptr mem  mem到状态字                      机器码  D9 mm101mmm  
    FSTCW   word ptr mem  控制字到mem                      机器码  9B D9 mm111mmm  
     
    FLDENV  word ptr mem  mem到全环境                      机器码  D9 mm100mmm  
    FSTENV  word ptr mem  全环境到mem                      机器码  9B D9 mm110mmm  
    FRSTOR  word ptr mem  mem到FPU状态                    机器码  DD mm100mmm  
    FSAVE   word ptr mem  FPU状态到mem                    机器码  9B DD mm110mmm  
     
    FFREE ST(i)           标志ST(i)未使用                   机器码  DD C0iii  
    FDECSTP               减少栈指针1->0 2->1             机器码  D9 F6  
    FINCSTP               增加栈指针0->1 1->2             机器码  D9 F7  
    FSETPM                浮点设置保护                       机器码  DB E4  
    ---------- 二、数据传送指令 ----------------------------------------------------  
    FLDZ                  将0.0装入ST(0)                  机器码  D9 EE  
    FLD1                  将1.0装入ST(0)                  机器码  D9 E8  
    FLDPI                 将π装入ST(0)                    机器码  D9 EB  
    FLDL2T                将ln10/ln2装入ST(0)             机器码  D9 E9  
    FLDL2E                将1/ln2装入ST(0)                机器码  D9 EA  
    FLDLG2                将ln2/ln10装入ST(0)             机器码  D9 EC  
    FLDLN2                将ln2装入ST(0)                  机器码  D9 ED  
     
    FLD    real4 ptr mem  装入mem的单精度浮点数             机器码  D9 mm000mmm  
    FLD    real8 ptr mem  装入mem的双精度浮点数             机器码  DD mm000mmm  
    FLD   real10 ptr mem  装入mem的十字节浮点数             机器码  DB mm101mmm  
     
    FILD    word ptr mem  装入mem的二字节整数              机器码  DF mm000mmm  
    FILD   dword ptr mem  装入mem的四字节整数              机器码  DB mm000mmm  
    FILD   qword ptr mem  装入mem的八字节整数              机器码  DF mm101mmm  
     
    FBLD   tbyte ptr mem  装入mem的十字节BCD数            机器码  DF mm100mmm  
     
    FST    real4 ptr mem  保存单精度浮点数到mem             机器码  D9 mm010mmm  
    FST    real8 ptr mem  保存双精度浮点数到mem             机器码  DD mm010mmm  
     
    FIST    word ptr mem  保存二字节整数到mem              机器码  DF mm010mmm  
    FIST   dword ptr mem  保存四字节整数到mem              机器码  DB mm010mmm  
     
    FSTP   real4 ptr mem  保存单精度浮点数到mem并出栈      机器码  D9 mm011mmm  
    FSTP   real8 ptr mem  保存双精度浮点数到mem并出栈      机器码  DD mm011mmm  
    FSTP  real10 ptr mem  保存十字节浮点数到mem并出栈      机器码  DB mm111mmm  
     
    FISTP   word ptr mem  保存二字节整数到mem并出栈           机器码  DF mm011mmm  
    FISTP  dword ptr mem  保存四字节整数到mem并出栈           机器码  DB mm011mmm  
    FISTP  qword ptr mem  保存八字节整数到mem并出栈           机器码  DF mm111mmm  
     
    FBSTP  tbyte ptr mem  保存十字节BCD数到mem并出栈     机器码  DF mm110mmm  
     
    FCMOVB                ST(0),ST(i) <时传送              机器码  DA C0iii  
    FCMOVBE               ST(0),ST(i) <=时传送             机器码  DA D0iii  
    FCMOVE                ST(0),ST(i) =时传送             机器码  DA C1iii  
    FCMOVNB               ST(0),ST(i) >=时传送             机器码  DB C0iii  
    FCMOVNBE              ST(0),ST(i) >时传送              机器码  DB D0iii  
    FCMOVNE               ST(0),ST(i) !=时传送            机器码  DB C1iii  
    FCMOVNU               ST(0),ST(i) 有序时传送        机器码  DB D1iii  
    FCMOVU                ST(0),ST(i) 无序时传送        机器码  DA D1iii  
    ---------- 三、比较指令   --------------------------------------------------------  
    FCOM                  ST(0)-ST(1)                      机器码  D8 D1  
    FCOMI                 ST(0),ST(i)  ST(0)-ST(1)         机器码  DB F0iii  
    FCOMIP                ST(0),ST(i)  ST(0)-ST(1)并出栈   机器码  DF F0iii  
    FCOM   real4 ptr mem  ST(0)-实数mem                      机器码  D8 mm010mmm  
    FCOM   real8 ptr mem  ST(0)-实数mem                      机器码  DC mm010mmm  
     
    FICOM   word ptr mem  ST(0)-整数mem                      机器码  DE mm010mmm  
    FICOM  dword ptr mem  ST(0)-整数mem                      机器码  DA mm010mmm  
    FICOMP  word ptr mem  ST(0)-整数mem并出栈               机器码  DE mm011mmm  
    FICOMP dword ptr mem  ST(0)-整数mem并出栈               机器码  DA mm011mmm  
     
    FTST                  ST(0)-0                          机器码  D9 E4  
    FUCOM  ST(i)          ST(0)-ST(i)                      机器码  DD E0iii  
    FUCOMP ST(i)          ST(0)-ST(i)并出栈                   机器码  DD E1iii  
    FUCOMPP               ST(0)-ST(1)并二次出栈             机器码  DA E9  
    FXAM                  ST(0)规格类型                    机器码  D9 E5  
    ---------- 四、运算指令   --------------------------------------------------------  
    FADD                  把目的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在目的操作数后的变量或堆栈缓存器)  相加,并将结果存入目的操作数  
    FADDP  ST(i),ST       这个指令是使目的操作数加上 ST  缓存器,并弹出 ST 缓存器,而目的操作数必须是堆栈缓存器的其中之一,最后不管目的操作数为何,经弹出一次后,目的操作数会变成上一个堆栈缓存器了  
    FIADD                 FIADD 是把 ST   加上来源操作数,然后再存入 ST 缓存器,来源操作数必须是字组整数或短整数形态的变数  
     
    FSUB                  减  
    FSUBP  
    FSUBR                 减数与被减数互换  
    FSUBRP  
    FISUB  
    FISUBR  
     
    FMUL                  乘  
    FMULP  
    FIMUL  
     
    FDIV                  除  
    FDIVP  
    FDIVR  
    FDIVRP  
    FIDIV  
    FIDIVR  
     
    FCHS                  改变 ST 的正负值  
     
    FABS                  把 ST  之值取出,取其绝对值后再存回去。  
     
    FSQRT                 将 ST  之值取出,开根号后再存回去。  
     
    FSCALE                这个指令是计算 ST*2^ST(1)之值,再把结果存入 ST 里而 ST(1)   之值不变。ST(1)  必须是在 -32768 到 32768 (-215 到 215 )之间的整数,如果超过这个范围计算结果无法确定,如果不是整数 ST(1)    会先向零舍入成整数再计算。所以为安全起见,最好是由字组整数载入到 ST(1) 里。  
     
    FRNDINT               这个指令是把 ST 的数值舍入成整数,FPU    提供四种舍入方式,由 FPU 的控制字组(control    word)中的 RC 两个位决定  
                              RC    舍入控制  
                              00    四舍五入  
                              01    向负无限大舍入  
                              10    向正无限大舍入  
                              11    向零舍去  
    ================================================================================  
     

    展开全文
  • 【转】ARM指令集和X86指令集的区别

    千次阅读 2017-01-08 15:37:00
    当年面试华为,本来面的java岗,看到我简历上学过单片机,一个这个问题抛过来,...从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。 相应的,微处理随着微指令的复杂度也可分为...

    当年面试华为,本来面的java岗,看到我简历上学过单片机,一个这个问题抛过来,基本让我招架不住。现在回想过去,还是经验不足啊,经验不足啊!血亏!

    以下为转载内容。

     

    一、背景知识:

    指令的强弱是CPU的重要指标,指令集是提高微处理器效率的最有效工具之一。从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。

    相应的,微处理随着微指令的复杂度也可分为CISC及RISC这两类。

     

    CISC

    是一种为了便于编程和提高记忆体访问效率的晶片设计体系。在20世纪90年代中期之前,大多数的微处理器都采用CISC体系──包括Intel的80x86和Motorola的68K系列等。 即通常所说的X86架构就是属于CISC体系的。

     

    RISC

    是为了提高处理器运行的速度而设计的晶片体系。它的关键技术在于流水线操作(Pipelining):在一个时钟周期里完成多条指令。而超流水线以及超标量技术已普遍在晶片设计中使用。RISC体系多用于非x86阵营高性能微处理器CPU。像HOLTEK MCU系列等。

     

    ARM ( Advanced RISC Machines ),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。而ARM体系结构目前被公认为是业界领先的32 位嵌入式RISC 微处理器结构。 所有ARM处理器共享这一体系结构。

     

    因此我们可以从其所属体系比较入手,来进行X86指令集与ARM指令集的比较。

     

    二、CISCRISC的比较

    (一)

    CISC

     

    1.CISC体系的指令特征

     

    使用微代码。

    指令集可以直接在微代码记忆体(比主记忆体的速度快很多)里执行,新设计的处理器,只需增加较少的电晶体就可以执行同样的指令集,也可以很快地编写新的指令集程式。

     

    庞大的指令集。

    可以减少编程所需要的代码行数,减轻程式师的负担。高阶语言对应的指令集:包括双运算元格式、寄存器到寄存器、寄存器到记忆体以及记忆体到寄存器的指令。

     

    2.CISC体系的优缺点

    优点:

    能够有效缩短新指令的微代码设计时间,允许设计师实现CISC体系机器的向上相容。新的系统可以使用一个包含早期系统的指令超集合,也就可以使用较早电脑上使用的相同软体。另外微程式指令的格式与高阶语言相匹配,因而编译器并不一定要重新编写。

    缺点:

    指令集以及晶片的设计比上一代产品更复杂,不同的指令,需要不同的时钟周期来完成,执行较慢的指令,将影响整台机器的执行效率。

     

    (二)RISC

    1.RISC体系的指令特征

    精简指令集:

    包含了简单、基本的指令,透过这些简单、基本的指令,就可以组合成复杂指令。

     

    同样长度的指令:

    每条指令的长度都是相同的,可以在一个单独操作里完成。

     

    单机器周期指令:

    大多数的指令都可以在一个机器周期里完成,并且允许处理器在同一时间内执行一系列的指令。

     

    2.RISC体系的优缺点

     

    优点:在使用相同的晶片技术和相同运行时钟下,RISC系统的运行速度将是CISC的2~4倍。由于RISC处理器的指令集是精简的,它的记忆体管理单元、浮点单元等都能设计在同一块晶片上。RISC处理器比相对应的CISC处理器设计更简单,所需要的时间将变得更短,并可以比CISC处理器应用更多先进的技术,开发更快的下一代处理器。

     

    缺点:多指令的操作使得程式开发者必须小心地选用合适的编译器,而且编写的代码量会变得非常大。另外就是RISC体系的处理器需要更快记忆体,这通常都集成于处理器内部,就是L1 Cache(一级缓存)。

     

    综合上面所述,若要再进一步比较CISC与RISC之差异,可以由以下几点来进行分析:

     

    1、指令的形成

    CISC

    因指令复杂,故采微指令码控制单元的设计,而RISC的指令90%是由硬体直接完成,只有10%的指令是由软体以组合的方式完成,因此指令执行时间上RISC较短,但RISC所须ROM空间相对的比较大,至于RAM使用大小应该与程序的应用比较有关系。

     

    2、定址模式

    CISC

    的需要较多的定址模式,而RISC只有少数的定址模式,因此CPU在计算记忆体有效位址时,CISC占用的汇流排周期较多。

     

    3、指令的执行

    CISC

    指令的格式长短不一,执行时的周期次数也不统一,而RISC结构刚好相反,故适合采用管线处理架构的设计,进而可以达到平均一周期完成一指令的方向努力。显然的,在设计上RISC较CISC简单,同时因为CISC的执行步骤过多,闲置的单元电路等待时间增长,不利于平行处理的设计,所以就效能而言RISC较CISC还是站了上风,但RISC因指令精简化后造成应用程式码变大,需要较大的程式记忆体空间,且存在指令种类较多等等的缺点。

     

    (三)X86指令集和ARM指令集:

     

    (1) X86指令集:

    X86指令集是Intel为其第一块16位CPU(i8086)专门开发的,后来的电脑中为提高浮点数据处理能力而增加的X87芯片系列数学协处理器另外使用X87指令,以后就将X86指令集和X87指令集统称为X86指令集。虽然随着CPU技术的不断发展,Intel陆续研制出更新型的i80386、i80486,但为了保证电脑能继续运行以往开发的各类应用程序以保护和继承丰富的软件资源,所以Intel公司所生产的所有CPU仍然继续使用X86指令集,所以它的CPU仍属于X86系列。由于Intel X86系列及其兼容CPU都使用X86指令集,所以就形成了今天庞大的X86系列及兼容CPU阵容。

     

    除了具备上述CISC的诸多特性外,X86指令集有以下几个突出的缺点:

     

    l         通用寄存器组————对CPU内核结构的影响

     

    X86指令集只有8个通用寄存器。所以,CISC的CPU执行是大多数时间是在访问存储器中的数据,而不是寄存器中的。这就拖慢了整个系统的速度。

     

    RISC系统往往具有非常多的通用寄存器,并采用了重叠寄存器窗口和寄存器堆等技术使寄存器资源得到充分的利用。

     

    l         解码————对CPU的外核的影响

     

    解码器(Decode Unit),这是x86CPU才有的东西。其作用是把长度不定的x86指令转换为长度固定的类似于RISC的指令,并交给RISC内核。解码分为硬件解码和微解码,对于简单的x86指令只要硬件解码即可,速度较快,而遇到复杂的x86指令则需要进行微解码,并把它分成若干条简单指令,速度较慢且很复杂。Athlon也好,PIII也好,老式的CISC的X86指令集严重制约了他们的性能表现。

     

    l         寻址范围小——约束了用户需要

    即使AMD研发出X86-64架构时,虽然也解决了传统X86固有的一些缺点,比如寻址范围的扩大,但这种改善并不能直接带来性能上的提升。

     

     

    (2) ARM指令集:

     

    相比而言,以RISC为架构体系的ARM指令集的指令格式统一,种类比较少,寻址方式也比复杂指令集少。当然处理速度就提高很多。ARM处理器都是所谓的精简指令集处理机(RISC)。

    其所有指令都是利用一些简单的指令组成的,简单的指令意味着相应硬件线路可以尽量做到最佳化,而提高执行速率,相对的使得一个指令所需的时间减到最短。

     

    而因为指令集的精简,所以许多工作都必须组合简单的指令,而针对较复杂组合的工作便需要由『编译程式』(compiler)来执行,而 CISC 体系的X86指令集因为硬体所提供的指令集较多,所以许多工作都能够以一个或是数个指令来代替,compiler 的工作因而减少许多。

     

    除了具备上述RISC的诸多特性之外,可以总结ARM指令集架构的其它一些特点如下:

     

    l         ARM的特点

     

    1.  体积小,低功耗,低成本,高性能

    2.  支持 Thumb ( 16 位) /ARM ( 32 位)双指令集,能很好的兼容 8 位 /16 位器件;

    3.  大量使用寄存器,指令执行速度更快;

    4.  大多数数据操作都在寄存器中完成;

    5.  寻址方式灵活简单,执行效率高;

    6.  指令长度固定;

    7.  流水线处理方式

    8.  Load_store结构

     

    l         ARM的一些非RISC思想的指令架构:

     

    1.  允许一些特定指令的执行周期数字可变,以降低功耗,减小面积和代码尺寸。

    2.  增加了桶形移位器来扩展某些指令的功能。

    3.  使用了16位的Thumb指令集来提高代码密度。

    4.  使用条件执行指令来提高代码密度和性能。

    5.  使用增强指令来实现数据信号处理的功能。

     

    (四)小结:

     

    因此,大量的复杂指令、可变的指令长度、多种的寻址方式这些CISC的特点,也是CISC的缺点,因为这些都大大增加了解码的难度,而在现在的高速硬件发展下,复杂指令所带来的速度提升早已不及在解码上浪费点的时间。除了个人PC市场还在用X86指令集外,服务器以及更大的系统都早已不用CISC了。x86仍然存在的理由就是为了兼容大量的x86平台上的软件,同时,它的体系结构组成的实现不太困难。

     

    而RISC体系的ARM指令最大特点是指令长度固定,指令格式种类少,寻址方式种类少,大多数是简单指令且都能在一个时钟周期内完成,易于设计超标量与流水线,寄存器数量多,大量操作在寄存器之间进行。优点是不言而喻的,因此,ARM处理器才成为是当前最流行的处理器系列,是几种主流的嵌入式处理体系结构之一。

    RISC目前正如日中天,Intel似乎也将最终抛弃x86而转向RISC结构。

     

    而实际上,随着RISC处理器在嵌入式领域中大放异彩,传统的X86系列CISC处理器在Intel公司的积极改进下也克服了功耗过高的问题,成为一些高性能嵌入式设备的最佳选择,发展到今天,CISC与RISC之间的界限已经不再是那么泾渭分明,RISC自身的设计正在变得越来越复杂(当然并不是完全依着CISC的思路变复杂),因为所有实际使用的CPU都需要不断提高性能,所以在体系结构中加入新特点就在所难免。另一方面,原来被认为是CISC体系结构的处理器也吸收了许多RISC的优点,比如Pentium处理器在内部的实现中也是采用的RISC的架构,复杂的指令在内部由微码分解为多条精简指令来运行,但是对于处理器外部来说,为了保持兼容性还是以CISC风格的指令集展示出来。

    转载于:https://www.cnblogs.com/PengH/p/6262082.html

    展开全文
  • x86 汇编指令集

    2021-03-25 22:10:51
    使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。 PF: 奇偶标志 奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数...

    一、汇编标志位:

    CF: 进位标志
    	进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
    	使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。
    PF: 奇偶标志
    	奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
    	利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。
    AF: 辅助进位标志
    	在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:
    	(1)、在字操作时,发生低字节向高字节进位或借位时;
    	(2)、在字节操作时,发生低4位向高4位进位或借位时。
    ZF: 零标志
    	零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
    SF: 符号标志
    	符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
    OF: 溢出标志
    	溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
    TF: 追踪标志
    	当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。
    IF: 中断允许标志
    	(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
    	(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求
    DF: 方向标志
    	方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。
    

    二、常见寄存器

    寄存器		16位		32位		64位
    累加寄存器	AX		EAX		RAX
    基址寄存器	BX		EBX		RBX
    计数寄存器	CX		ECX		RCX
    数据寄存器	DX		EDX		RDX
    堆栈基指针	BP		EBP		RBP
    变址寄存器	SI		ESI		RSI
    堆栈顶指针	SP		ESP		RSP
    指令寄存器	IP		EIP		RIP
    

    三、汇编指令集

    (1) 数据传送指令。

    1. 通用数据传输指令:MOV
    		格式:MOV DEST,SRC  
    		功能:把一个字节,字或双字从源操作数SRC传送至目的操作数DEST。
    
    2. 扩展传送指令: MOV SX, MOV ZX
    		格式:MOV SX DEST,SRC
    		          MOV ZX DEST,SRC
    		功能:将源操作数由8位扩展到16位送目的操作数,或由16位扩展到32位送目的操作数。
    		          MOV SX是按有符号数扩展
    		          MOV ZX是按无符号数扩展。无符号数或正数高位扩展为0,负数高位扩展为全“1”。
    		例:    MOV BL,80H  ; -128
    	  	          MOV SX AX,BL  ; 将80H扩展为FF80H后送AX中。
    		          MOV BL,80H  ; 128
    	  	          MOV ZX AX,BL  ; 将80H扩展为0080H后送AX中
    
    3. 交换指令:XCHG BSWAP 
    		格式:XCHG OPR1,OPR2
    		          BSWAP REG
    		功能:XCHG :交换操作数OPR1和OPR2的值,操作数数据类型为字节、字或双字。
    		         BSWAP :将32位通用寄存器中,第1个字节和第4个字节交换,第2个字节和第3个字节交换。
    
    4. 压栈指令:PUSH PUSHA PUSHAD
    		格式:PUSH SRC
    		功能:将源操作数压下堆栈,源操作数允许为16位或32位通用寄存器、存储器和立即数以及16位段寄存器。当操作数数据类型为字类型,压栈操作使SP值减2;当数据类型为双字类型,压栈操作使SP值减4。
    		          PUSHA将16位通用寄存器压入堆栈,压栈顺序为AX,CX,DX,BX,SP,BP,SI,DI。
    		          PUSHAD将32位通用寄存器压入堆栈,压栈顺序为EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI。
    
    5. 出栈指令:POP POPA POPAD
    		格式:POP DEST
    		功能:从栈顶弹出操作数送入目的操作数。
    		         POPA从堆栈移出16字节数据,
    		         POPAD从堆栈移出32字节数据
    6. 地址传送指令:LEA 
    		格式:LEA REG,MEM
    		功能:将源操作数的有效地址传送到通用寄存器,
    
    7. 查表指令:XLAT
    
    8. 符合扩展指令 CBW CWD CWDE CDQ
    		格式:CBW :将AL中8位带符号数,进行带符号扩展为16位,送AX中。
    		          CWD :将AX中16位带符号数,进行带符号扩展为32位
    		          CWDE:将AX中16位带符号数,进行带符号扩展为32位,送EAX中。
    		          CDQ:将EAX中32位带符号数,进行带符号扩展为64位,送EDX和EAX中。低32位送EAX中,高32位送EDX中。
    

    (2) 算术运算指令。

    1. 加法指令:ADD
    		交互相加指令:XADD
    		格式:ADD DEST,SRC
    		         XADD DEST,REG
    		功能:ADD是将源操作数与目的操作数相加,结果传送到目的操作数。
    
    2. 减法指令:SUB 
    		格式:SUB DEST,SRC
    		功能:SUB将目的操作数减源操作数,结果送目的操作数。
    
    3. 自增自减指令:INC DEC
    		格式:INC DEST 
    		          DEC DEST
    		功能:INC指令将目的操作数加1,结果送目的操作数。
    		         DEC指令将目的操作数减1,结果送目的操作数。
    
    4. 比较指令:CMP 
    		格式:CMP DEST,SRC
    		功能:目的操作数减源操作数,结果不回送。
    		结果:两个正数比较,使用SF标志位判断。
    	    		SF=0,则AX>BX,若ZF=1,则AX=BX
    	    		SF=1,则AX<BX
    		          两个无符号数比较,使用CF标志位判断。
    	    		CF=0,则AX>BX,若ZF=1,则AX=BX
    	    		CF=1,则AX<BX
    		          两个负数比较,使用SF标志位判断。
    	    		SF=0,则AX>BX,若ZF=1,则AX=BX
    	    		SF=1,则AX<BX
    		          两个异符号数比较。
    	    		如果OF=0,仍可用SF标志判断大小。
    	    		如果OF=1,说明结果的符号位发生错误,所以
    	         	SF=0,则AX<BX
    	         	SF=1,则AX>BX
    
    5. 求补指令:NEG 
    		格式:NEG DEST
    		功能:对目的操作数求补,用零减去目的操作数,结果送目的操作数。
    
    6. 乘法指令:MUL  IMUL
    		格式:MUL SRC
    		         IMUL SRC
    		功能:MUL为无符号数乘法指令,IMUL为带符号数乘法指令。目的操作数缺省存放在ACC(AL,AX,EAX)中,乘积存AX,DX:AX,EDX:EAX中。
    		格式:IMUL DEST,SRC
    		功能:将目的操作数乘以源操作数,结果送目的操作数。
    		格式:IMUL DEST,SRC1,SRC2
    		功能:将源操作数SRC1与源操作数SRC2相乘,结果送目的操作数。
    
     7. 除法指令:DIV  IDIV 
    		格式:DIV SRC
    	              IDIV SRC
    		功能:DIV为无符号数除法,IDIV为带符号数除法。被除数缺省在目的操作数AX,DX:AX,EDX:EAX中。
    
    8. BCD算术运算 DAA  DAS
    		格式:DAA
    		功能:将存放在AL中的二进制和数,调整为压缩格式的BCD码表示形式。
    		格式:DAS
    		功能:将存放在AL中的二进制差数,调整为压缩的BCD码表示形式。
    		例:  	SUB AL,BL
    	  		DAS
    
    9. ASCII算术运算
    		AAA:将存放在AL中的二进制和数,调整为ASCII码表示的结果。
    		AAS:将存放在AL中的二进制差数,调整为ASCII码表示形式
    		AAM:将存放在AL中的二进制积数,调整为ASCII码表示形式。
    		AAD:将AX中两位非压缩BCD码(一个字节存放一位BCD码),转换为二进制数的表示形式。
    

    (3) 逻辑运算指令。

    1. 逻辑与指令:AND 
    		格式:AND DEST,SRC
    		功能:目的操作数和源操作数按位进行逻辑与运算,结果存目的操作数中。
    
    2. 逻辑或指令:OR 
    		格式:OR DEST,SRC
    		功能:目的操作数和源操作数按位进行逻辑或运算,结果存目的操作数中。
    
    3. 逻辑异或指令:XOR 
    		格式:XOR DEST,SRC
    		功能:目的操作数和源操作数按位进行逻辑异或运算,结果送目的操作数。
    
    4. 逻辑非指令:NOT 
    		格式:NOT DEST
    		功能:对目的操作数按位取反,结果回送目的操作数。目的操作数可以为通用寄存器或存储器。
    
    5. 测试指令:TEST 
    		格式:TEST DEST,SRC
    		功能:目的操作数和源操作数按位进行逻辑与操作,结果不回送目的操作数。
    		         TEST指令常用于测试操作数中某位是否为1,而且不会影响目的操作数。如果测试某位的状态,对某位进行逻辑与1的运算,其它位逻辑与0,然后判断标志位。运算结果为0,ZF=1,表示被测试位为0;否则ZF=0,表示被测试位为1。
    
    6. 算术/逻辑左移指令:
    		格式:SAL DEST,OPRD
    	               SHL DEST,OPRD
    		功能:按照操作数OPRD规定的移位位数,对目的操作数进行左移操作,最高位移入CF中。每移动一位,右边补一位0。
    
    7.  算术右移指令:SAR 
    		格式:SAR DEST,OPRD
    		功能:按照操作数OPRD规定的移位次数,对目的操作数进行右移操作,最低位移至CF中,最高位(即符号位)保持不变。
    
     8. 逻辑右移指令:SHR 
    		格式:SHR DEST,SRC
    		         ROR DEST,OPRD
    		功能:按照操作数OPRD规定的移位位数,对目的操作数进行右移操作,最低位移至CF中。每移动一位,左边补一位0。
    
    9. 循环移位指令:ROL  ROR 
    		格式:ROL DEST,OPRD
    		功能:循环左移指令ROL,目的操作数左移,每移位一次,其最高位移入最低位
    		         循环右移指令 ROR,	目的操作数右移,每移位一次,其最低位移入最高位,
    
    10. 双精度移位指令
    		格式:SHLD DEST,SRC,OPRD
    		          SHRD DEST,SRC,OPRD
    		功能:对于由目的操作数DEST和源操作数SRC构成的双精度数,按照操作数OPRD给出的移位位数,进行移位。SHLD是对目的操作数进行左移,SHRD是对目的操作数进行右移
    

    (4) 串操作指令。
    串操作允许程序对连续存放大的数据块进行操作。

    1. 字符串传送指令 MOVSB MOVSW MOVSD
    		格式:MOVS DESTS, SRCS
    		功能:将规定的源串元素复制到规定的目的串单元中
    
    2. 字符串比较指令 CMPSB,CMPSW,CMPSD
    		格式:CMPS DESTS, SRCS
    		功能:由规定的源串元素减去指出的目的串元素,结果不回送,仅影响标志位CF,AF,PF,OF,ZF,SF。
    
    3. 字符串搜索指令 SCASB,SCASW
    		格式:SCAS DESTS
    		功能:由AL,AX或EAX的内容减去规定的目的串元素,结果不回送,仅影响标志位CF,AF,PF,SF,OF,ZF。
    

    (5) 控制转移指令。
    计算机执行程序一般是顺序地逐条执行指令。但经常须要根据不同条件做不同的处理,有时需要跳过几条指令,有时需要重复执行某段程序,或者转移到另一个程序段去执行。用于控制程序流程的指令包括转移、循环、过程调用和中断调用。

    1. 无条件转移指令:JMP
    		格式:JMP TARGET
    		功能:使程序无条件地转移到指令规定的目的地址TARGET去执行指令。
    
    2. 单标志位条件转移指令
    		格式:JZ NEXT;
    		功能:若标志ZF=1则转移到标号NEXT处执行。(结果为0(或相等)则转移)
    
    3. 无符号数比较条件转移
    		格式:JA NEXT;
    		功能:无符号数A与B比较,若A>B则转移到标号NEXT处执行程序
    
    4. 带符号数比较条件转移
    		格式: JG NEXT;
    		功能:若A>B则转移到标号NEXT。
    		
    5. JS(结果为负则转移)
        
    6. JNS(结果为正则转移)
    
    7. JP(奇偶位为1则转移)
    
    8. JNP(奇偶位为0则转移)
    
    9. 循环指令集
    		格式: LOOP 地址
    		功能: 循环指令集
    
    10. CALL,RET
    		格式:CALL 地址 RET RET n
    		功能: 子程序调用,返回指令
    

    (6) 处理器控制指令。

    1. 空操作:NOP
    		功能:空操作,除使IP/EIP增1外,不做任何工作。该指令不影响标志位。
    
    2. 处理器等待指令:WAIT
    		功能:检查BUSY引脚状态,等待协处理器完成当前工作。
    
    3. 处理器暂停指令:HLT
    		功能:暂停程序的执行。当产生一个外部中断或非屏蔽中断时,才继续执行下一条指令。
    
    4. 中断指令:INT 
    		格式:INT n
    		功能:功能:产生中断类型码为n的软中断,该指令包含中断操作码和中断类型码两部分,中断类型码n为8位,取值范围为0~255(00H~FFH)。
    

    (7) 保护方式指令。

    展开全文
  • x86汇编指令集大全(带注释) 汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下! ---------- 一、数据传输指令 --------------------------------------...

    x86汇编指令集大全(带注释)

     

    汇编指令集太多,如果不用就会忘记,所以将i处理器官方的指令集大全写到博客上,有需要的人可以参考一下!

    ---------- 一、数据传输指令 ----------------------------------------------------
    它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据.

    1. 通用数据传送指令

    MOV     传送字或字节.  
    MOVSX   先符号扩展,再传送.  
    MOVZX   先零扩展,再传送.  
    PUSH    把字压入堆栈.  
    POP     把字弹出堆栈.  
    PUSHA   把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.  
    POPA    把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.  
    PUSHAD  把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.  
    POPAD   把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.  
    BSWAP   交换32位寄存器里字节的顺序  
    XCHG    交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)  
    CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)  
    XADD    先交换再累加.(结果在第一个操作数里)  
    XLAT    字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)  
    

    2. 输入输出端口传送指令.

    IN      I/O端口输入. ( 语法: IN   累加器,    {端口号│DX} )  
    OUT     I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时,    其范围是 0-255; 由寄存器 DX 指定时,其范围是    0-65535.  
    

    3. 目的地址传送指令.

    LEA     装入有效地址.例: LEA DX,string ;把偏移地址存到DX.  
    LDS     传送目标指针,把指针内容装入DS.例: LDS SI,string   ;把段地址:偏移地址存到DS:SI.  
    LES     传送目标指针,把指针内容装入ES.例: LES DI,string   ;把段地址:偏移地址存到ES:DI.  
    LFS     传送目标指针,把指针内容装入FS.例: LFS DI,string   ;把段地址:偏移地址存到FS:DI.  
    LGS     传送目标指针,把指针内容装入GS.例: LGS DI,string   ;把段地址:偏移地址存到GS:DI.  
    LSS     传送目标指针,把指针内容装入SS.例: LSS DI,string   ;把段地址:偏移地址存到SS:DI.  
    

    4. 标志传送指令.

    LAHF    标志寄存器传送,把标志装入AH.  
    SAHF    标志寄存器传送,把AH内容装入标志寄存器.  
    PUSHF   标志入栈.  
    POPF    标志出栈.  
    PUSHD   32位标志入栈.  
    POPD    32位标志出栈.  
    

    ---------- 二、算术运算指令 ------------------------------------------

    ADC     带进位加法.  
    INC     加 1.  
    AAA     加法的ASCII码调整.  
    DAA     加法的十进制调整.  
    SUB     减法.  
    SBB     带借位减法.  
    DEC     减 1.  
    NEG     求反(以    0 减之).  
    CMP     比较.(两操作数作减法,仅修改标志位,不回送结果).  
    AAS     减法的ASCII码调整.  
    DAS     减法的十进制调整.  
    MUL     无符号乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
    IMUL    整数乘法.结果回送AH和AL(字节运算),或DX和AX(字运算),  
    AAM     乘法的ASCII码调整.  
    DIV     无符号除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).  
    IDIV    整数除法.结果回送:商回送AL,余数回送AH, (字节运算);或 商回送AX,余数回送DX, (字运算).  
    AAD     除法的ASCII码调整.  
    CBW     字节转换为字. (把AL中字节的符号扩展到AH中去)  
    CWD     字转换为双字. (把AX中的字的符号扩展到DX中去)  
    CWDE    字转换为双字. (把AX中的字符号扩展到EAX中去)  
    CDQ     双字扩展. (把EAX中的字的符号扩展到EDX中去)  
    

    ---------- 三、逻辑运算指令 ------------------------------------

    AND     与运算.  
    OR      或运算.  
    XOR     异或运算.  
    NOT     取反.  
    TEST    测试.(两操作数作与运算,仅修改标志位,不回送结果).  
    SHL     逻辑左移.  
    SAL     算术左移.(=SHL)  
    SHR     逻辑右移.  
    SAR     算术右移.(=SHR)  
    ROL     循环左移.  
    ROR     循环右移.  
    RCL     通过进位的循环左移.  
    RCR     通过进位的循环右移.  
              以上八种移位指令,其移位次数可达255次.  
              移位一次时, 可直接用操作码. 如 SHL AX,1.  
              移位>1次时, 则由寄存器CL给出移位次数.  
              如 MOV CL,04   SHL AX,CL  
    

    ---------- 四、串指令 ---------------------------------------------

              DS:SI 源串段寄存器 :源串变址.  
              ES:DI 目标串段寄存器:目标串变址.  
              CX 重复次数计数器.  
              AL/AX 扫描值.  
              D标志   0表示重复操作中SI和DI应自动增量; 1表示应自动减量.  
              Z标志   用来控制扫描或比较操作的结束.  
    MOVS    串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )  
    CMPS    串比较.( CMPSB 比较字符. CMPSW 比较字. )  
    SCAS    串扫描.把AL或AX的内容与目标串作比较,比较结果反映在标志位.  
    LODS    装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字.    LODSD 传送双字. )  
    STOS    保存串.是LODS的逆过程.  
    REP         当CX/ECX<>0时重复.  
    REPE/REPZ   当ZF=1或比较结果相等,且CX/ECX<>0时重复.  
    REPNE/REPNZ 当ZF=0或比较结果不相等,且CX/ECX<>0时重复.  
    REPC        当CF=1且CX/ECX<>0时重复.  
    REPNC       当CF=0且CX/ECX<>0时重复.  
    

    ---------- 五、程序转移指令 -------------------------------

    1. 无条件转移指令 (长转移)

    JMP         无条件转移指令  
    CALL        过程调用  
    RET/RETF    过程返回.  
    

    2. 条件转移指令 (短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )

    JA/JNBE     不小于或不等于时转移.  
    JAE/JNB     大于或等于转移.  
    JB/JNAE     小于转移.  
    JBE/JNA     小于或等于转移.  
        以上四条,测试无符号整数运算的结果(标志C和Z).  
    JG/JNLE     大于转移.  
    JGE/JNL     大于或等于转移.  
    JL/JNGE     小于转移.  
    JLE/JNG     小于或等于转移.  
        以上四条,测试带符号整数运算的结果(标志S,O和Z).  
    JE/JZ       等于转移.  
    JNE/JNZ     不等于时转移.  
    JC          有进位时转移.  
    JNC         无进位时转移.  
    JNO         不溢出时转移.  
    JNP/JPO     奇偶性为奇数时转移.  
    JNS         符号位为 "0" 时转移.  
    JO          溢出转移.  
    JP/JPE      奇偶性为偶数时转移.  
    JS          符号位为 "1" 时转移.  
    

    3. 循环控制指令(短转移)

    LOOP            CX不为零时循环.  
    LOOPE/LOOPZ     CX不为零且标志Z=1时循环.  
    LOOPNE/LOOPNZ   CX不为零且标志Z=0时循环.  
    JCXZ            CX为零时转移.  
    JECXZ           ECX为零时转移.  
    

    4. 中断指令

    INT         中断指令  
    INTO        溢出中断  
    IRET        中断返回  
    

    5. 处理器控制指令

    HLT         处理器暂停,  直到出现中断或复位信号才继续.  
    WAIT        当芯片引线TEST为高电平时使CPU进入等待状态.  
    ESC         转换到外处理器.  
    LOCK        封锁总线.  
    NOP         空操作.  
    STC         置进位标志位.  
    CLC         清进位标志位.  
    CMC         进位标志取反.  
    STD         置方向标志位.  
    CLD         清方向标志位.  
    STI         置中断允许位.  
    CLI         清中断允许位.  
    

    ---------- 六、伪指令 ------------------------------------

    DW          定义字(2字节).  
    PROC        定义过程.  
    ENDP        过程结束.  
    SEGMENT     定义段.  
    ASSUME      建立段寄存器寻址.  
    ENDS        段结束.  
    END         程序结束.  
    

    ---------- 七、处理机控制指令:标志处理指令 -----------

    CLC     进位位置0指令  
    CMC     进位位求反指令  
    STC     进位位置为1指令  
    CLD     方向标志置1指令  
    STD     方向标志位置1指令  
    CLI     中断标志置0指令  
    STI     中断标志置1指令  
    NOP     无操作  
    HLT     停机  
    WAIT    等待  
    ESC     换码  
    LOCK    封锁  
    

    ========== 浮点运算指令集 =========

    一、控制指令(带9B的控制指令前缀F变为FN时浮点不检查,机器码去掉9B)----

    FINIT                 初始化浮点部件                  机器码  9B DB E3  
    FCLEX                 清除异常                         机器码  9B DB E2  
    FDISI                 浮点检查禁止中断                 机器码  9B DB E1  
    FENI                  浮点检查禁止中断二            机器码  9B DB E0  
    WAIT                  同步CPU和FPU                    机器码  9B  
    FWAIT                 同步CPU和FPU                    机器码  D9 D0  
    FNOP                  无操作                          机器码  DA E9  
    FXCH                  交换ST(0)和ST(1)                机器码  D9 C9  
    FXCH ST(i)            交换ST(0)和ST(i)                机器码  D9 C1iii  
    FSTSW ax              状态字到ax                       机器码  9B DF E0  
    FSTSW   word ptr mem  状态字到mem                      机器码  9B DD mm111mmm  
    FLDCW   word ptr mem  mem到状态字                      机器码  D9 mm101mmm  
    FSTCW   word ptr mem  控制字到mem                      机器码  9B D9 mm111mmm  
      
    FLDENV  word ptr mem  mem到全环境                      机器码  D9 mm100mmm  
    FSTENV  word ptr mem  全环境到mem                      机器码  9B D9 mm110mmm  
    FRSTOR  word ptr mem  mem到FPU状态                    机器码  DD mm100mmm  
    FSAVE   word ptr mem  FPU状态到mem                    机器码  9B DD mm110mmm  
      
    FFREE ST(i)           标志ST(i)未使用                   机器码  DD C0iii  
    FDECSTP               减少栈指针1->0 2->1             机器码  D9 F6  
    FINCSTP               增加栈指针0->1 1->2             机器码  D9 F7  
    FSETPM                浮点设置保护                       机器码  DB E4  
    

    ---------- 二、数据传送指令 -----------------------------------------

    FLDZ                  将0.0装入ST(0)                  机器码  D9 EE  
    FLD1                  将1.0装入ST(0)                  机器码  D9 E8  
    FLDPI                 将π装入ST(0)                    机器码  D9 EB  
    FLDL2T                将ln10/ln2装入ST(0)             机器码  D9 E9  
    FLDL2E                将1/ln2装入ST(0)                机器码  D9 EA  
    FLDLG2                将ln2/ln10装入ST(0)             机器码  D9 EC  
    FLDLN2                将ln2装入ST(0)                  机器码  D9 ED  
      
    FLD    real4 ptr mem  装入mem的单精度浮点数             机器码  D9 mm000mmm  
    FLD    real8 ptr mem  装入mem的双精度浮点数             机器码  DD mm000mmm  
    FLD   real10 ptr mem  装入mem的十字节浮点数             机器码  DB mm101mmm  
      
    FILD    word ptr mem  装入mem的二字节整数              机器码  DF mm000mmm  
    FILD   dword ptr mem  装入mem的四字节整数              机器码  DB mm000mmm  
    FILD   qword ptr mem  装入mem的八字节整数              机器码  DF mm101mmm  
      
    FBLD   tbyte ptr mem  装入mem的十字节BCD数            机器码  DF mm100mmm  
      
    FST    real4 ptr mem  保存单精度浮点数到mem             机器码  D9 mm010mmm  
    FST    real8 ptr mem  保存双精度浮点数到mem             机器码  DD mm010mmm  
      
    FIST    word ptr mem  保存二字节整数到mem              机器码  DF mm010mmm  
    FIST   dword ptr mem  保存四字节整数到mem              机器码  DB mm010mmm  
      
    FSTP   real4 ptr mem  保存单精度浮点数到mem并出栈      机器码  D9 mm011mmm  
    FSTP   real8 ptr mem  保存双精度浮点数到mem并出栈      机器码  DD mm011mmm  
    FSTP  real10 ptr mem  保存十字节浮点数到mem并出栈      机器码  DB mm111mmm  
      
    FISTP   word ptr mem  保存二字节整数到mem并出栈           机器码  DF mm011mmm  
    FISTP  dword ptr mem  保存四字节整数到mem并出栈           机器码  DB mm011mmm  
    FISTP  qword ptr mem  保存八字节整数到mem并出栈           机器码  DF mm111mmm  
      
    FBSTP  tbyte ptr mem  保存十字节BCD数到mem并出栈     机器码  DF mm110mmm  
      
    FCMOVB                ST(0),ST(i) <时传送              机器码  DA C0iii  
    FCMOVBE               ST(0),ST(i) <=时传送             机器码  DA D0iii  
    FCMOVE                ST(0),ST(i) =时传送             机器码  DA C1iii  
    FCMOVNB               ST(0),ST(i) >=时传送             机器码  DB C0iii  
    FCMOVNBE              ST(0),ST(i) >时传送              机器码  DB D0iii  
    FCMOVNE               ST(0),ST(i) !=时传送            机器码  DB C1iii  
    FCMOVNU               ST(0),ST(i) 有序时传送        机器码  DB D1iii  
    FCMOVU                ST(0),ST(i) 无序时传送        机器码  DA D1iii  
    

    ---------- 三、比较指令 -----------------------------------------

    FCOM                  ST(0)-ST(1)                      机器码  D8 D1  
    FCOMI                 ST(0),ST(i)  ST(0)-ST(1)         机器码  DB F0iii  
    FCOMIP                ST(0),ST(i)  ST(0)-ST(1)并出栈   机器码  DF F0iii  
    FCOM   real4 ptr mem  ST(0)-实数mem                      机器码  D8 mm010mmm  
    FCOM   real8 ptr mem  ST(0)-实数mem                      机器码  DC mm010mmm  
      
    FICOM   word ptr mem  ST(0)-整数mem                      机器码  DE mm010mmm  
    FICOM  dword ptr mem  ST(0)-整数mem                      机器码  DA mm010mmm  
    FICOMP  word ptr mem  ST(0)-整数mem并出栈               机器码  DE mm011mmm  
    FICOMP dword ptr mem  ST(0)-整数mem并出栈               机器码  DA mm011mmm  
      
    FTST                  ST(0)-0                          机器码  D9 E4  
    FUCOM  ST(i)          ST(0)-ST(i)                      机器码  DD E0iii  
    FUCOMP ST(i)          ST(0)-ST(i)并出栈                   机器码  DD E1iii  
    FUCOMPP               ST(0)-ST(1)并二次出栈             机器码  DA E9  
    FXAM                  ST(0)规格类型                    机器码  D9 E5  
    

    ---------- 四、运算指令 --------------------------------------

    FADD                  把目的操作数 (直接接在指令后的变量或堆栈缓存器) 与来源操作数 (接在目的操作数后的变量或堆栈缓存器)  相加,并将结果存入目的操作数  
    FADDP  ST(i),ST       这个指令是使目的操作数加上 ST  缓存器,并弹出 ST 缓存器,而目的操作数必须是堆栈缓存器的其中之一,最后不管目的操作数为何,经弹出一次后,目的操作数会变成上一个堆栈缓存器了  
    FIADD                 FIADD 是把 ST   加上来源操作数,然后再存入 ST 缓存器,来源操作数必须是字组整数或短整数形态的变数  
      
    FSUB                  减  
    FSUBP  
    FSUBR                 减数与被减数互换  
    FSUBRP  
    FISUB  
    FISUBR  
      
    FMUL                  乘  
    FMULP  
    FIMUL  
      
    FDIV                  除  
    FDIVP  
    FDIVR  
    FDIVRP  
    FIDIV  
    FIDIVR  
      
    FCHS                  改变 ST 的正负值  
      
    FABS                  把 ST  之值取出,取其绝对值后再存回去。  
      
    FSQRT                 将 ST  之值取出,开根号后再存回去。  
      
    FSCALE                这个指令是计算 ST*2^ST(1)之值,再把结果存入 ST 里而 ST(1)   之值不变。ST(1)  必须是在 -32768 到 32768 (-215 到 215 )之间的整数,如果超过这个范围计算结果无法确定,如果不是整数 ST(1)    会先向零舍入成整数再计算。所以为安全起见,最好是由字组整数载入到 ST(1) 里。  
      
    FRNDINT               这个指令是把 ST 的数值舍入成整数,FPU    提供四种舍入方式,由 FPU 的控制字组(control    word)中的 RC 两个位决定  
                              RC    舍入控制  
                              00    四舍五入  
                              01    向负无限大舍入  
                              10    向正无限大舍入  
                              11    向零舍去  
    展开全文
  • 从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。相应的,微处理随着微指令的复杂度也可分为 CISC 及 RISC 这两类。 CISC是一种为了便于编程和提高存储器访问效率的芯片设计体系...
  • 操作码通常位于第一字节,某些指令操作码会扩展到第二字节(即ModR/M字节)的REG域,故有时候REG域也被称为REG/Opcode域,用来指出该域的两种用途。 绝大多数的指令的第一字节的高6个比特位(即BYTE1[7:2])是操作...
  • 目录 正文 0. 1. 2. ...所谓指令集,就是CPU中用来计算和控制计算机系统的...CPU的指令集从主流的体系结构上分为精简指令集(RISC)和复杂指令集(CISC)。嵌入式系统中的主流处理器——ARM处理器,所使用的就是精...
  • ARM指令集和X86指令集的比较

    千次阅读 2012-11-24 00:00:40
    从现阶段的主流体系结构讲,指令集可分为复杂指令集(CISC)和精简指令集(RISC)两部分。 相应的,微处理随着微指令的复杂度也可分为CISC及RISC这两类。 CISC 是一种为了便于编程和提高记忆体访问效率的晶片设计...
  • x86 汇编指令集大全

    2019-11-13 10:24:29
    X86和X87汇编指令大全(有注释) ---------- 一、数据传输指令 ---------------------------------------------------- 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 通用数据传送指令. MOV 传送字或...
  • 这里写目录标题控制条件改变条件指令cmp指令(减法)test指令(按位与)set指令(设置条件)跳转指令switch语句的底层栈帧与过程如何调函数?转移语句call 与 ret函数传参调用函数时的状态保存保存约定,...
  • x86处理器指令集

    千次阅读 2013-11-18 21:37:52
    这部分指令包括通用数据传送指令MOV、条件传送指令CMOVcc、堆栈操作指令PUSH/PUSHA/PUSHAD/POP/POPA/POPAD、交换指令XCHG/XLAT/BSWAP、地址或段描述符选择子传送指令LEA/LDS/LES/LFS/LGS/LSS等。注意,CMOVcc不是一...
  • X86 指令格式及编码解析 (IA32 Mode)

    千次阅读 2018-08-14 10:31:27
    X86指令由: 前缀字节prefix (非必需) 操作码opcode (必须) 内存/寄存器操作数字节ModR/M (非必需) 索引寻址描述字节SIB (非必需) 常数偏移字节/半字/字Displacement (非必需) 立即数字节/半字/字 Immediate ...
  • 指令集依照机器操作码、汇编助记符和汇编操作数来描述指令,方便汇编指令查看,怀旧。现在是64位了,只能用于参考。64位有了兼容性扩展
  • x86通用(或常用)指令: n  数据传送: u  mov:复制数据 u  movsx:符号填充,用源的符号位填充高位 u  movzx:零填充,用0填充高位 u  xchg:交换两个操作数的值,操作数类型需要相同 u  lea(load ...
  • 国产CPU,指令集之殇 ARM 和 x86 有什么区别? ARM 处理器:RISC与CISC 是什么? 0. 基础知识 0.1 什么是指令集 所谓指令集,是CPU中用来计算和控制计算机系统的一套指令的集合。指令的强弱是CPU的重要指标,指令集...
  • CPU指令集存储位置在哪里?

    千次阅读 2019-10-11 17:00:25
    所以我们在CPU里是不可能找到“指令集”的实体的,如果非要具象化,那它就是“汇编语言”转换到“机器”(相当于一个翻译过程)+CPU执行机器的晶体管和逻辑电路的集合。 CPU指令集与CPU的架构息息相关,我们...
  • x86汇编指令集大全

    2020-03-16 10:33:30
    X86和X87汇编指令大全(有注释) ---------- 一、数据传输指令 ---------------------------------------------------- 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV ...
  • x86 cpu 函数调用指令集 call ret 主要作用是保存现场和恢复现场,比如 cpu 寄存器压栈和弹栈; jvm 函数调用指令集 invokevirtual invokeinterface invokespecial invokestatic return .. 等等,由于 jvm 没有物理...
  • x86汇编指令详解

    万次阅读 2015-12-01 16:07:41
    80x86指令系统  80x86指令系统,指令按功能可分为以下七个部分。... (1) 数据传送指令。... (2) 算术运算指令。... (3) 逻辑运算指令。... (4) 串操作指令。  (5) 控制转移指令。  (6) 处理器控制指令。  
  • ARM指令机器

    千次阅读 2020-01-31 19:54:21
    ARM采用的是32位架构 ARM指令集(32-bit) Thumb指令集(16-bit) ARM instruction set encoding 指令的机器(如指令 moveq r0,r1 机器 0x01A00001) 0000(EQ) Z = 1 ...
  • 计算机体系结构.指令集架构

    千次阅读 多人点赞 2019-06-08 22:28:19
    指令集架构 微结构与ISA 微结构(Microarchitecture)对应的是底层硬件如何实现指令执行的,那么指令集架构(Instruction Set Architecture)对应的是程序员所看到的程序的模样。 具体指令是如何被处理器一步一步...
  • x86汇编指令集(转)

    千次阅读 2010-05-22 10:44:00
    数据传输指令 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. MOV 传送字或字节. MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. MOVSX reg16,r/m8 ; o16 0F BE /r [386] MOVSX ...
  • 用大白话带你理解CPU指令集

    千次阅读 2020-08-24 12:03:21
    指令集与机器 无论处于上层的软件多么的高级, 想要在CPU执行, 就必须被翻译成"机器", 翻译这个工作由编译器来执行. 编译器在这个过程中, 要经过"编译", "汇编", "链接"几个步骤, 最后生成"可执行文件". 可执行...
  • 指令集的架构模型分为基于栈的指令集架构与基于寄存器的指令集架构两种,HotSpot虚拟机中的任何操作都需要入栈和出栈的步骤,即使用栈来管理运行,而HotSpot本身就是基于栈的指令集架构。 下图展示了栈式指令集架构...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,882
精华内容 5,952
关键字:

x86指令集操作码