Sep 20

M67的那篇文章在这:http://www.matrix67.com/blog/archives/1598
很久之前就转到自己博客上来了,在这里,当时也没细看,当然也没看明白。
今天仔细分析了下,终于明白怎么回事了。
先用字符串“I love you to death! You are the cutest and sweetest girl I've ever met.”生成程序为:

     #include      <stdio.h>
   main(t ,_,a)  char*a;{return
 t<1?main(*a,a[-t],"=a-1kj3gnm:q\
ebh_cf*<r.d>i^+?,()[?qzyrjuvcdefg\
h,!kbpolwxs'.t main(")&&a[-t]&&main
(t-1,_,a):t/2?_==*a?putchar(32[a])
  :_%115<36||main(t,_,a+1):main(
    0,t,")?r<g:?1<3?+<#?#m:}(\
      w+b_?1<}3?tt(yk:?+|b:\
        ?n3+:>+?([m?>.::+\
          :>+?e)kr?)ig{\
            :?y:~g:k?\
              ,:+^")
                ;}

是一个很漂亮的心形,用gcc编译执行输出:

i love you to death! you are the cutest and sweetest girl i've ever met.#

Sep 20

     前段时间花了三天时间把买了好久《大话设计模式》看了一遍。

     我是先看的附录,也就是面向对象基础。
     这是一本通俗易通的好书,毋庸置疑。看完之后至少有三个收获:
