这是一个深度递归的例子。

#include <stdio.h>
#include <stdlib.h>int recurse(int x) {int a[1<<15];  /* 4 * 2^15 =  64 KiB */printf("x = %d.  a at %p\n", x, a); a[0] = (1<<14)-1;a[a[0]] = x-1;if (a[a[0]] == 0)return -1;return recurse(a[a[0]]) - 1;
}int main(int argc, char *argv[]) {int x = 100;if (argc > 1)x = atoi(argv[1]);int v = recurse(x);printf("x = %d.  recurse(x) = %d\n", x, v);return 0;
}
1<<15

无符号数a的左移相当于将该数用二进制表示,左移n位就是把最高位n位移出,低位添加n个0的操作,左移操作相当于将该数乘以2^n次方。
无符号数a的左移相当于将该数用二进制表示,右移n位就是把低位n位移出,高位添加n个0的操作,右移操作相当于将该数除以2^n次方。
注意:上述两种操作对于有符号数不满足,因为有符号数最高位为符号位,进行左移或右移操作会使改变数的符号。

简单来说:

左移,后空缺自动补0;

右移,分为逻辑右移和算数右移

1)逻辑右移 不管是什么类型,空缺自动补0;

2)算数右移 若是无符号数,则空缺补0,若是负数,空缺补1;

int a[1<<15];  /* 4 * 2^15 =  64 KiB */

因为int整数型占4bytes,所以int a[1<<15]数组的大小为:4*2^15=64*2^10B=64KB

