深入理解计算机系统——第三章小结(2)

继续上次的话题讲一下程序流控制汇编。

C和汇编代码中的语句,默认的方式是顺序的控制流,按照语句或者指令在程序中出现的顺序方式进行。
而某些程序结构,如Switch语句,循环语句和分支语句,则不尽然。

首先介绍CPU中一组单个位的条件码(condition code)寄存器,它们描述了最近的算术或者逻辑操作属性。

一般涉及的条件码:
 CF: 进位标志
 ZF: 零标志
 SF: 符号标志
 OF: 溢出标志

对于cmpb, cmpw, cmpl  (S2, S1),  指令根据S1-S2的差来设置条件码。
 而testb, testw, testl (S2, S1), 指令根据 S1 AND S2来设置条件码。

至于跳转指令,如jmp, jbe, js 等
这里不介绍具体细节,可以自行阅读汇编或者接口相应表格部分。

下面我们就可以来说一些GAS有意思的地方。

下面jbe指令的目标地址是?

8048D1C:  76 DA  jbe xxxxxxx
8048D1E:  EB 24  jmp 8048d44

解读上面的小题需要理解: 
当执行与PC相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址。
另外,对于存放在2内存中的2进制指令,"76 DA" 来说,后面的0xDA就是我们常常说的偏移量。

于此一来,我们可以计算出 xxxxxxx = 0x8048D1E + 0x00000DA = 0x8048DF8

此外还有一些Tips:
1. 编译器对代码的优化,常常会自己设置新参数,而修改条件判别式,来减少参数和2进制指令个数
2. 对于阅读控制流的汇编码,尽量先转换成while型,而后转换成goto型,事实上,编译器大多时候都是这样设计的。
3. while() {} 语句常常在机器码级被转换成一条判断和 do {} while () 的方式,所以养成习惯写后者(…真的需要这样吗?)

发表在 C, 系统, 编程 | 标签为 , | 留下评论

密码保护:读书计划

这是一篇受密码保护的文章,您需要提供访问密码:

发表在 未分类 | 标签为 , | 要查看留言请输入您的密码。

[zz]GCC入门详解

一下子想不起GCC查看执行文件的汇编码方法,晚上回去翻翻CS:APP

作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。另一方面,说到 GCC 对于操作系统平台及硬件平台支持,概括起来就是一句话:无所不在。

1 程序编译过程


  GCC是CUI(命令行交互界面)程序,这让许多从Windows走出来 Guier们感到恐惧。实际上它也有许多前端窗口界面,Windows下有Dev C++,Linux下譬如KDevelopment,但既然选择了GCC还是将CUL进行到底吧,没有难与不难的问题,只有做与不做的问题!

  下面基于一个具体而微的程序,讨论GCC的使用。示例程序如下:

//test.c
#include <stdio.h>
int main(void)
{
  printf(“Hello World!\n”);
  return 0;
}

  这个程序,一步到位的编译指令是:

gcc test.c -o test

  输出的可执行文件名为test,Windows用户可能会感到奇怪,可执行文件明怎么没有.exe扩展名呢?Linux系统中,文件类型并非以扩展名识别的!

  实质上,上述编译过程是分为四个阶段进行的,即预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编 (Assembly)和连接(Linking)。

1.1 预处理

  运行预处理命令:

gcc -E test.c -o test.i  gcc -E test.c

可以输出test.i文件中存放着test.c经预处理之后的代码。打开test.i文件,看一看,就明白了。后面那条指令,是直接在命令行窗口中输出预处理后的代码,而不是以文件作为输出设备。gcc的-E选项,可以让编译器在预处理后停止,并输出预处理结果。在本例中,预处理结果就是将stdio.h 文件中的内容插入到test.c中了。

  gcc的-o选项,用于输出处理结果到文件中。

1.2 编译为汇编代码

  预处理之后,可直接对生成的test.i文件编译,生成汇编代码:

gcc -S test.i -o test.s

  gcc的-S选项,表示在程序编译期间,在生成汇编代码后,停止,-o输出汇编代码文件。

  生成的汇编代码如下:
继续阅读

发表在 C, 编程, 网摘 | 标签为 | 留下评论

菜根谭 [明] 洪应明

余过古刹,于残经败纸中拾得《菜根谭》一录。翻视之,虽属禅宗,然于身心性命之学,实有隐隐相发明者。亟携归,重加校雠,缮写成帙。 旧有序,文不雅驯,且于是书无关涉语,故芟之。 著是书者为洪应明,究不知其为何许人也。
乾隆五十九年二月二日,遂初堂主人识

欲做精金美玉的人品,定从烈火中煅来;思立掀天揭地的事功,须向薄冰上履过

一念错,便觉百行皆非,防之当如渡海浮囊,勿容一针之罅漏;万善全,始得一生无愧。修之当如凌云宝树,须假众木以撑持。

