欢迎来到天天文库
浏览记录
ID:39230248
大小:520.97 KB
页数:25页
时间:2019-06-28
《内核编程语言和环境》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、内核编程语言和环境1主要内容as86汇编器GNUas汇编C语言程序C与汇编程序的相互调用Linux0.12目标文件格式Make程序和Makefile文件实验21.as86汇编器as86汇编器ld86链接器as86和ld86由MINIX-386主要开发者BruceEvans编写Linux系统用它来创建16位的启动引导扇区程序boot/bootsect.s和实模式下初始设置程序boot/setup.s的二进制执行代码该编译器语法与GNUas汇编编译器语法不兼容3示例程序4示例程序(续)赋值语句:伪操作符语句:伪操作码和0个或多个操作数组成每个操作码有一个点字符(表示编译过程中的位置计数器)
2、开始标号:标识符后跟一冒号5as86汇编语言语法命令行基本格式:as[选项]–oobjfilesrcfileboot.s编译连接过程as86-0–a–oboot.oboot.sls86-0–s–obootboot.oddbs=32if=bootof=/dev/fd0skip=1注意:最后生成的boot程序不是512B,而是长了32B(MINIX可执行文件的头结构),必须手工去掉这32B。62.GNUas汇编内核其余部分(除bootsect.s和setup.s)外其余所有汇编语言程序(包括C语言产生的汇编程序)均使用gas来编译,并与C语言程序编译产生的模块链接。在编译C语言时,GNUg
3、cc汇编器会首先输出一个作为中间结果的as汇编语言文件,然后gcc会调用as汇编器把这个临时汇编语言程序编译成目标文件。实际上,as汇编器最初是专门用于汇编gcc产生的中间汇编语言程序的,并非作为一个独立的汇编器使用。7as汇编语法示例Head.s含有32位启动代码.text.global_idt,_gdt,_pg_dir,_tmp_floppy_area_pg_dir:st32artup_32:mov1$0x10,%eaxmov%ax,%ds……8关于实模式和保护模式第一款微处理器芯片4004(Intel)是一个4位微处理器。第二款8位处理器8080,有1个主累加器(寄存器A)和6个
4、次累加器(寄存器B,C,D,E,H和L)等,用来访问16位的内存地址,也就是说8080可访问到64K内的地址空间。(还没有段的概念,访问内存都要通过绝对地址,因此程序中的地址必须进行硬编码)第三款16位处理器8086,标志着IntelX86王朝的开始,因为8086处理器引入了一个重要概念——段。9关于实模式和保护模式(续)8086处理器的寻址目标是1M大的内存空间,其地址总线扩展到了20位,但是其数据总线却只有16位。为了支持分段,Intel在8086CPU中设置了四个段寄存器:CS、DS、SS和ES,分别用于可执行代码段、数据段、堆栈段及其他段。每个段寄存器都是16位的,对应于地址总
5、线中的高16位。即内存总线中的高12位与段寄存器中的16位相加,而低4位保留不变,这样就形成一个20位的实际地址,实现了从16位内存地址到20位实际地址的转换,或者叫“映射”。(实模式)80286处理器1982年问世,其地址总线位数增加到了24位,因此可以访问到16M的内存空间。更重要的是从此开始引进了一个全新理念——保护模式。这种模式下内存段的访问受到了限制。访问内存时不能直接从段寄存器中获得段的起始地址了,而需要经过额外转换和检查。10关于实模式和保护模式(续)80386是32位CPU,地址址总线与数据总线宽度一致,都是32位,因此其寻址能力达到4GB。80386以后,Intel的
6、CPU经历了80486、Pentium、PentiumII、PentiumIII等型号,虽然它们在速度上提高了好几个数量级,功能上也有不少改进,但基本上属于同一种系统结构的改进与加强,而无本质的变化,所以我们把80386以后的处理器统称为IA32(32BitIntelArchitecture)。113.C语言程序C程序编译过程如下:cpp对C语言程序中指示符和宏进行替换处理12gcc用法示例编译hello.c程序,生成执行文件hellogcc–ohellohello.c编译hello.c程序,生成对应汇编程序hello.sgcc–S–ohello.shello.c编译hello.c程序
7、,生成对应目标文件hello.o而不链接gcc–c–ohello.ohello.c13嵌入汇编(内联汇编)内核C语言程序中嵌入汇编语句通常使用汇编语句最方便的方式是把他们放在一个宏内14嵌入汇编示例154.C与汇编程序的相互调用汇编中调用C函数比较“自由”,只要在栈中适当位置的内容就都可以作为参数供C函数使用。164.C与汇编程序的相互调用(续)在C程序中调用汇编。如果调用的汇编语言程序比较短,可以直接在C程序中使用内联汇编语句。17汇编程序c
此文档下载收益归作者所有