一 段的汇编地址和段内汇编地址
1 对于一段汇编程序来说,我们用SECTION或者SEGMENT来定义段
2 段的要求:因特尔处理器要求段在内存中物理起始地址必须是16个字节,也就是说其物理地址必须被16整除。
为了达到这个要求,我们在段的定义使用align语句。例如align=16表示段是16个字节对齐,如果没有达到16个字节对其那么会自动用0来补全。
3 段的汇编地址:段内第一个元素所在的地址
4 常见的段的定义:section *** align=16 vstart=0,其中vstart=0表示程序的汇编地址需要从这个段开头开始计算。如果没有vstart=0那么程序汇编地址需要从整个程序开头开始计算
段定义的应用:在程序最后一个段开头段定义不出现vstart=0,并且在段内最后用一个标号program_end来表示程序最后一行,那么这个标号的汇编地址就表示整个程序的大小。
二 用户程序的头部
1 用户程序头部的组成:程序的总长度,入口点,段重定位表项数,段重定位表,分别占据四个字节,四个字节,四个字节,两个字节,每个段重定位表占据四个字节。
用户程序头部是一个段:在源程序是以一个段的形式出现:SECTION header vstart=0
2 用户程序的尺寸:加载器根据用户程序的尺寸,来判定读多少个扇区,用户程序很大,2个字节是不够的,需要4个字节来表示。
用户程序的入口点:包括段地址和偏移地址。理想情况下,我们希望程序开始运行的时候入口点位于代码段偏移地址为0的地方,情况并非总是如此,因此需要在初始化声明入口点的段内偏移地址和段地址。为了保存20位地址,因此必须用四个单元,32位来保存20位地址。
段重定位表:目的是直到每个段在用户程序内的物理地址,包括段重定位表项数和段重定位具体表项,分别占有两个字节和四个字节。
段重定位表项数记录了我们一共定义了除了用户程序头部以及尾段外其他段数的和,段重定位具体表项记录了每个段的段地址和段内偏移地址,用于记录我们定义的段的位置