Chinaunix首页 | 论坛 | 博客
  • 博客访问: 530893
  • 博文数量: 102
  • 博客积分: 2146
  • 博客等级: 大尉
  • 技术积分: 1146
  • 用 户 组: 普通用户
  • 注册时间: 2010-10-09 17:32
文章分类

全部博文(102)

文章存档

2015年(14)

2014年(24)

2013年(5)

2012年(30)

2011年(16)

2010年(13)

分类: 嵌入式

2010-12-05 21:53:18

 大家都知道,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)所以读出的数据与期望的一样!

 

延伸一下,如果把这句放到引导程序中间任何一个位置会怎么样?

只要放在定义变量的前边就可以

阅读(2600) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~