从汇编的角度看递归
来源:互联网 发布:网络销售授权合同 编辑:程序博客网 时间:2024/06/11 08:04
我们先来看怎样实现阶乘的函数(我的代码是在X64环境下的)
要实现阶乘,我们先设计一下代码:
(1)判断参数是否为1
(2)是,则结果为1。
( 3)否则,数字乘以该数字减一。然后分析下代码是如何工作的。
.section .data
.section .text
.globl _start
.globl factorial
_start:
pushq $4 #将参数入栈
call factorial
addq $8, %rsp #恢复rsp
movq %rax, %rbx #保存结果到rbx(状态码)
movq $1, %rax #exit
int $0x80
.type factorial, @function
factorial:
pushq %rbp
movq %rsp, %rbp #标准函数格式,建立函数栈帧
movq 16(%rbp), %rax # 取参数
cmpq $1, %rax #若为1,跳到end_factorial
je end_factorial
decq %rax
pushq %rax #参数入栈
call factorial
movq 16(%rbp), %rbx
imulq %rbx, %rax
end_factorial:
movq %rbp, %rsp #标准函数格式,恢复原栈帧
popq %rbp
ret
让我们一步步来分析:
_start: pushq $4 call factorial
可以看到,这个程序用于计算4的阶乘。我们先将参数压到栈中,然后调用函数。这时栈中情况是这样的:
4 返回地址
pushq %rbp movq %rsp, %rbp然后,建立函数栈帧。即将原栈帧保存到栈中,然后建立函数栈帧。这时栈中情况是这样的:
4 16(%rbp) 返回地址 8(%rbp) 旧%rbp %rbp
movq 16(%rbp), %rax cmpq $1, %rax je end_factorial decq %rax pushq %rax call factorial接着,将参数与1比较,若是则跳到end_factorial;否则,将其减1,然后压入栈中,调用函数factorial,直到参数变为1为止。这时栈中情况是这样的: 4 返回地址
旧%rbp ...... 1 返回地址 旧%rbp
movq 16(%rbp), %rbx imulq %rbx, %raxend_factorial:movq %rbp, %rsp popq %rbpret
这时,参数值和%rax的值肯定为1了,然后将1×1,保存到%rax。接着循环执行这段代码,直到所有的返回地址都被ret给popq。当然在此过程中,最终结果也保存在了%rax中。
addq $8, %rsp movq %rax, %rbx movq $1, %rax int $0x80最后,我们恢复栈顶指针,并将结果保存到存放状态码的%rbx中,最后调用exit(1)结束程序。
我们可以看到,在函数的递归过程中,栈的内存一直在被占用,而且越积越多,这也可以解释,为什么递归掉哟过会那么占内存了。而且我这里参数少,更是没有定义变量。
- 从汇编的角度看递归
- 从汇编的角度看段错误
- 从汇编的角度看栈
- 从汇编角度看计算机
- 从汇编、内存的角度看类中的this指针 .
- 从反汇编的角度看C++语法(构造函数)
- 从汇编角度看c++的const实现
- 从汇编角度看c++引用(reference)
- 从反汇编的角度看引用和指针的区别
- 从汇编角度看Linux C函数的调用约定和参数传递的细节
- 从汇编角度看C++类的方法访问类成员的原理
- 从汇编的角度看inline函数与非inline函数
- 从汇编和底层的角度看c和类c语言
- 从汇编角度看英特尔x86函数调用规范
- 从汇编角度看C语言类型转换
- [学习小记] 从汇编角度看局部变量的分配及数组名与指针的关系
- [学习小记] 从汇编角度看局部变量的分配及数组名与指针的关系 .
- 从FrameWork的角度看Creational Pattern
- 0-1背包
- 飞的故事电饭锅
- 谈谈陌陌争霸在数据库方面踩过的坑(排行榜篇)
- Maven构建spring+redis项目
- 改版最新攻略,将改版损失降至最低
- 从汇编的角度看递归
- Gnuplot 画多条线
- Support Library
- 关于android的网络访问——实现网络图片查看器
- (七)两个总体的统计推断和关于总体方差的统计推断
- netmap分析(3)-原理分析之数据结构关系
- 移动广告的形式
- http://blog.csdn.net/gray_1566/article/details/24491811
- php开发之cms开发体验