000. 这里存放一些疑惑和解答

1. org 0x7c00

   ORG:  是伪指令, 而且是给链接器用的, 是在链接的时候,  让 代码里的所有偏移地址, 从  0x7c00开始, 而不是  0x0000

   比如  mov ds, ax,默认编译完成后 , 他的地址是  从 0x00开始, 逐渐递增,  而  org ***, 只是让 地址从  0x**开始递增而已.

   一些其他的书籍(比如自己动手写操作系统), 很多示例代码, 会在boot.s先加上  org 0x7c00;

  原因是,  bios会做一些固定的操作, 自检完毕后, 会把  启动扇区的头512个字节加载到  0x0000:  0x7cc 处,

并且设置  cs = 0x0000, ip = 0x7c00. 这里要说明一下,  如果,  boot.s里全是  mov ds, ax这种不在乎偏移地址的操作, 其实没啥大关系, 一点儿影响都没有, 因为 不论  boot.s 有没有 org 0x7c00, 反正 可执行代码都被加载到了 0x7c00出, 一样可以执行的.

至于为什么一定要加 org, 是因为, 程序中, 会用某些  label 

比如 

mov ax, msg

msg:

    .ascii  "hello system"

如果没有 org , 那么实际上,编译后的 , 是这种的,  mov ax  0x12;  0x12 是 msg的地址, 当加了  org 0x7c00的时候,  编译后是  mov ax, 0x7c12, 这才是  msg真正的地址, ORG只是起了这个作用而已.

在 linux 0.00 那个多任务的示例代码中, 没有用这种方式(貌似是 nasm独有的? 不知道), 用了 jmpi  go, 0x7c0, 这种方式, 实际上是通过改变段寄存器CS来达到这种效果的

cs= 0x7c0, ip = go, 所以加完了, 也是 0x7c0 左移四位(*16), 再加上go,一样是  0x7c00 + go.

 

你可能感兴趣的:(000. 这里存放一些疑惑和解答)