runaway深度递归函数测试及相关汇编指令
这是一个深度递归的例子。
#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型
![](/assets/blank.gif)
![](/assets/blank.gif)
根据运行结果分析可知,当最后栈的分配到达最大值时,就会发生段错误,致使程序异常终止。因此,此程序可用来判断栈空间的大小。
思考练习以下命令:
-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深度递归函数测试及相关汇编指令相关推荐
- Windows内核 基本汇编指令
1)用VS2010新建Win32 Console Application,工程名为ACECore,工程建立完成后得到打开文件ACECore.cpp,代码如下: #include "stdaf ...
- powerpc汇编指令及相关寄存器学习
寄存器 1.SRR0 / SRR1 / CSRR0 / CSRR1 /MCSRR0 / MCSRR1:保存的是异常之前的机器状态,恢复异常之前的状态.(S:SAVE R:RESTORE C:Criti ...
- 浅析VS2010反汇编 VS 反汇编方法及常用汇编指令介绍 VS2015使用技巧 调试-反汇编 查看C语言代码对应的汇编代码...
浅析VS2010反汇编 2015年07月25日 21:53:11 阅读数:4374 第一篇 1. 如何进行反汇编 在调试的环境下,我们可以很方便地通过反汇编窗口查看程序生成的反汇编信息.如下图所示. ...
- 用机器指令和汇编指令编程(修改版)
实验名称 用机器指令和汇编指令编程(1) 实验日期 2018.10.22 学院:计软院 专业:计算机科学与技术 年级:2017级 班次:5班 姓名:陈奕明 学号 20171308194 一.实验目 ...
- 【JVM】通过javap命令分析Java汇编指令
文章目录 javap命令简述 javap测试及内容详解 例子1 例子2 总结 转载说明 javap命令简述 javap是jdk自带的反解析工具.它的作用就是根据class字节码文件,反解析出当前类对应 ...
- S5PV210体系结构与接口02:ARM编程模型 汇编指令
目录 1. ARM的基本设定 1.1 ARM数据类型 1.1.1 基本数据类型 1.1.2 浮点数据类型 1.1.3 存储器大小端 1.2 支持的指令集 2. Cortex-A8编程模型 2.1 处理 ...
- 逆向知识内存ARM常用的汇编指令合集
ARM 处理器的指令集可以分为 跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令 六大指令,这里把其它几个指令一起发了出来,可以查看具体的目录 ...
- MIPS指令集处理器设计(支持64条汇编指令)
一.题目背景和意义 二.国内外研究现状 (略) 三.MIPS指令集处理器设计与实现 (一).MIPS指令集功能性梳理 1.MIPS指令集架构 (1).mips基础指令集格式总结 MIPS是(Micro ...
- 机器码 与 汇编指令的关系
============================================================ 是转载,但是我转载的人,也没贴出原出处,没办法. 既然有人总结了,我们就学学. ...
最新文章
- 各大浏览器 CSS3 和 HTML5 兼容速查表
- 肠·道 | 邱琇:靓汤/烧香影响母婴健康?看巨大出生队列如何揭秘!
- 【积淀】半夜突然有点想法
- 机器学习知识点(二十四)隐马尔可夫模型HMM维特比Viterbi算法Java实现
- 实例61:python
- python科学坐标图绘制的四个要素_Python3.0科学计算学习之绘图(四)
- AIX 常用命令汇总(二)
- 当个性化推荐遇上知识图谱.pdf(附下载链接)
- android实用测试方法之Monkey与MonkeyRunner
- ffmpeg ffplay ffprobe资料整理
- Gentoo Linux 内核指南
- android native c++ 打印调用栈
- Atitit 给投资人的回报 目录 1.1. 经济回报(略)	1 2. 精神文化与学术回报	1 2.1. 提升自我 投资人可以在我们的教育体系提升自我学术水平	1 2.2. 对自己感兴趣的学术领
- 中国地图和地方特点介绍
- ArcGIS软件应用(一)——专题图制作
- 联想笔记本电脑V110拆机、清灰详细步骤
- iOS调用第三方导航和线路规划
- 数据挖掘课程小结——1)数据预处理
- IEEE TRANSACTIONS ON INSTRUMENTATION AND MEASUREMENT(IEEE TIM)投稿过程
- Mac数据恢复首选easyrecovery