我是靠谱客的博主 英勇向日葵,最近开发中收集的这篇文章主要介绍初步分析汇编代码1. C 语言程序main.c2. 汇编程序main.s(通过gcc -S -o main.s main.c -m32得来,并去掉以 .开头的辅助链接信息)3. 关键汇编命令对应的简单汇编命令4. 知识点简单介绍5. 现在模拟堆栈,执行汇编程序6. 结束语,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

该篇文章为《中科大老师全程讲解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        %eaxsubl        $4, %esp
movl        %eax, (%esp)
popl          %eax

movl        (%esp), %eax

addl        $4, %esp

call           0x12345

pushl       %eip(*)

movl        $0x12345, %eip(*)

retpop          %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. 结束语所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(67)

评论列表共有 0 条评论

立即
投稿
返回
顶部