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.