忙处事为,常向闲中先检点,过举自稀。动时念想,预从静里密操持,非心自息。

为善而欲自高胜人,施恩而欲要名结好,修业而欲惊世骇俗,植节而欲标异 见奇,此皆是善念中戈矛,理路上荆棘,最易夹带,最难拔除者也。须是涤尽渣滓,斩绝萌芽,才见本来真体。

能轻富贵,不能轻一轻富贵之心;能重名义,又复重一重名义之念。是事境之尘氛未扫,而心境之芥蒂未忘。此处拔除不净,恐石去而草复生矣。

纷扰固溺志之场,而枯寂亦槁心之地。故学者当栖心元默,以宁吾真体。亦当适志恬愉,以养吾圆机。

昨日之非不可留,留之则根烬复萌,而尘情终累乎理趣;今日之是不可执,执之则渣滓未化,而理趣反转为欲根。

无事便思有闲杂念想否。有事便思有粗浮意气否。得意便思有骄矜辞色否。

失意便思有怨望情怀否。时时检点,到得从多入少、从有入无处,才是学问的真消息。

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。

身不宜忙,而忙于闲暇之时,亦可儆惕惰气;心不可放,而放于收摄之后,亦可鼓畅天机。

钟鼓体虚,为声闻而招击撞;麋鹿性逸,因豢养而受羁糜。可见名为招祸之本,欲乃散志之媒。学者不可不力为扫除也。

继续阅读

发表在 网摘 | 标签为 | 留下评论

HTML5 简单小画笔

小小的写了一下,HTML5的新特性还是很容易上手。
和博客的兼容性问题没有调整,所以单独放在外面

小例子猛击这里

发表在 编程, 网络 | 标签为 , | 留下评论

Ubuntu 10.04 下修改终端(ttyx)分辨率方法

部分内容来源网络,作者整理实践总结,转载保留。

 解决方向: 
            A 安装驱动后开机和关机画面花屏,分辨率低
            B tty终端花屏
            C 网上找的总总方法错误后无法还原

重新选择显卡驱动,使用(Recommended)(推荐)的显卡。

安装所需包 :
sudo apt-get install v86d hwinfo

查看framebuffer :
sudo hwinfo --framebuffer

我的显示器分辨率是1280x800的所以我需要的是:1280x800-24 
记录下对应的vga=0x0361

修改grub文件 :
sudo gedit /etc/default/grub

-------修改GRUB_CMDLINE_LINUX_DEFAULT
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset 
video=uvesafb:mode_option=1280x800-24,mtrr=3,scroll=ywrap"

-------修改GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX="vga=0x0361"

-------修改#GRUB_GFXMODE栏
GRUB_GFXMODE=1280x800-24

修改initramfs:
sudo gedit /etc/initramfs-tools/modules
-----
最后一行写入
uvesafb mode_option=1280x800-24 mtrr=3 scroll=ywrap
-----

强制使用Framebuffer:
echo FRAMEBUFFER=y | sudo tee /etc/initramfs-tools/conf.d/splash

更新grub和initramfs:
sudo update-grub2
sudo update-initramfs -u

重启。


参考链接:
http://www.linuxidc.com/Linux/2010-06/26422.htm
http://qiuye.javaeye.com/blog/452193
http://forum.ubuntu.org.cn/viewtopic.php?t=236344

发表在 Linux, 系统 | 标签为 | 留下评论

关于基础数据类型的最后讨论

@Unix网络编程


数据类型   ILP32模型   LP64模型
char        8           8
short       16          16
int         32          32
long        32          64
pointer     32          64

32位Unix一般为ILP32模型

64位Unix最流行LP64模型

64位最关键的部分在于我们不再能把指针存放到一个整数中。

现在我们最关心的是:

ANSI C创造了size_t类型,他在32位下是32位值,而在64位下必须是64位值,
然而在网络API与XTI结构中的问题是,当系统平台从32位转变到64位时,他们不需要64位数据类型。

为了处理这种方法,套接口API使用socklen_t数据类型作为接口地址结构长度,而XTI使用t_scalar_t和t_uscalar_t

发表在 C, 系统, 编程 | 标签为 | 留下评论

梦和现实。

 

有种窒息的感觉,又有多久没有体会到了。

前天做了一个梦,小时候听大人说,梦是反的。

如今确实是有和梦相反的事情发生。

生活中总有些事情让你痛彻心扉。

我记不得开始的时间,至少该记得7月7号吧。

就这么多吧。

发表在 无法分类 | 留下评论

JS/HTML代码格式化工具

想起来当初纠结很久的JS/HTML代码格式化, 站长之家找到一个,内嵌到blog后台了,猛击这里

发表在 编程 | 标签为 | 留下评论

密码保护:梦一只

这是一篇受密码保护的文章,您需要提供访问密码:

发表在 未分类 | 要查看留言请输入您的密码。