对变量的命名与符号常量的命名存在一些限制条件,名字是由字母和数字组成的序列,但其第一个字符必须是字母。下划线“_”被看作是字母,通常,变量名使用小写字母,符号常量名全部使用大写字母。
对于内部名而言,至少前31个字符是有效的。函数名和外部变量名包含的字符数目可能少于31,这是因为汇编程序和加载程序可能会使用这些外部名,而语言本身是无法控制加载程序和汇编程序。对于外部名,ANSI标准仅保证前6个字符的唯一性,并且不区分大小写。
任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对于数组而言,const限定符指定数组所有元素的值都不能被修改。
默认情况下,外部变量和静态变量都被初始化为0。未经显式初始化的自动化变量的值为未定义值(即无效值)。
[ Read More » ]
18 10 月, 2011 in
Software | tags:
C |
No Comments
在程序中使用“幻数”是个坏习惯,它几乎不能提供任何信息。要避免这个问题,就是使用#define指令把符号名定义为一个特定的字符串。这使我想起来了在《深入Java虚拟机》一书中看到的一段话:
例如每个class文件必须是以四个同样的字节开始:魔数0xCAFEBABE。这个魔数的用处是让class文件分析器很容易分辨出某个文件有明显问题而加以拒绝。1
上面的“幻数”与“魔数”应该都是英文术语magic number的翻译,我把它理解成一个有特定意义的数字,这个数字没有名字,没人知道它代表什么意思,因此阅读程序代码的人就可能糊涂。——当然,0xCAFEBABE不会有人去读它,我只是想到了magic number这个词而已。
[ Read More » ]
15 10 月, 2011 in
Software | tags:
C |
No Comments
中国语言文化很深奥,同样的话,不同人说,不同场合说,表达的意思就千差完毕。所以,要揣摩说话者的心思,就得把他的话放到具体的语境里,稍不留神就会弄出岔子。
通常,人们认为计算机没有二义性,一是一,二十二。实际上,在计算机中,所有的信息表示方式都是一致的,存在着同样一段表示形式对应的信息是不唯一的。
只有在指明了特定的解读方式以后,这些表现形式才能表示唯一的信息,我把它定义为计算机系统第一公理:
- 信息由一串位表示,只有在特定的上下文中,其才具有意义。
计算机系统是硬件和系统软件的结合体,硬件构成了物理存在,见上图。而系统软件更多指的是操作系统,其具备两个基本功能:
[ Read More » ]
27 9 月, 2011 in
Software | tags:
CSAPP |
2 Comments
《Professional Assembly Language》看完了第一、二部分,回顾这段时间的学习,收获似乎并没有想象中那么大,觉得掌握的还是皮毛。期间,搭配阅读《Computer System: A Programmer’s Perspective》、《The C Programming Language》,对计算机的理解和对程序的掌控能力只是有提升,而谈不上跃升。我想,最主要的原因还是缺少动手去写代码。
插入排序常常是书本当中用来引导读者进入算法领域的hello, world
,这次我尝试用汇编代码来实现它。在这之前,首先把C语言实现版本张贴如下,以便参考:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| void insertion_sort(int array[], int length)
{
int j;
for (j = 1; j < length; j++)
{
int i = j - 1;
int key = *(array + j);
while (i >= 0 && *(array + i) > key)
{
*(array + i + 1) = *(array + i);
i--;
}
*(array + i + 1) = key;
}
} |
void insertion_sort(int array[], int length)
{
int j;
for (j = 1; j < length; j++)
{
int i = j - 1;
int key = *(array + j);
while (i >= 0 && *(array + i) > key)
{
*(array + i + 1) = *(array + i);
i--;
}
*(array + i + 1) = key;
}
}
[ Read More » ]
22 9 月, 2011 in
Software | tags:
assembly,
GAS |
No Comments
本书的第十一章是讲解函数的使用,特别是C风格的函数调用,也就是栈(Stack)在函数调用中的用场。在章节的末尾,讲到了命令行参数,其中涵盖了Linux是如何安排程序的内存空间的。
正如文中所言,每个程序可使用的内存空间起止地址均相同,–当然,这只是Linux玩弄的一个小把戏:虚拟地址空间。
The virtual memory address assigned to the program running in Linux starts at address 0x8048000 and end at address 0xbffffff.
上面这段话,把起止地址说明白了,如图1所示,大致分为两块,低位的块是保存代码和数据,高位的块是程序栈,ESP寄存器保存栈顶地址。
[ Read More » ]