存储容量:是该存储设备上可以存储数据的最大数量,通常使用千字节(kb kilobyte)、兆字节(MB megabyte)、吉字节(GB, gigabyte)、太字节(TB ,terabyte)和PB(Petabyte)、EB(Exabyte)等来衡量。 
1KB=2(10)B=1024B; 括号中的数字为2的指数(即多少次方) 
1MB=2(10)KB=1024KB=2(20)B; 
1GB=2(10)MB=1024MB=2(30)B。 
1TB=2(10) GB=1024GB=2(40)B 
1PB=2(10) TB=1024TB=2(50)B 
1EB=2(10) PB=1024PB=2(60)B 
1Byte(相当於一个英文字母,您的名字相当6Bytes(6B)。 
Kilobyte(KB)=1024B相当於一则短篇故事的内容。 
Megabyte(MB)=l024KB相当於一则短篇小说的文字内容。 
Gigabyte(GB)=1024MB相当於贝多芬第五乐章交响曲的乐谱内容。 
Terabyte(TB)=1024GB相当於一家大型医院中所有的X光图片资讯量。 
Petabyte(PB)=l024TB相当於50%的全美学术研究图书馆藏书资讯内容。 
Exabyte (EB)=1024PB;5EB相当於至今全世界人类所讲过的话语。 
Zettabyte(ZB)=1024EB如同全世界海滩上的沙子数量总和。 
Yottabyte(YB)=1024ZB相当於7000位人类体内的微细胞总和。

printf("x = %d.  a at %p\n", x, a); 

打印输出x的大小和它的地址

a[0] = (1<<14)-1;

对于二维数组a[3][3]中a,&a,a[0],&a[0],&a[0][0]的区别和含义

if (a[a[0]] == 0)return -1;

递归函数结束的满足条件,即出口。

 return recurse(a[a[0]]) - 1;

表示不断进行递归调用

int main(int argc, char *argv[])

第一个int argc,是记录你输入在命令行上的字符串个数;
第二个*argv[]是个指针数组,存放输入在命令行上的命令(字符串)。

x = atoi(argv[1]);

将字符串转为int型。

atof:将……转成float型;atoi:字符串转成int型;atol:将……转成long型

./runaway 不带参数

./runaway 20

根据运行结果分析可知,当最后栈的分配到达最大值时,就会发生段错误,致使程序异常终止。因此,此程序可用来判断栈空间的大小。

思考练习以下命令:
 -d:将代码段反汇编
-S:将代码段反汇编的同时,将反汇编代码和源代码交替显示,编译时需要给出-g,即需要调试信息。
-l:反汇编代码中插入源代码的文件名和行号。
-j section:仅反汇编指定的section。可以有多个-j参数来选择多个section。

objdump -d a.out # 简单反汇编
 objdump -S a.out # 反汇编代码中混入对应的源代码
 objdump -j .text -l -S a.out # 打印源文件名和行号

runaway深度递归函数测试及相关汇编指令相关推荐

  1. Windows内核 基本汇编指令

    1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...

  2. powerpc汇编指令及相关寄存器学习

    寄存器 1.SRR0 / SRR1 / CSRR0 / CSRR1 /MCSRR0 / MCSRR1:保存的是异常之前的机器状态,恢复异常之前的状态.(S:SAVE R:RESTORE C:Criti ...

  3. 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...

    浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...

  4. 用机器指令和汇编指令编程(修改版)

    实验名称 用机器指令和汇编指令编程(1) 实验日期   2018.10.22 学院:计软院 专业:计算机科学与技术 年级:2017级 班次:5班 姓名:陈奕明 学号 20171308194 一.实验目 ...

  5. 【JVM】通过javap命令分析Java汇编指令

    文章目录 javap命令简述 javap测试及内容详解 例子1 例子2 总结 转载说明 javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应 ...

  6. S5PV210体系结构与接口02:ARM编程模型 汇编指令

    目录 1. ARM的基本设定 1.1 ARM数据类型 1.1.1 基本数据类型 1.1.2 浮点数据类型 1.1.3 存储器大小端 1.2 支持的指令集 2. Cortex-A8编程模型 2.1 处理 ...

  7. 逆向知识内存ARM常用的汇编指令合集

    ARM   处理器的指令集可以分为 跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令  六大指令,这里把其它几个指令一起发了出来,可以查看具体的目录 ...

  8. MIPS指令集处理器设计(支持64条汇编指令)

    一.题目背景和意义 二.国内外研究现状 (略) 三.MIPS指令集处理器设计与实现 (一).MIPS指令集功能性梳理 1.MIPS指令集架构 (1).mips基础指令集格式总结 MIPS是(Micro ...

  9. 机器码 与 汇编指令的关系

    ============================================================ 是转载,但是我转载的人,也没贴出原出处,没办法. 既然有人总结了,我们就学学. ...

最新文章

  1. 各大浏览器 CSS3 和 HTML5 兼容速查表
  2. 肠·道 | 邱琇:靓汤/烧香影响母婴健康?看巨大出生队列如何揭秘!
  3. 【积淀】半夜突然有点想法
  4. 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现
  5. 实例61:python
  6. python科学坐标图绘制的四个要素_Python3.0科学计算学习之绘图(四)
  7. AIX 常用命令汇总(二)
  8. 当个性化推荐遇上知识图谱.pdf(附下载链接)
  9. android实用测试方法之Monkey与MonkeyRunner
  10. ffmpeg ffplay ffprobe资料整理
  11. Gentoo Linux 内核指南
  12. android native c++ 打印调用栈
  13. Atitit 给投资人的回报 目录 1.1. 经济回报(略) 1 2. 精神文化与学术回报 1 2.1. 提升自我 投资人可以在我们的教育体系提升自我学术水平 1 2.2. 对自己感兴趣的学术领
  14. 中国地图和地方特点介绍
  15. ArcGIS软件应用(一)——专题图制作
  16. 联想笔记本电脑V110拆机、清灰详细步骤
  17. iOS调用第三方导航和线路规划
  18. 数据挖掘课程小结——1)数据预处理
  19. IEEE TRANSACTIONS ON INSTRUMENTATION AND MEASUREMENT(IEEE TIM)投稿过程
  20. Mac数据恢复首选easyrecovery

热门文章

  1. linux进程间通信:FIFO实现进程间的双向通信
  2. C++——简单数据类型及布尔类型
  3. 开源:ASP.NET MVC+EF6+Bootstrap开发框架
  4. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
  5. Java面试查漏补缺
  6. C#事件的发送方和接收方(订阅方)
  7. 4月《程序员》上我讲HTML5的文章---激动人心的HTML5之美
  8. 【C++】多线程与并发【一】
  9. MATLAB【六】 ———— matlab 随机散斑模拟
  10. SLAM闭合回环————视觉词典BOW小结