X86架构基本汇编指令详解 |
您所在的位置:网站首页 › 汇编指令大全chm › X86架构基本汇编指令详解 |
文章目录
汇编指令伪指令1. .MODEL2. .STACK3. ENDP4. END
汇编指令1. MOV:将源操作数复制到目的操作数2. MOVZX 和 MOVSX3. XCHG:交换两个操作数内容4. INC 和 DEC5. ADD 和 SUB:操作数相加减;6. NEG: NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反;7. ALIGN伪指令:对齐一个变量8. JMP指令9. LOOP指令10. PUSH,POP指令11. PUSHFD,POPFD指令12. PUSHAD, PUSHA, POPAD, POPA13. CALL和RET指令14. AND,OR, XOR, NOT 指令15. TEST指令:对两个操作数进行按位与操作16. CMP指令:比较整数17. 跳转指令18. 移位和循环移位指令19. MUL指令:无符号乘法20. IMUL指令:有符号乘法21. DIV指令:无符号除法22. IDICV:有符号除法23. LEA:返回间接操作数的地址
汇编指令
伪指令
1. .MODEL
.model flat,stdcall
model伪指令告诉汇编程序使用哪一种存储模式:32 位程序总是使用平面(flat)存储模式,它与处理器的保护模式相关联。关键字 stdcall 在调用程序时告诉汇编器,怎样管理运行时堆栈。 然后是 .STACK 伪指令,它告诉汇编器应该为程序运行时堆栈保留多少内存字节。 2. .STACK .stack 4096数值 4096 可能比将要用的字节数多,但是对处理器的内存管理而言,它正好对应了一个内存页的大小。所有的现代程序在调用子程序时都会用到堆栈。首先,用来保存传递的参数; 其次,用来保存调用函数的代码的地址。 3. ENDP main ENDPENDP 伪指令标记一个过程的结束。如果程序有名为 main 的过程,则 endp 就必须使用同样的名称; 4. END END main最后,END 伪指令标记一个程序的结束,并要引用程序入口; 汇编指令 1. MOV:将源操作数复制到目的操作数MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数: MOV destination, sourece两个操作数必须是同样的大小。 两个操作数不能同时为内存操作数。 指令指针寄存器(IP、EIP 或 RIP)不能作为目标操作数。 MOV指令不能直接将较小的操作数复制到较大的操作数中 2. MOVZX 和 MOVSXMOVZX 指令(进行全零扩展并传送)将源操作数复制到目的操作数,并把目的操作数 0 扩展到 16 位或 32 位。这条指令只用于无符号整数,有三种不同的形式; MOVZX reg32,reg/mem8 MOVZX reg32,reg/mem16 MOVZX reg16,reg/mem8MOVSX 指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 16 位或 32 位。这条指令只用于有符号整数,有三种不同的形式; MOVSX reg32, reg/mem8 MOVSX reg32, reg/mem16 MOVSX reg16, reg/mem8 3. XCHG:交换两个操作数内容三种格式: XCHG reg, reg XCHG reg, mem XCHG mem, reg不能直接交换两个内存操作数 4. INC 和 DECINC(增加)和DEC(减少)指令分别表示寄存器加 1 和减 1: INC reg/mem DEC reg/mem不支持直接对内存进行操作 5. ADD 和 SUB:操作数相加减; 6. NEG: NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反; NEG reg NEG mem将目标操作数按位取反再加 1,就可以得到这个数的二进制补码。 7. ALIGN伪指令:对齐一个变量ALIGN 伪指令将一个变量对齐到字节边界、字边界、双字边界或段落边界。 ALIGN bound ALIGN 4 ;偏移量按4对齐 8. JMP指令JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量。 JMP destination当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。 无限循环 top: . . jmp top 9. LOOP指令LOOP 指令,正式称为按照 ECX 计数器循环,将程序块重复特定次数。ECX 自动成为计数器,每循环一次计数值减 1。 循环目标必须距离当前地址计数器 -128 到 +127 字节范围内。LOOP 指令的执行有两个步骤: 第一步,ECX 减 1。第二步,将 ECX 与 0 比较。当ECX不等于0,则跳转到符号内容中; 若ECX不等于0,则不发生跳转。 ; 每次循环将AX加1,当循环结束,AX=5,ECX=0 MOV AX, 0 MOV ECX, 5 L1: INC AX LOOP L1 10. PUSH,POP指令PUSH 指令首先减少 ESP 的值,再将源操作数复制到堆栈。操作数是 16 位的,则 ESP 减 2,操作数是 32 位的,则 ESP 减 4。 PUSH reg/mem16 PUSH reg/mem32 PUSH inm32POP 指令首先把 ESP 指向的堆栈元素内容复制到一个 16 位或 32 位目的操作数中,再增加 ESP 的值。如果操作数是 16 位的,ESP 加 2,如果操作数是 32 位的,ESP 加 4。 POP reg/mem16 POP reg/mem32 11. PUSHFD,POPFD指令PUSHFD 指令把 32 位 EFLAGS 寄存器内容压入堆栈,而 POPFD 指令则把栈顶单元内容弹出到 EFLAGS 寄存器。 PUSHFD ;保持标志寄存器 POPFD ;恢复标志寄存器 12. PUSHAD, PUSHA, POPAD, POPA PUSHAD 指令按照 EAX、ECX、EDX、EBX、ESP、EBP、ESI 和 EDI 的顺序(执行 PUSHAD 之前的值),将所有 32 位通用寄存器压入堆栈;POPAD 指令按照相反顺序将同样的寄存器弹出堆栈。PUSHA 指令按序(AX、CX、DX、BX、SP、BP、SI 和 DI)将 16 位通用寄存器压入堆栈;POPA 指令按照相反顺序将同样的寄存器弹出堆栈。 13. CALL和RET指令CALL 指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用 RET(从过程返回)指令将处理器转回到该过程被调用的程序点上。 从物理上来说,CALL 指令将其返回地址压入堆栈,再把被调用过程的地址复制到指令指针寄存器。当过程准备返回时,它的 RET 指令从堆栈把返回地址弹回到指令指针寄存器。 CALL function_name RET 14. AND,OR, XOR, NOT 指令 AND destination, source ; 对两个操作数进行按位与操作 OR destination, source ; 对两个操作数进行按位或操作 XOR destination, source ; 对两个操作数进行按位异或操作 NOT reg ; 翻转操作数的所有位 15. TEST指令:对两个操作数进行按位与操作TEST与AND 指令唯一不同的地方是,TEST 指令不修改目标操作数。TEST 指令允许的操作数组合与 AND 指令相同。在发现操作数中单个位是否置位时,TEST 指令非常有用。 ; 测试AL寄存器的位0和位3是否为1 TEST al, 00001001b当所以测试位都为0时,零标志位ZF才为1 16. CMP指令:比较整数 CMP destination, source标志位 当实际的减法发生时,CMP 指令按照计算结果修改溢出、符号、零、进位、辅助进位和奇偶标志位。 如果比较的是两个无符号数,则零标志位和进位标志位表示的两个操作数之间的关系如表所示: CMP结果ZFCF目的操作数 < 源操作数01目的操作数 > 源操作数00目的操作数 = 源操作数10如果比较的是两个有符号数,则符号标志位、零标志位和溢出标志位表示的两个操作数之间的关系如表所示: CMP结果标志位目的操作数 < 源操作数SF≠OF目的操作数 > 源操作数SF=OF目的操作数 = 源操作数ZF=1一般而言,CMP指令与跳转指令相结合: CMP指令的作用在于比较之后设置标志位,而跳转指令通过判断标志位来进行跳转,达到if语句的效果。 17. 跳转指令跳转指令与CMP指令相结合,可以达到if语句的效果。 助记符说明标志位/寄存器助记符说明标志位/寄存器JZ为0跳转ZF=1JNO无溢出跳转OF=0JNA非0跳转ZF=0JS有符号跳转SF=1JC进位跳转CF=1JNS无符号跳转SF=0JNC无进位跳转CF=0JP偶校验跳转PF=0JO溢出跳转OF=1JNP奇校验跳转PF=0相等性的比较 表中符号 leftOp 和 rightOp 分别指的是 CMP 指令中的左(目的)操作数和右(源)操 作数; 助记符说明JE相等跳转(leftOp=rightOp)JNE不相等跳转 (leftOp M rightOp)JCXZCX=0跳转JECXZECX=0跳转JRCXZRCX=0跳转(64位模式) mov edx, 0A523h cmp edx, 0A523h jne L5 ;不发生跳转 je L1 ;跳转无符号数比较 基于无符号数比较的跳转如下表所示。操作数的名称反映了表达式中操作数的顺序(比如 leftOp < rightOp); 助记符说明助记符说明JA大于跳转(若 leftOp > rightOp)JB小于跳转(若 leftOp < rightOp)JNBE不小于或等于跳转(与 JA 相同)JNAE不大于或等于跳转(与 JB 相同)JAE大于或等于跳转(若 leftOp ≥ rightOp)JBE小于或等于跳转(若 leftOp ≤ rightOp)JNB不小于跳转(与 JAE 相同)JNA不大于跳转(与 JBE 相同)有符号数比较 助记符说明助记符说明JG大于跳转(若 leftOp > rightOp)JL小于跳转(若 leftOp < rightOp)JNLE不小于或等于跳转(与 JA 相同)JNGE不大于或等于跳转(与 JB 相同)JGE大于或等于跳转(若 leftOp ≥ rightOp)JLE小于或等于跳转(若 leftOp ≤ rightOp)JNL不小于跳转(与 JAE 相同)JNG不大于跳转(与 JLE 相同) 18. 移位和循环移位指令 SHR右移RCL带进位的循环左移SAL算术左移RCR带进位的循环右移SAR算数右移SHLD双精度左移ROL循环左移SHRD双精度右移SHL左移ROR循环右移移位 逻辑移位:空出来的位用 0 填充;算数移位:空出来的位用原数据的符号位填充;循环移位 以循环方式来移位即为位元循环。 当多字节整数以四位为单位进行循环移位时,其效果相当于一次向右或向左移动一个十六进制位。例如,将 6A4Bh 反复循环左移四位,最后就会回到初始值。 mov ax, 6A4Bh rol ax, 4 ; AX = A4B6h rol ax, 4 ; AX = 4B6Ah rol ax, 4 ; AX = B6A4h rol ax, 4 ; AX = 6A4Bh 19. MUL指令:无符号乘法乘数和被乘数的大小必须保持一致,乘积的大小则是它们的一倍。这三种类型都可以使用寄存器和内存操作数,但不能使用立即数: MUL reg/mem8 MUL reg/meml6 MUL reg/mem32 mov al, 5h mov bl, 10h mul bl ; AX = 0050h, CF = 0如果乘积的高半部分不为零,则 MUL 会把进位标志位和溢出标志位置 1。因为进位标志位常常用于无符号数的算术运算,在此我们也主要说明这种情况。 例如,当 AX 乘以一个 16 位操作数时,乘积存放在 DX 和 AX 寄存器对中。其中,乘积的高 16 位存放在 DX,低 16 位存放在 AX。如果 DX 不等于零, 则进位标志位置 1,这就意味着隐含的目的操作数的低半部分容纳不了整个乘积。 64 位模式下,MUL 指令可以使用 64 位操作数。一个 64 位寄存器或内存操作数与 RAX 相乘,产生的 128 位乘积存放到 RDX:RAX 寄存器中。 20. IMUL指令:有符号乘法与 MUL 指令不同,IMUL 会保留乘 积的符号,实现的方法是,将乘积低半部分的最高位符号扩展到高半部分。 21. DIV指令:无符号除法 DIV reg/mem8 DIV reg/meml6 DIV reg/mem32下表给出了被除数、除数、商和余数之间的关系: 被除数除数商余数AXreg/mem8ALAHDX:AXreg/mem16AXDXEDX:EAXreg/mem32EAXEDX64 位模式下,DIV 指令用 RDX:RAX 作被除数,用 64 位寄存器和内存操作数作除数, 商存放到 RAX,余数存放在 RDX 中。 mov ax, 0083h ; 被除数 mov bl, 2 ; 除数 div bl ; AL = 41h, AH = Olh 22. IDICV:有符号除法有符号除法几乎与无符号除法相同,只有一个重要的区别:在执行除法之前,必须对被除数进行符号扩展。 符号扩展是指将一个数的最高位复制到包含该数的变量或寄存器的所有高位中。 符号拓展指令有:CBW,CWD,CDQ,分别对应:字节转字,字转双字,双字转四字。 23. LEA:返回间接操作数的地址LEA 指令返回间接操作数的地址。由于间接操作数中包含一个或多个寄存器,因此会在运行时计算这些操作数的偏移量。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |