01 2017 档案
摘要:在C语言编程中,我们几乎不可能看见有人将一个结构体变量作为参数进行传递,因为效率太低了。本文尝试从反汇编的角度给出其中的缘由。 对于C语言来说,所有的参数传递都是值传递。如果一个变量为指针,那么传递的就是指针变量的值(即某个内存地址)。 那么,如果一个参数是结构体变量(包括多个成员),怎么从call
阅读全文
摘要:在C语言中,如果我们要访问一个数组的某个下标对应的元素,通常的写法是a[i]。但从汇编的角度看,写成i[a]一点问题都没有。 下面通过代码给出证明。 o foo1.c o foo2.c o foo3.c o 编译和运行 o 反汇编后diff 1) foo1.gdb.out 2) foo2.gdb.o
阅读全文
摘要:如果我们定义一个有符号整数 int a = 0x80000000; 然后执行 a = a >> 1; 那么a将变为0xc0000000; 我们再定义一个无符号整数 unsigned int b = 0x80000000; 然后执行 b = b >> 1; 那么b则将变为0x40000000; 为什么
阅读全文
摘要:本文给出一个很小的例子,通过反汇编后观察认为,C++的引用本质上等同于C的指针。 o foo1.cpp v.s. foo2.cpp o 对foo1.cpp 和foo2.cpp进行编译 o 对foo1和foo2分别进行反汇编,然后保存到不同的文件,用meld进行diff 由此可见,使用C++的引用(i
阅读全文
摘要:A program is an executable file store. A process is a running program. A thread is a single sequence stream within a process.
阅读全文
摘要:理解系统调用的关键在于洞悉系统调用号是联系用户模式与内核模式的纽带。而在Solaris x64平台上,系统调用号被保存在寄存器RAX中,从用户模式传递到内核模式。一旦进入内核模式,内核的sys_syscall入口程序就根据保存在RAX中的系统调用号,从内核维护的系统调用表(sysent)中查询出对应
阅读全文
摘要:一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点。 PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害。知耻而后勇,于是我回家花了两个半小时(在不参考任何书本和网路上的源码的前提下),从构建BST开始,到实现中序
阅读全文
摘要:在Solaris上写内核模块总是会用到互斥锁(mutex)与条件变量(condvar), 光阴荏苒日月如梭弹指一挥间,Solaris的大船说沉就要沉了,此刻心情不是太好(Orz)。每次被年轻的有才华的同事们(比如Letty同学)问起mutex和cv怎么协同工作的,我总是不能给出一个非常清晰的解释。直
阅读全文
摘要:本文通过模拟汇编里的stack机制,构建一个自己的stack,然后将上一篇blog末尾的递归函数void bst_walk(bst_node_t *root)非递归化。 o libstack.h o libstack.c 1. 一旦栈被初始化后,栈指针sp一定是指向栈底,*sp不可访问(尤其是写操作
阅读全文
摘要:在C语言编程中,使用递归函数实现一个特定的功能,好处是代码简洁,坏处是可读性可能不是很好(甚至可读性很差)。另外,栈的长度是有限的,如果使用递归,很明显地加重了栈的负担。 例如: (下面的函数实现了一个非常简单的功能: 判定输入的整数是否是2的N次方,N=0,1,2...) 代码实现确实简洁,可读性
阅读全文
摘要:下面是我很久以前在读APUE(《Unix环境高级编程》)对孤儿进程和僵尸进程的理解,为了便于记忆,采用打比方的方式予以解释。 (当然不一定精准,后面我会贴出wikipedia上的专业解释。) 附: 维基百科对对孤儿进程和僵尸进程的解释1. Orphan processIn a Unix-like o
阅读全文
摘要:当我们说起某个人很nice的时候,通常指的是那个人心地善良,很好说话,很容易相处。(相反,aggressive的人很可能是不nice的,因为老想抢夺别人的东西,尤其是在资源有限的情况下,恨不得一个蛋糕吃掉90%以上。所以我们要远离那些为了自己的利益而不顾一切的人。) 言归正传,还是先看看"nice"
阅读全文
摘要:也不知道从何时起,也不知道是哪个"教授"还是"老师",将stack翻译成堆栈(据说台湾叫做"堆叠")。窃以为,这种翻译实在是误人子弟(题外话:the Milky Way曾经被误译为"牛奶路"),因为堆(heap)是堆, 栈(stack)是栈。只有堆(Heap)和栈(Stack),没有"堆栈"。 每次
阅读全文
摘要:对于刚学习Unix/Linux环境C编程的小朋友们或者写了很多所谓的C代码的老手们(其实很可能是机械程序员或者是伪程序员)来说,要记住gdb的eXaming memory的语法其实是相当不容易的,如果学习了gdb的这一语法后不再反复操练,很快就会忘记得干干净净。 先看看gnu/docs/gdb上怎么
阅读全文
摘要:在C语言中,教科书告诉我们switch...case...语句比if...else if...else执行效率要高,但这到底是为什么呢?本文尝试从汇编的角度予以分析并揭晓其中的奥秘。 第一步,写一个demo程序:foo.c 第二步,在Ubuntu上使用gcc编译 第三步,使用gdb对二进制文件foo
阅读全文
posted @ 2017-01-11 22:39
veli

浙公网安备 33010602011771号