文章目录
- 汇编指令
-
-
- 伪指令
- 汇编指令
-
- 1. MOV:将源操作数复制到目的操作数
- 2. MOVZX 和 MOVSX
- 3. XCHG:交换两个操作数内容
- 4. INC 和 DEC
- 5. ADD 和 SUB:操作数相加减;
- 6. NEG: NEG(非)指令通过把操作数转换为其二进制补码,将操作数的符号取反;
- 7. ALIGN伪指令:对齐一个变量
- 8. JMP指令
- 9. LOOP指令
- 10. PUSH,POP指令
- 11. PUSHFD,POPFD指令
- 12. PUSHAD, PUSHA, POPAD, POPA
- 13. 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 ENDP
ENDP 伪指令标记一个过程的结束。如果程序有名为 main 的过程,则 endp 就必须使用同样的名称;
4. END
END main
最后,END 伪指令标记一个程序的结束,并要引用程序入口;
汇编指令
1. MOV:将源操作数复制到目的操作数
MOV 指令将源操作数复制到目的操作数。作为数据传送(data transfer)指令,它几乎用在所有程序中。在它的基本格式中,第一个操作数是目的操作数,第二个操作数是源操作数:
MOV destination, sourece
两个操作数必须是同样的大小。
两个操作数不能同时为内存操作数。
指令指针寄存器(IP、EIP 或 RIP)不能作为目标操作数。
MOV指令不能直接将较小的操作数复制到较大的操作数中
2. MOVZX 和 MOVSX
MOVZX 指令(进行全零扩展并传送)将源操作数复制到目的操作数,并把目的操作数 0 扩展到 16 位或 32 位。这条指令只用于无符号整数,有三种不同的形式;
MOVZX reg32,reg/mem8
MOVZX reg32,reg/mem16
MOVZX reg16,reg/mem8
MOVSX 指令(进行符号扩展并传送)将源操作数内容复制到目的操作数,并把目的操作数符号扩展到 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 和 DEC
INC(增加)和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对齐