Linux内核0.12——内核编程语言和环境
/********AT&T 汇编格式********/
1、为了维持与gcc输出汇编程序的兼容性,as汇编器使用AT&T系统V的汇编语法,这里主要说明一下它与intel汇编的语法区别
2、AT&T与intel汇编语法格式的区别
1)寄存器引用:mov %eax,%ebx
2)操作数顺序:mov %eax(源),%ebx(目的)
3)立即数格式:mov $4,%ebx(如果不加$,则认为4是地址);mov value,%ebx(可以直接引用符号常数);mov $value,%ebx(引用了符号常数作为地址)
4)操作数长度:movb %eax,%ebx(movb为mov byte ptr,movw为mov word ptr,movl为mov long ptr)
5)跳转指令:ljmp $section,$offset;lcall $section,$offset;lret $stack_adjust(等同于intel汇编格式的:jmp far section:offset;call far section:offset;ret far stack_adjust)
6)内存引用:section:[base + index*scale + disp](等同于intel汇编:section:disp(base,index,scale))
/*********嵌入汇编********/
1、C程序的产生过程(gcc编译器):.c源文件----(cpp预处理)---->.c纯C----(cc编译器)---->.s汇编程序----(as汇编器)---->.o目标文件----(.a库文件+ld连接器)---->可执行文件
2、嵌入汇编格式:
objdump -h hello3、链接程序的任务
1)给执行文件进行存储空间分配操作。一旦存储位置确定,链接程序就可以继续执行符号绑定操作和代码修正操作
2)把所有模块中相同类型的段组合连接在一起,在输出文件中为指定段类型形成单一一个段
4、内核加载可执行文件
1)首先,内核根据文件头部结构中的信息首先判断文件是不是一个合适的可执行文件
2)然后系统在用户态堆栈顶部为程序设置环境参数和命令行上输入的参数信息块并为其构建一个任务数据结构
3)接着在设置了一些相关寄存器值后利用堆栈返回技术去执行程序。执行程序映像文件的代码和数据将会在实际执行到或用到时利用需求加载技术动态加载到内存中
/*****makefile*****/
参见:http://blog.csdn.net/fengxiaoke_fxk/article/details/7525804