代码改变世界

使用vbs脚本进行批量编码转换

2014-06-11 15:52 by Florian, 304 阅读, 收藏, 编辑
摘要: 使用vbs脚本进行批量编码转换 最近需要使用SourceInsight查看分析在Linux系统下开发的项目代码,我们知道Linux系统中文本文件默认编码格式是UTF-8,而Windows中文系统中的默认编码格式是Gb2312。系统内的编码格式有所区别倒无伤大雅,关键的是SourceInsigh...阅读全文

Linux模块机制浅析

2014-05-15 21:47 by Florian, 532 阅读, 收藏, 编辑
摘要: Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的。一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析。 模块的Hello World! 我们通过创建一个简单的模块进行测试。首先是源文件main.c和Makefile。 f...阅读全文

源文件移动后gdb不显示代码的原因

2014-05-15 14:44 by Florian, 521 阅读, 收藏, 编辑
摘要: 源文件移动后gdb不显示代码的原因 问题 我们从一个最简单的C语言程序开始。源文件main.c在用户目录gdb文件夹下。 florian@florian-pc:~/gdb$ cat main.c int main() { return 0; }; 然后将源文件编译为...阅读全文

Linux的原子操作与同步机制

2014-04-09 18:45 by Florian, 747 阅读, 收藏, 编辑
摘要: Linux的原子操作与同步机制 并发问题 现代操作系统支持多任务的并发,并发在提高计算资源利用率的同时也带来了资源竞争的问题。例如C语言语句“count++;”在未经编译器优化时生成的汇编代码为。 当操作系统内存在多个进程同时执行这段代码时,就可能带来并发问题。 假设count变量初始值为0。进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0。此时,进程2被调度执行,抢占了进程1的CPU的控制权。进程2执行“count++;”的汇编代码,将累加后的count值1写回到内存。然后,进程1再次被调度执行,CPU控制权回到进程1。进程1接着执行,...阅读全文

ARM的常数表达式

2014-03-03 20:18 by Florian, 414 阅读, 收藏, 编辑
摘要: ARM的常数表达式 如果说Intel指令中的立即数,相信大家都很熟悉。类似的,Arm指令中的“立即数”就是常数表达式。之所以称为常数表达式,而不称为立即数是有原因的。 Intel指令属于CISC指令集,指令是不定长的,因此可以将任意32位立即数编码到指令内。 Arm指令属于RISC指令集,指令是定长的32字节。众所周知,指令中操作码是必须的字段,如果把32位立即数直接编码到指令内部,操作码就无“容身之地”了…… 因此,Arm指令中“立即数”的位数必小于32位。那么如何在Arm指令中正常表示立即数呢?我们看看Arm的通用指令格式。 Arm指令中,操作码(opcode)、...阅读全文

扫描器的高效实现

2014-03-02 22:45 by Florian, 749 阅读, 收藏, 编辑
摘要: 扫描器的高效实现 编译器进行词法分析时,不可避免地需要对源文件进行扫描,实现该功能的模块称为扫描器。扫描器读取源文件,按序返回文件内的字符,直到文件结束。 扫描器的功能 实现文件的读一般使用库函数fscanf或者fread,那么按照怎样的读取方式才能让扫描器的性能更佳呢? (1)使用fscanf逐字扫描,并返回。 char scan(FILE*file){ char ch; if(fscanf(file,"%c",&ch)==EOF){ ch=-1; } return ch; } 这是最简单的实现方式,缺点是每次读取字符时都需要访问文件进行I...阅读全文

printf背后的故事

2014-01-14 21:54 by Florian, 1483 阅读, 收藏, 编辑
摘要: printf背后的故事 说起编程语言,C语言大家再熟悉不过。说起最简单的代码,Helloworld更是众所周知。一条简单的printf语句便可以完成这个简单的功能,可是printf背后到底做了什么事情呢?可能很多人不曾在意,也或许你比我还要好奇!那我们就聊聊printf背后的故事。 一、printf的代码在哪里? 显然,Helloworld的源代码需要经过编译器编译,操作系统的加载才能正确执行。而编译器包含预编译、编译、汇编和链接四个步骤。 #include int main() { printf("Hello World !\n"); return 0; } ...阅读全文

那些年•我们读过的专业书籍

2013-12-21 16:51 by Florian, 3375 阅读, 收藏, 编辑
摘要: 那些年·我们读过的专业书籍《西江月·深夜阅书释疑》久坐毫无思绪Bug重现眼前反向跟踪千百遍胸中一片茫然几欲拂袖而去专业书间流连细翻案卷三两篇脑海灵光乍现有的书带着我们走进一个全新的世界,有的书解答了我们心中久蓄的疑惑,有的书让我们眼前一亮兴奋不已,有的书令我们回味无穷终生难忘。作为计算机专业的人,相信大家一定看过不少经典的专业书籍。这里我们列举一下,那些年,我们读过的专业书籍。(*部分书籍我还没有读过,就不盲目做评论了,以免误导大家)1. C++《C++ Primer》:C++经典,入门必读,几乎涵盖C++所有特性。《Tinking in C++》:经典同C++ Prime阅读全文

计算机学科漫谈

2013-12-21 09:41 by Florian, 773 阅读, 收藏, 编辑
摘要: 计算机学科漫谈 在这篇博文里,我想和大家聊一聊自己对计算机学科的理解。当下本科阶段的计算机专业教学涉及计算机学科的方方面面,分类繁杂,有时可能令新人茫然不知所措。那么,对计算机专业的学者来说,什么是最重要的呢?我相信,一千个读者,一千个哈姆雷特,同样的,每个计算机的学习者都有自己对专业的一番认识。如果说本科四年的计算机专业课程是对专业知识的横向积累,那么把握计算机专业的本质的内容则需要纵向的思考。因此我个人的观点是:对计算机系统整体概念的理解在计算机专业学习中尤其关键。于是我把自己对专业的理解和认识总结出来,希望对想了解这方面的读者有所帮助,当然也欢迎大家提出自己的观点和建议。 说起计...阅读全文

命令行下的树形打印

2013-12-15 22:31 by Florian, 829 阅读, 收藏, 编辑
摘要: 命令行下的树形打印最近在处理代码分析问题时,需要将代码的作用域按照树形结构输出。问题的原型大概是下边这个样子的。图中给了一个简化的代码片段,该代码片段包含5个作用域:全局作用域0、函数fun作用域1、if语句作用域2、else语句作用域3和函数main作用域4。代码作用域有个显著的特点就是具有树形结构,全局作用域作为树根,函数作用域则是其子节点,而局部作用域则是函数作用域的子节点,以此类推。如果要在命令行下输出作用域的组织结构,则是目录树的形式。将树进行命令行打印并非一件难事,使用的是树的递归深度遍历的思想。代码片段如下:/*树形打印作用域root:子树根blk:缩进次数*/voidprint阅读全文