大家都知道,BIOS约定将会把引导盘的o磁道,0磁头,1扇区的代码读到内存的绝对位置0x7c00处,并把控制权交到该处开始执行,但为什么还要在引导程序最前面加入:ORG
0x7c00呢?
首先我们来了解下ORG的功能:告诉编译器紧跟下面变量的地址设为当前地址值+其设置的值
我们将其分为两种情况:
1.不加ORG 0x7c00
Bios把代码加载到内存的0x0000:0x7c00处后开始执行,如果代码中定义了某个数据,需要读取时,因为此时的段地址为0x0000,而数据的
偏移地址也是从0x0000开始的,实际的数据已经被BIOS加载到:0x0000:0x7c00+偏移地址,而取的时候实际上CPU算出的
为:0x0000:偏移地址,所以就会出现读出的数据与期望的不符!
2.加上ORG 0x7c00
同上代码被加载到内存的绝对地址0x0000:0x7c00处,而偏移地址实际上便成了0x7c00+(相对代码最开始的偏移地址),CPU计算时为:0x0000:偏移地址(实际上已经加上过0x7c00)所以读出的数据与期望的一样!
延伸一下,如果把这句放到引导程序中间任何一个位置会怎么样?
只要放在定义变量的前边就可以
阅读(2640) | 评论(0) | 转发(0) |