当前浏览

海思笔记2013六月

分类目录

展开|收起

看你喜欢

(1) (1) (42) (1) (1) (1) (16) (2) (1) (1) (4) (1) (2) (7) (4) (1) (1) (1) (1) (3) (1) (5) (1) (1) (1) (1) (1) (2) (1) (4) (4) (3) (1) (1) (2) (1) (37) (2) (1) (5) (3) (1) (4) (1) (1) (11) (3) (1) (9) (3) (1) (23) (2) (1) (2) (1) (1) (1) (1)

最新精华

第 1 页,共 3 页123

函数调用汇编分析【2】- 函数调用规范(2)

2.2 C和Pascal调用规范

有了前面栈帧的基本概念,再来讨论x86的函数调用规范就很好理解了,基本上有两种调用规范:C和Pascal调用规范。二者的栈帧概念是一样的,区别在于参数入栈的次序和函数调用时栈指针的调整方式,下面分别作下比较。

(1) Pascal调用规范

函数参数从左到右依次入栈

假设调用函数func(A,B,C),那么caller中汇编代码如下:

函数返回时,栈指针的调整由callee来实现。解释如下:

比如前面caller调用已经push 3个参数入栈,函数调用完了,实际这3个参数就没有用了,就需要把栈指针(即esp的值)加上12(假设每个参数占4字节),这里的意思就是这个加12的操作由callee来实现。 具体的实现是采用汇编指令ret x,即ret后面带一个数值,这里就应该是12。这样不仅能函数返回,还能调整栈指针。

注:如果不进行栈指针调整,显然经过多次函数调用后就会产生栈溢出,肯定就会触发系统异常。

(2) C调用规范…

【阅读全文】

《Java编程思想》作者:C++不垃圾,只是Java很傲慢

本文转载自:51CTO

《Thinking in C++》及《Thinking in Java》的作者Bruce Eckel向来是个“拥C++反Java”派,他曾经不止一次的提到,C++语言特性的添加有多么的深思熟虑,而Java又是如何的把一些奇怪的东西不停的加进去。Bruce认为,理解语言特性为什么会存在是非常有帮助的。他将其称之为“语言考古学”。

在C++委员会会议上我所能找到的,是C++社区里最聪明的一群人,群英荟萃,为我答疑解惑。我很快意识到,这种方式之好,远超我在任何一门研究生课程中之所得。如果考虑到研究生的机会成本,这还是一笔在财务上要划算得多的生意。【51CTO外电精选】本文节选自《Thinking in C++》及《Thinking in Java》作者Bruce Eckel的博文,文章写在一次C++规范委员会例常会议之后,Bruce受C++设计师(常被称为C++之父)Bjarne Stroustrup邀请而参与了这次会议,并写下了参会感想如下(节选):…

【阅读全文】

应该记住哪些vi/vim常用命令?

编码用得多的还是Windows下的编辑器,如各种IDE,或者Source Insight,UE之类的,实际工作中即使编写Linux下的程序,也可以选择SAMBA共享的方式来在Windows下来编码。通常觉得,能完全用Linux下的编辑器(如Vim/Emacs)来工作的,那就不是一般人,既然对Linux如此痴迷,那水平肯定也不会太差。但Linux的用法的确会困扰很多人,就连《Thinking In Java》的作者Bruce Eckel也承认Cygwin给他带来了很多便利,同时感叹说如果十几年前当他被Gnu Emacs搞得头脑发晕的时候有这些Windows工具就好了。当然,他肯定对Emacs也已很熟练了,绝非初学者的那种晕。…

【阅读全文】

从一个疯狂下载者变成学习者

本文转载自:弯曲评论

(编者按——这篇文字最早见于数年前的某英语论坛,原始出处已不可考。尽管内容偏重英语学习,但文中指出的很多学习者存在的问题,以及对学习方法的体悟,却是具有普适性并值得借鉴的。

古人云:“临渊羡鱼,不如退而结网”,这样的现象屡见不鲜:满满的硬盘,没有几份资料是真正认真读过;看到好的资料,总是想先存起来,下载后慢慢看。但到了真正想看的时候,不是没有时间,就是收集的资料太多,不知从何看起。号称碎片化阅读之王的微博,也有“收藏”功能,然而,收藏下来的资料和文档,真正能够再次认真阅读的,却寥寥无几。 资料需要下载和阅读,但最重要的还是思考,消化与交流。希望弯曲评论一直以来所倡导的“深度阅读”的理念,能为您的学习与工作带来启发与帮助。)

先从我自己说起,我没来到网络学英语前也是个英语学习的积极梦想者,因为我知道说一口流利的英语会带给自己多少好处,就这样一头扎进了网络。刚来到英语类网站时,简直是进入了天堂,看到很多人都可以用英文发帖子,帖子里很多精品资料,于是乎开始疯狂下载收集资料,把过去买盗版英语资料的习惯抛弃了,一张张的刻盘,当手里拿着上百张英语资料盘时那种满足感,好像自己已经掌握了英语,就这样不断下载,半年多过去了。有一天猛一回头,发现自己除了沉颠颠的盘包,满满的硬盘,对英语我还是一无所有。可以不客气的说,包括自己在内大多数上网学习英语的人还都是幻想者,很多人都是英语很差,但都梦想着能攻克英语。于是一个怪圈出现了,这也频繁发生在现实生活中。开始寻找捷径,开始研究李阳好,还是新东方好,还是钟道隆好。每样都学几天,然后觉得不好,不好的理由就是见效慢,然后再寻找。于是下载就给了这样的人想象空间,今天看到站长斑竹发个帖子说这个软件好,也看到很多人说好,那就赶快下载下来,正下载中间,又看到另一个帖子,人气十足,那一会也要下载,不好的东西人气能高么?…

【阅读全文】

神舟十号-太空授课

【全程】神舟十号,地面课堂+太空授课

【阅读全文】

函数调用汇编分析【2】- 函数调用规范(1)

接着上一篇文章继续分析。

2.1 相关知识介绍

对于编译连接好的程序,其镜像一般是被加载到内存中来执行,如下图所示:

注:

(1)BSS是Block Started by Symbol Segment的简称,这个段用来存放没有初始化过的全局或static变量,一般操作系统会在加载程序时把这个段清0,所以有时也叫0初始化区(ZI)。需要说明的是这个段并不在编译出来的版本文件中占用空间,而只是在执行时才会存在这个段,用来放相应的变量内容。编译器在链接时会提供相应的宏来表示这个段的起始和长度,这样在代码中就可以利用这些宏来做清0操作。所以,对一个全局的数组,如果在定义时不进行初始化,而是在进程上电时才初始化,就可以减小版本文件的大小。

(2)从上图可见,堆和栈其实不是一个东西,平时我们常说的“堆栈”,其实指的是栈。

(3)本文关注的是栈区,因为对于x86体系,函数的入参和函数内部的非static类型的局部变量都要放在栈中,函数返回值长度如果超过8字节也要放到栈中;如果返回值为4字节,则通过EAX寄存器返回;如果为8字节,则通过EDX和EAX这两个寄存器返回,其中EDX存放高4字节。 …

【阅读全文】

第 1 页,共 3 页123