1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
c:
.long 10 # 定义一个变量c为10,.long是定义长整型变量的指令
func(int):
push ebp # 将ebp寄存器的值保存到栈中
mov ebp, esp # 将esp寄存器的值赋给ebp,相当于保存了当前函数的栈指针
sub esp, 16 # 在栈上为局部变量和函数参数分配16字节的空间,esp寄存器指向新的栈顶位置
add DWORD PTR [ebp+8], 1 # 取出调用函数时压入栈中的第一个参数,并将其加1
mov eax, DWORD PTR [ebp+8] # 将参数赋值给eax寄存器
mov DWORD PTR [ebp-4], eax # 将eax的值传递给局部变量[ebp-4]
mov eax, DWORD PTR c # 将变量c的值赋给eax寄存器
add eax, 1 # 将eax的值加1
mov DWORD PTR c, eax # 将eax的值赋给变量c
nop # 空指令
leave # 恢复栈指针
ret # 返回函数结果
main:
push ebp # 将ebp寄存器的值保存到栈中
mov ebp, esp # 将esp寄存器的值赋给ebp,相当于保存了当前函数的栈指针
sub esp, 16 # 在栈上为局部变量和函数参数分配16字节的空间,esp寄存器指向新的栈顶位置
mov DWORD PTR [ebp-4], 100 # 将100赋值给局部变量[ebp-4]
push DWORD PTR [ebp-4] # 将[ebp-4]的值压入栈中,作为函数调用的参数
call func(int) # 调用函数func
add esp, 4 # 释放栈空间
mov eax, DWORD PTR c # 将变量c的值赋给eax寄存器
sub eax, 1 # 将eax的值减1
mov DWORD PTR c, eax # 将eax的值赋给变量c
mov DWORD PTR [ebp-8], 200 # 将200赋值给局部变量[ebp-8]
push DWORD PTR [ebp-8] # 将[ebp-8]的值压入栈中,作为函数调用的参数
call func(int) # 调用函数func
add esp, 4 # 释放栈空间
mov eax, DWORD PTR c # 将变量c的值赋给eax寄存器
add eax, 3 # 将eax的值加3
mov DWORD PTR c, eax # 将eax的值赋给变量c
mov eax, 0 # 将eax寄存器清零
leave # 恢复栈指针
ret # 返回函数结果
|