汇编语言学习笔记(七):分析一段汇编代码

下面是一段AT&T汇编语言代码:

g:
	pushl %ebp
	movl %esp,%ebp
	movl 8(%ebp),%eax
	addl $3,%eax
	popl %ebp
	ret

f:
	pushl %ebp
	movl %esp,%ebp
	subl $4,%esp
	movl 8(%ebp),%eax
	movl %eax,(%esp)
	call g
	leave
	ret

main:
	pushl %ebp
	movl %esp,%ebp
	subl $4,%esp
	movl $8,(%esp)
	call f
	addl $1,%eax
	leave
	ret

与分析C语言一样,我们从main段开始分析:

main:
	pushl %ebp    ;将ebp的值压入栈中(ebp的值为0)
	movl %esp,%ebp   ;将扩展栈寄存器的值放进基址指针寄存器中
	subl $4,%esp  ;把esp向下移动一个单位
	movl $8,(%esp) ;将立即数8放入esp当前指向的位置
	call f   ;执行f处的指令
	addl $1,%eax 
	leave
	ret

此时CPU就会在f处读指令了:

f:
	pushl %ebp    ;将ebp中的数据压入栈中
	movl %esp,%ebp   ;将扩展栈寄存器的值放进基址指针寄存器中
	subl $4,%esp   ;把esp向下移动一个单位
	movl 8(%ebp),%eax   ;eax = 8 (ebp变址寻址8)
	movl %eax,(%esp)     ; esp = 8
	call g      ;调用g段的代码
	leave
	ret

执行g处的指令:

g:
	pushl %ebp
	movl %esp,%ebp
	movl 8(%ebp),%eax  ;eax = 8
	addl $3,%eax   ;eax = 11
	popl %ebp
	ret

这段代码其实对应着一段C代码:

int g(int x)
{
	return x + 3;
}

int f(int x)
{
	return g(x);
}

int main(void)
{
	return f(8) + 1;
}
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值