概述
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);
这后,
P1和P2没变,但是在函数swap调用里边,p1和p2指向的数据内容变化改变了。
}
--解析:
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汇编完整解析例子所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复