相关指令集总结
编号 | 命令 | 示例 | 解释 | 备注 |
---|---|---|---|---|
1 | push | push reg/mem16 push reg/mem32 push imm32 | push指令首先减少esp的值,再将源操作数复制到堆栈。 | - |
2 | pop | pop reg/mem16 pop reg/mem32 | pop指令首先把esp指向的堆栈元素内容复制到一个16位或32位目的操作数中,在增加esp的值。 | - |
3 | pushfd / popfd | pushfd popfd | pushfd指令吧32位EFLAGS寄存器内容压入堆栈,而popfd指令则把堆顶单元内容弹出到eflags寄存器。 | - |
4 | call/ret | call destination / ret | call指令调用一个过程,指挥处理器从新的内存地址开始执行。过程使用ret指令将处理器转回到该过程被调用的程序点上。 | - |
相关代码示例
- 字符串反转
.data
aName BYTE "Abraham Lincoln", 0
nameSize = ($ - aName) - 1
.code
main PROC
;
mov ecx, nameSize
mov esi, 0
L1:
movzx eax, aName[esi]
push eax
inc esi
loop L1
mov ecx, nameSize
mov esi, 0
L2:
pop eax
mov aName[esi], al
inc esi
loop L2
INVOKE ExitProcess, 0
main ENDP
END main
- 整数求和
;-----------------------------------------------
; sumOf
;
; 计算3个32位整数之和并返回和数。
; 接收: EAX,EBX和ECX为3个整数,可能是有符号数,也可能是无符号数。
; 返回: EAX=和数
;-----------------------------------------------
sumOf PROC
add eax, ebx
add eax, ecx
ret
sumOf ENDP
相关知识点总结
- proc伪指令
- 定义过程:过程可以非正式定义为,由返回语句结束的已命名的语句块。过程中用PROC和ENDP伪指令来定义,并且必须为其分配一个名字(有效标识符)
- 当在程序启动过程之外创建一个过程时,就用RET指令来结束它。
- 默认情况下,标号只在其定义的过程中可见。如果不这么做,可使用全局标号,即在名字后面加双冒号。
- 过程说明
- 对过程实现的所有任务的描述
- 输入参数以及用法的列表,并将其命名为Receives(接受)。如果输入参数对其数值有特殊要求,也要在这里列出来。
- 对过程返回的所有数值的描述,并将其命名为Returns(返回)。
- 所有特殊要求的列表,这些要求被称为先决条件,必须在过程被调用之前满足。列表命名为Requires。
- 向过程传递寄存器参数