摘要: ARM的常数表达式 如果说Intel指令中的立即数,相信大家都很熟悉。类似的,Arm指令中的“立即数”就是常数表达式。之所以称为常数表达式,而不称为立即数是有原因的。 Intel指令属于CISC指令集,指令是不定长的,因此可以将任意32位立即数编码到指令内。 Arm指令属于RISC指令集,指令是定长的32字节。众所周知,指令中操作码是必须的字段,如果把32位立即数直接编码到指令内部,操作码就无“容身之地”了…… 因此,Arm指令中“立即数”的位数必小于32位。那么如何在Arm指令中正常表示立即数呢?我们看看Arm的通用指令格式。 Arm指令中,操作码(opcode)、... 阅读全文
posted @ 2014-03-03 20:18 Florian 阅读(3898) 评论(0) 推荐(0) 编辑
摘要: 扫描器的高效实现 编译器进行词法分析时,不可避免地需要对源文件进行扫描,实现该功能的模块称为扫描器。扫描器读取源文件,按序返回文件内的字符,直到文件结束。 扫描器的功能 实现文件的读一般使用库函数fscanf或者fread,那么按照怎样的读取方式才能让扫描器的性能更佳呢? (1)使用fscanf逐字扫描,并返回。 char scan(FILE*file){ char ch; if(fscanf(file,"%c",&ch)==EOF){ ch=-1; } return ch; } 这是最简单的实现方式,缺点是每次读取字符时都需要访问文件进行I... 阅读全文
posted @ 2014-03-02 22:45 Florian 阅读(1727) 评论(0) 推荐(0) 编辑
摘要: printf背后的故事 说起编程语言,C语言大家再熟悉不过。说起最简单的代码,Helloworld更是众所周知。一条简单的printf语句便可以完成这个简单的功能,可是printf背后到底做了什么事情呢?可能很多人不曾在意,也或许你比我还要好奇!那我们就聊聊printf背后的故事。 一、printf的代码在哪里? 显然,Helloworld的源代码需要经过编译器编译,操作系统的加载才能正确执行。而编译器包含预编译、编译、汇编和链接四个步骤。 #include int main() { printf("Hello World !\n"); return 0; } ... 阅读全文
posted @ 2014-01-14 21:54 Florian 阅读(20406) 评论(10) 推荐(12) 编辑
摘要: 那些年·我们读过的专业书籍《西江月·深夜阅书释疑》久坐毫无思绪Bug重现眼前反向跟踪千百遍胸中一片茫然几欲拂袖而去专业书间流连细翻案卷三两篇脑海灵光乍现有的书带着我们走进一个全新的世界,有的书解答了我们心中久蓄的疑惑,有的书让我们眼前一亮兴奋不已,有的书令我们回味无穷终生难忘。作为计算机专业的人,相信大家一定看过不少经典的专业书籍。这里我们列举一下,那些年,我们读过的专业书籍。(*部分书籍我还没有读过,就不盲目做评论了,以免误导大家)1. C++《C++ Primer》:C++经典,入门必读,几乎涵盖C++所有特性。《Tinking in C++》:经典同C++ Prime 阅读全文
posted @ 2013-12-21 16:51 Florian 阅读(7013) 评论(23) 推荐(13) 编辑
摘要: 计算机学科漫谈 在这篇博文里,我想和大家聊一聊自己对计算机学科的理解。当下本科阶段的计算机专业教学涉及计算机学科的方方面面,分类繁杂,有时可能令新人茫然不知所措。那么,对计算机专业的学者来说,什么是最重要的呢?我相信,一千个读者,一千个哈姆雷特,同样的,每个计算机的学习者都有自己对专业的一番认识。如果说本科四年的计算机专业课程是对专业知识的横向积累,那么把握计算机专业的本质的内容则需要纵向的思考。因此我个人的观点是:对计算机系统整体概念的理解在计算机专业学习中尤其关键。于是我把自己对专业的理解和认识总结出来,希望对想了解这方面的读者有所帮助,当然也欢迎大家提出自己的观点和建议。 说起计... 阅读全文
posted @ 2013-12-21 09:41 Florian 阅读(5095) 评论(7) 推荐(11) 编辑
摘要: 命令行下的树形打印最近在处理代码分析问题时,需要将代码的作用域按照树形结构输出。问题的原型大概是下边这个样子的。图中给了一个简化的代码片段,该代码片段包含5个作用域:全局作用域0、函数fun作用域1、if语句作用域2、else语句作用域3和函数main作用域4。代码作用域有个显著的特点就是具有树形结构,全局作用域作为树根,函数作用域则是其子节点,而局部作用域则是函数作用域的子节点,以此类推。如果要在命令行下输出作用域的组织结构,则是目录树的形式。将树进行命令行打印并非一件难事,使用的是树的递归深度遍历的思想。代码片段如下:/*树形打印作用域root:子树根blk:缩进次数*/voidprint 阅读全文
posted @ 2013-12-15 22:31 Florian 阅读(8153) 评论(2) 推荐(0) 编辑
摘要: 给《思维导图大脑使用说明书》配图作者:孙小小原文地址:http://xiaoxiaosun1978.blog.sohu.com/62130566.html最近在学习《思维导图大脑使用说明书》,有人觉得这本书太单薄了,我反而觉得这样的页数和内容正合适,可以很快读完,然后可以再次详细阅读和写笔记,继而尝试锻炼自己画图。如果是按照读小说的感觉读这样的书,显然不对头。整体来说,这本10元钱的书物超所值,内容精练,通俗易懂。是Mindmap很好的入门书。我个人觉得,既然Mindmap是这个可爱的老头Tony Buzan提出来的,那么最好是直接看他的书。其他人的诠释可以放在以后作为借鉴。如果说我可以提出一 阅读全文
posted @ 2013-10-18 16:46 Florian 阅读(1397) 评论(0) 推荐(0) 编辑
摘要: 毕业面试心程2013年9月,伴随着秋季招聘号角的吹响,作为准应届毕业生的我踏上了从青岛到西安的校园招聘的征程。虽然心中踌躇满志,但是对于未来的结果却充满着不确定和未知。到我写下这篇文字,在西安这个城市已经驻留了近20天。期间参加过大型公司的宣讲,进行过数次笔试,尝试过霸笔,经历过数次面试,其中有困难和挫折,有惊喜和喜悦,有失望与落寞,有淡定与坦然,个中滋味,或许只有亲身经历过这些方能体会得到。之所以写下这些文字,除了分享自己的心路历程,也希望借助于此在这个繁忙的工作季给大家分享一下自己的面试经验。我深知自己的文采登不上大雅之堂,那么我就结合着自己的面试过程和大家简单地聊一聊这段时间面过的几家公 阅读全文
posted @ 2013-09-30 16:31 Florian 阅读(2638) 评论(13) 推荐(1) 编辑
摘要: hash_map的简洁实现hash_map是经常被使用的一种数据结构,而其实现方式也是多种多样。如果要求我们使用尽可能简单的方式实现hash_map,具体该如何做呢?我们知道hash_map最重要两个概念是hash函数和冲突解决算法。hash_map键-值之间的映射关系,hash函数将键映射为内存地址,冲突解决算法用于解决不同的键映射为相同地址时候的情况。数据结构和算法导论中介绍了大量的hash函数和冲突解决算法,如果选择实现精简的hash_map,那么可以选择“除留取余法”作为hash函数,选择“开散列地址链”作为冲入解决算法。这样的选择不仅使得hash_map实现简单,而且有很高的查询效率 阅读全文
posted @ 2013-09-12 18:12 Florian 阅读(15276) 评论(3) 推荐(3) 编辑
摘要: 缓冲区溢出攻击缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的加强,传统的缓冲区溢出攻击方式可能变得不再奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即便如此,完成一个简单的溢出代码也需要解决很多书中无法涉及的问题,尤其是面对较新的具有安全特性的编译器——比如MS的Visual Studio2010。接下来,我们结合具体代码,按照对缓冲区溢出原理的循序渐进地理解方式去挖掘 阅读全文
posted @ 2013-08-10 18:54 Florian 阅读(70787) 评论(11) 推荐(17) 编辑