Minix下的汇编
大多数的编译器,如Turbo C/C++,Borland C/C++,M$ C/C++,GCC,VC+,编译过程都是"高级语言"->"asm"->"obj" .(当然TurboPascal是个例外,它能跳过生成asm文件这一段而直接生成目标代码).
Minix下的CC也不例外.
一般来说,minix启动时执行的第一段代码就位于mpx386.s中,但是#$%#$!@,怎么看不懂啊,虽说和它里面的几个mov,jmp都是老朋友了,可一看到里面那古里古怪的伪指令,我就找不着北了.上网查了半天,虽然没查到什么,但感觉English又进步了不少:P.
没办法,看来只有LIY(Learn It by Yourself,自学)了.
这里所说的"自学",不是平常说的那种抱着一本什么什么书看上半天的那种自学,那叫"自己学习",这里所说的自学,是"自己动手学".可是现在的问题是从哪里入手呢?我的第一反应是"Hello world!",不晓得你是什么反应:P.
第一,二段提到了,CC的编译过程是:src->asm->obj.对,就从这里入手,用CC将.c文件转换成.s文件.
先进入Minix,用man查看一下cc的使用说明,因为是查找和汇编有关的选项,所以我就用命令:# man cc | grep assem.于是屏幕上就显示出了带assem的几行,当然只有这一行是最有用的:"-S Transform the input files to assembly files with suffix .s.".
那么现在就试试看,先来个Hello.c,代码很简单:int main(){printf("Hello world!");}.再将它转换成.s文件:"cc -S hello.c".OK,现在一个标准的.s的框架就出来了:
1] .sect .text; .sect .rom; .sect .data; .sect .bss
2] .extern _main
3] .sect .text
4] _main:
5] push ebp
6] mov ebp,esp
7] push I_1
8] call _printf
9] pop ecx
10] leave
11] ret
12] .sect .rom
13] I_1:
14] .data4 1819043144
15] .data4 1870078063
16] .data4 560229490
17] .data4 0
18] .sect .text
好了,现在来分析一下这个.s文件的结构:
第1]行:sect应该是section的意思,那么.sect .text;就是说明一个代码段,.sect .data 是说明一个数据段(以初始化),.sect .bss 是说明一个数据段(末初始化),还有一个.sect .rom 搞不清,没关系,接着往下看:
第2]行:容易理解,说明了一个名为_main的标签.
第3]行:OK,代码要开始了.
第4]至11]行:不在本文的学习范围之内,跳过.
第12]至17]行:似乎这几行就是"Hello world!"的值.哦,明白了,.rom表示常量的意思.
行了,到了这里,一个简单的.s文件的框架就分析完了,如果还不满足的话,可以自己动手做做看:"do not try to memorize, learn by usage.".不过,在分析的过程中,千万不要在.c里面放个"#include <stdio.h>",至于是为什么,我在这里就不说了,自己试试看吧!