我是靠谱客的博主 清脆奇迹,最近开发中收集的这篇文章主要介绍c汇编完整解析例子,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

c汇编完整解析例子

 

 

寄存器什么时候加括号:

对于指针寄存器ebp,取的是里边的内容,需要加括号;如,-4(%ebp);           

对于数值寄存器如eax,如果eax内容是指针,取括号就表示指向的数据。如movl (%eax),%edx 意思是把eax的值*x赋值给edx

movl $0x4050,%eax,立即数到寄存器

开始分析:

int swap(int *x, int *y)

{

int temp;

temp = *x; *x = *y; *y = temp;

return temp;

}

void main()

{

int a = 1, b = 2;

int *p1 = &a;

int *p2 = &b;

swap(p1, p2);

这后,

P1P2没变,但是在函数swap调用里边,p1p2指向的数据内容变化改变了。

 

}

--解析:

void main()

{

……

……

1—-局部变量

int a = 1, b = 2;

 movl %1,-4(%ebp);           

 movl %2,-8(%ebp);      

int *p1 = &a;

 movl -4(%ebp),%eax

 leal eax,-12(%ebp)

 

int *p2 = &b;

 movl -8(%ebp),%eax

 leal eax,-16(%ebp)

 

swap(p1, p2);

 

2—-函数参数压栈—

 movl -16(%ebp),%eax

 pushl %eax

 movl -12(%ebp),%eax

 pushl %eax

3---函数调用—保存下一处指令执行的地址(隐藏),进入该函数地址执行

 call @ILT+15(swap) (00401014) ;调用swap函数

  3.1.隐藏部分

call:

 pushl %eip

 movl swap-addr, %eip

 

  3.2. 跳转到函数定义处

 

4---恢复函数参数的压栈

 addl %8,%esp 清理堆栈中的参数

 }

  

void swap(int *x, int *y)

{

3.2.1寄存器保存便于环境恢复

 pushl %ebp

 movl %esp,%ebp; ebp指向栈顶

 subl %0x4C,%esp  局部变量分配用的空间,足够用

……

……

int temp;

temp = *x;

 movl 8(%ebp),%eax

 movl (%eax), -4(%ebp)

 

*x = *y;

 

 movl 12(%ebp),%eax

 movl (%eax), %edx

 movl 8(%ebp),%eax

 movl %edx,(%eax)

 

*y = temp;

 movl -4(%ebp), %eax

 mov 12(%ebp), %edx

 movl %eax,(%edx)

 

return temp;--here it already eax.

 

3.2.2寄存器恢复

leave:

 movl %ebp,%esp

 popl %ebp

 

3.2.3于3.1隐藏部分对应(call,ret),而后会跳转到该函数下的一指令地址去执行

ret:

 pop %eip

}

 

最后

以上就是清脆奇迹为你收集整理的c汇编完整解析例子的全部内容,希望文章能够帮你解决c汇编完整解析例子所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部