orange's学习--编译理解

------------------------------------------------------------
源码  与 编译结果文件  理解


1,最简单的汇编语言源码文件(没有太多伪指令,没有节,大部分是实模式的编程,或者实模式跳转到保护模式),
一般都是编译成一个纯二进制文件(也称为Raw Binary File或Flat-form Binary File)。
也就是说,生成的二进制中除了你写的源代码编译的指令字节之外不包含其他任何东西。这也意味着,程序执行时的内存映像和二进制文件映像是一样的。就是程序执行时在内存中的内容和二进制文件内容完全一样,只不过在程序执行过程中,不断修改内存的内容。这里的二进制文件必须要加载到指定的线性地址位置(例如引导扇区的程序)或者指定的段偏移地址(例如使用DOS调试的程序)才能工作,而且汇编语言源码文件一般需要使用org伪指令指定程序起始地址。
汇编编译器仅仅将汇编指令、定义的数据变量按照顺序生成二进制数据存放在文件里面,源码文件数据变量被编译成偏移地址进行操作。


2,含有节的汇编源文件,SECTION是一种组织代码和存储的方式。含有节的汇编源文件应该都是保护模式下的编程。
一个简单的汇编代码通常分成三个节,.data section(节) .bss section(节) .text section(节)。
NASM支持标准的.data, .text和.bss,编译后的程序文件中的内存地址顺序是.text, .data,用户自定义section。
同名的section,编译后会放在同一块连续的内存上。对用户自定义section,按照出现的先后顺序存储,同名的section存储在一起。含有节的汇编源文件,可以按照需要编译成不同格式的文件,例如elf、win等等。这种编译结果文件加载到内存以后,需要按照文件的格式解析,把解析后的程序放到指定的内存位置才可以执行。


3,C语言的编译应该也是编译成有格式的编译结果文件,操作系统在执行的时候,也是需要按照文件的格式解析,
把解析后的程序放到指定的内存位置才可以执行。(更多内容参考书籍--程序员的自我修养--链接、装载与库

 

你可能感兴趣的:(orang's)