概述
该篇文章为《中科大老师全程讲解Linux内核分析》对于汇编代码的解读过程
1. C 语言程序main.c
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
2. 汇编程序main.s(通过gcc -S -o main.s main.c -m32得来,并去掉以 .开头的辅助链接信息)
1 g:
2 pushl %ebp
3 movl %esp, %ebp
4 movl 8(%ebp), %eax
5 addl $3, %eax
6 popl %ebp
7 ret
8 f:
9 pushl %ebp
10 movl %esp, %ebp
11 subl $4, %esp
12 movl 8(%ebp), %eax
13 movl %eax, (%esp)
14 call g
15 leave
16 ret
17 main:
18 pushl %ebp
19 movl %esp, %ebp
20 subl $4, %esp
21 movl $8, (%esp)
22 call f
23 addl $1, %eax
24 leave
25 ret
3. 关键汇编命令对应的简单汇编命令
汇编命令 | 简单命令 |
pushl %eax | subl $4, %esp movl %eax, (%esp) |
popl %eax | movl (%esp), %eax addl $4, %esp |
call 0x12345 | pushl %eip(*) movl $0x12345, %eip(*) |
ret | pop %eip(*) |
enter | pushl %ebp movl %esp, %ebp |
leave | movl %ebp, %esp popl %ebp |
4. 知识点简单介绍
eip:运行程序下一个指令的地址
ebp:栈的基地址指针,指向栈底
esp:栈的栈顶指针,指向栈顶
pushl:入栈,esp 指向地址减 4
popl:出栈,esp 指向地址加 4
5. 现在模拟堆栈,执行汇编程序
程序都是从main函数开始执行
程序未开始状态:
1. 开始执行第 18 行代码: pushl %ebp
2. 开始执行第19行代码:movl %esp, %ebp
3. 开始执行第20行代码:subl $4, %esp
4. 开始执行第21行代码:movl $8, (%esp)
5. 开始执行第22行代码:call f
6. 开始执行第9行代码:pushl %ebp
7. 开始执行第10行代码:movl %esp, %ebp
8. 开始执行第11行代码:subl $4, %esp
9. 开始执行第12行代码:movl 8(%ebp), %eax
10. 开始执行第13行代码:movl %eax, (%esp)
11. 开始执行第14行代码:call g
12. 开始执行第2行代码:pushl %ebp
13. 开始执行第3行代码:movl %esp, %ebp
14. 开始执行第4行代码:movl 8(%ebp), %eax
15. 开始执行第5行代码:addl $3, %eax
16. 开始执行第6行代码:popl %ebp
17. 开始执行第7行代码:ret
18. 开始执行第15行代码:leave
19. 开始执行第16行代码:ret
20. 开始执行第23行代码:addl $1, %eax
24. 开始执行第24行代码:leave
6. 结束语
博主为了完整呈现上述汇编代码执行全过程,画图画了2个小时,好辛苦!
希望大家能有所收获!
最后
以上就是英勇向日葵为你收集整理的初步分析汇编代码1. C 语言程序main.c2. 汇编程序main.s(通过gcc -S -o main.s main.c -m32得来,并去掉以 .开头的辅助链接信息)3. 关键汇编命令对应的简单汇编命令4. 知识点简单介绍5. 现在模拟堆栈,执行汇编程序6. 结束语的全部内容,希望文章能够帮你解决初步分析汇编代码1. C 语言程序main.c2. 汇编程序main.s(通过gcc -S -o main.s main.c -m32得来,并去掉以 .开头的辅助链接信息)3. 关键汇编命令对应的简单汇编命令4. 知识点简单介绍5. 现在模拟堆栈,执行汇编程序6. 结束语所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复