Minix下的汇编

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>",至于是为什么,我在这里就不说了,自己试试看吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值