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

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值