1.对面向对象语言编程(书中用的是C#)有更深的理解。
       面向对象三大特性:封装,继承,多态。
       抽象类与接口是什么?
       泛型,事件,委托与代理。
    真如书中所说,看完比上一个月课,读几本砖头书印象深,理解透。
不是说看完了就学到很多东西,而是看完之后你会有“原来如此”感觉,理解了基础,再深入就不是问题。
2.UML类图
  UML包含的东西当然很多,但书中用一例子就把类图继承,依赖,接口等等基本要素都讲到了,
至少让你我这个从没用过UML的人,看到类图能明白是什么意思。
3.设计模式及面向对象原则
  全书围绕大鸟和小菜,讲解了GOF的23个设计模式+简单工厂模式,及面向对象的四大原则+其它几个原则。

  单一职责,开放-封装,依赖倒转,里氏代换是面向对象编程之所以有效的原则,它们让软件系统是可复用,可维护,可扩展,灵活性好的。也是这些设计模式所遵守的原则。

     看完了,想想应该练习下。可书中都是用面向对象语言实现的(C#,Java等)。可我不怎么用面向对象语言,我就想用C语言来
实现它们。可C语言如何面向对象呢?之前看过有用结构来模拟实现类的,但继承,多态这些怎么弄呢?想起了很久以前瞄过的一本书《OOC》,讲的是用标准c实现面向对象。把c和对象放在一起,大家就会想起C++,是啊!有C++不就行了,为什么要折腾c呢?可就是有很多人对c++不满意,Linux之父Linus就是力挺C而批判C++的。讨厌C++的人似乎认为C++过于复杂,内部机制陷阱过多等等。OOC作者也是由于对c++不满足而转向c。

OOC这本书中主要讲了以下两点:一个发现,一个实现。
1.发现c是完全面向对象的
2.利用c实现面向对象(这里不是用c实现一个面向对象的语言,而是就是用c实现面向对象)
从抽象数据类型说起,到面向对象的要素讨论,最后提出自己的对象模型,推导出了一个类树。包括对象,类,继承,多态,最后还实现了类型检查,异常处理。为了方便编程,作者实现了一个预处理器。这本书对理解面向对象原理,很有帮助。
这里有本书的原文和部分译文下载:http://wiki.chinaunix.net/OOC
我开始看前几章觉得很晦涩难懂,硬着头皮,中文加英文看下去,搞清楚了大概思路,作了一些变化,
自己也写了一个预处理器玩了下,现在也可以很容易定义类,实现继承、多态等。

     后来搜索“面向对象理论”,发现一篇自称是扯淡的文章:http://www.iteye.com/topic/89241
我觉得这文章还是很有启发意义的,至少知道了面向对象的历史,发展,知道了有类,无类语言,3P和4P的概念。

     看了评论发现《程序设计--实践之路》这本书,这是本讲如何设计语言的书,从编译原理,语言发展,到语言的各种要素。
大概看了下里面“10.数据抽象和面向对象”一章,才知道从基本类型(整数,浮点),函数类型,结构类型,后来发展出
模块类型,按理论,类是从模块类型发展而来,面向对象也应该按此发展。可事实上面向对象的基本要素都是从20世纪60年代
开发的simula语言中来的。

     关于c语言实现面向对象,最经典的应该是gtk+了,一个基于C语言的面向对象的图形编程环境。
其中GOjbect就是基于C语言的面向对象的实现,它和glib是gtk+的两大基石。
这里面有很多关于GObject的文章:http://ekd123.is-programmer.com/posts/28754.html
什么时间好好学习下GObject了。

Sep 18

在youtube上面看到这个视频专辑:“Hardware and Operating System basics”

如果看不了,我已经上传优酷了:硬件和操作系统概要

主要内容:

  • programming the CPU and its interactions with memory and i/o devices: instructions, registers, big-endian vs. little-endian, memory-mapped vs. port-mapped i/o, interrupts, hardware exceptions, the cache
  • use of memory: stack-based execution, allocating heap, virtual memory, swapping, stack allocation
  • operating systems: Windows vs. Unix, processes, drivers, pre-emptive multi-tasking, system calls, blocking, the filesystem, IP

介绍在这里

Sep 17
      今天就是vim打开一个文本文件,结果全是乱码,也不知道具体怎么设置编码,就找到了这文章,解决了问题。

      在使用VIM 的时候,因为打开的文件编码不同,有时会出现乱码。其实在VIM7.0 中已经考虑到这个问题了。只要在 ~/.vimrc 中进行如下设置就可以打开任何文件,而不会再有乱码问题。Debian4.0 还可以放在/etc/vim/vimrc.local 中,避免自己目录中的点文件太多。

   set encoding=utf8
   set fileencodings=utf8,gbk

       下面对以上设置进行简单地解释,更详细的请用 encoding 自己看。

  第一句设置VIM 中使用的编码方式。它将影响保存在缓存、寄存器、表达式以及viminfo 文件中文本。总之,这会影响所有VIM 能处理的文本。需要注意的是,如果在编辑时临时改变这个参数,对VIM 中当前存在的文本没什么影响,但可能会使一些非ASC 码出现问题。通常,保持起始时的默认值,或者在启动VIM 时就设定好它。如本例中的做法。对于GTK+2 的程序,强烈建议使用utf-8 编码。设置时默认utf8 是utf-8 的别名。

  第二句设置文件编码。这个fileencodings 不同于上面的encoding。它只在读写文件时才会发挥作用。看了上面的语句,你可能已经猜到,它其实是一个可选的字符编码列表。当读写文件时,VIM 会优先用utf8 进行尝试,如果不行的话就转到第二条,在这里就是gbk。如果以上两条都不行,也就是说这个文件中的编码比较混乱,即有utf8 和gbk 都无法处理的字符,VIM 就会自动把fileencodings 这条语句清空,即set fileencodings= ,同时它会强制使用跟encoding 一样的编码读写文件。不过,在绝大多数情况下,不可能有这样的文件。

  其实VIM 中还有一个类似的参数叫fileencoding,它才是真正在读写文件时起作用的参数,但只需设定了fileencodings 就可以不用管它了。注意有无“s”!有关这两者的密切关系,请自行去看 help。

  还有最后一点要说明的是:当以上转换发生在utf8或其它utf变体之间时,没任何问题。但当encoding 不是utf8 时,可能会导致一点非ACS 码的问题。如果想克服这个问题的话,请使用++bad=keep,如在保存文件时用 :w ++bad=keep,但这么做有可能使问题更严重。

  PS:++bad 参数我没用过,因为如我所讲,绝大多数情况下不可能有这样的文件。

  如果你不想按以上所说在系统中设定这两个参数,只想能正常读写不同编码的文件,请不要担心。VIM 还有一个很好的临时性的方法。像这样 :edit ++enc=big5 filename,就可以big5 编码方式打开一个文件了。保存时用 :w ++enc=big5 filename。big5 可以换成你机器上有的locale 中的任意一种。前提是你的机器能正常显示。祝用得开心!

Sep 17
     《Orange's一个操作系统的实现》书中选择的汇编器为NASM。用过MASM和GAS,发现NASM的语法是最简洁的,而且有强大的宏。通过man可以知道nasm的使用方法及它与其它汇编器语法上的区别。
 
主要值得注意的区别,也是我们常用的如下:

0.注释用分号‘;'
    ;这是注释
    这是代码

 
1.与gas不同,寄存器名字前面不用加'%'
  与gas操作数的顺序不同,mov ax,dx表示ax=dx而不是dx=ax

2.浮点寄存器名字为st0,st1等

3.与masm的dup不同,nasm重复数据用times,如:
    message:times 3 ‘abc’
    times 64-$+message db 0
  定义了字符串“abcabcabc”,加上后面跟着的0,长度总共为64

4.$表示当前行被汇编后的地址

5.$$表示一个节的开始处被汇编后的地址

6.符号都是立即数,标号和变量是一样的,都表示地址:
    foo dw 1 等价与 foo:dw 1
 
7.[addr]表示取地址的值,可以带word,byte等前缀指定大小:
    foo dw 1
    mov ax,foo
    mov dx,[foo]
  ax中为1的地址,dx为1

8.简单宏定义:
    %macro add 2 ;定义名为add,2个参数
         mov ax, %1;第一个参数给ax
         add ax, %2;加上第二个参数
    %endmacro
    add 1,3;调用宏

9.条件预编译宏
    %ifdef _BOOT_DEBUG
         org 0100h
    %else
         org 07c00h
    %endif

 
nasm的文档下载:http://www.nasm.us/docs.php
网上有翻译的中文文档下载,这里有一份。
Sep 17

      俱乐部的新学期又开始了,OS组的同学又要开始看《Orang‘s一个操作系统的实现》和做操作系统实验了。在这里把做的过程中的收获和体会写下来。

本篇是关于书中的第一,二章的开发环境搭建。这里讲的是完全在linux下的环境搭建

用到的工具及作用:

一台安装有linux操作系统的计算机:这是其它一切的前提。

nasm,gcc,make:编译链接的基本工具

bochs:运行调试工具

qemu:运行工具,比bochs更快

dd:绝对扇区读写工具,用来写引导扇区和查看映像内容

bximage:用来生成虚拟映像

objdump,readelf:查看目标文件结构,查看elf文件

vim:用来编译代码,也可以是其它的文本编辑器。

freedos映像:在第三章中,因为程序可能超过512字节,不能写入引导扇区,
                      于是编译成com文件在dos中运行,这个在bochs官网可以下到。

bochs编译选项及说明:
       --enable-vbe
       --enable-debugger:开启调试功能,默认不开
       --enable-debugger-gui:调试时有运行窗口
       --enable-smp
       --enable-new-pit
       --enable-all-optimizations
       --enable-4meg-pages
       --enable-reset-on-triple-fault
       --with-all-libs
       --with-x
       --with-x11
       --with-nogui:使可以不显示运行窗口

需要了解的:

2.引导扇区:硬盘或者软盘某个分区的第一个扇区,如果以0xAA55结束,则BIOS认为它是一个可引导扇区。
   计算机启动时,先进行加电自检(POST),然后按顺序寻找启动盘,也就是检查所有磁盘的第一个扇区,一旦发现以0xAA55结束,则将这512字节装载到内存地址0000:7c00处,然后跳转到0000:7c00,运行引导扇区的代码。
更准确定义见这里:
http://en.wikipedia.org/wiki/Boot_sector
Sep 16

这是实验室小石头同学经常说的一句话。

:不要怕丢人,丢人不可怕。

感觉自己还是挺好面子的一个人。总是太在意别人的想法,被别人的视线影响。

这句话跟“走自己的路,让别人去说吧!”表达意思相似,都是说要勇敢做自己。

很多时候丢人了倒不觉得什么,反倒是对自己没去做而后悔不已。

在这里用它来激励自己勇于尝试,敢于挑战,NB地做回自己。