引导加载程序无论如何都会将其加载到该地址?为什么要指定这个程序?
答案 0 :(得分:2)
ORG伪指令的作用是告诉汇编器将这个偏移量添加到所有提到的绝对地址。例如,如果您将“MOV AX,my_string”和my_string写入代码中的1234字节,则汇编程序将生成“MOV AX,7c00h + 1234”。不太常见的是,它也被用于从给定的绝对地址计算相对地址(例如短跳)。
答案 1 :(得分:2)
你在这里没有选择。阅读这篇文章:
http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders
从上面的URL,BIOS(实际上是PC硬件)将跳转到0000:7c00的内存,继续以16位模式执行。
从上面引用:
引导加载程序在某些条件下运行,程序员必须了解这些条件才能成功引导加载程序。下列 适用于PC BIOS启动的引导加载程序:
- 第一部门 驱动器包含其引导加载程序。
- 一个扇区是512字节 - 最后一个 其中两个字节必须是0xAA55(即0x55后跟0xAA),或者 否则BIOS会将驱动器视为无法启动。
- 如果一切都在 命令,表示第一个扇区将被放置在RAM地址0000:7C00,和 BIOS将控制权转移到0000:7C00时,其作用已结束。 (即它 JMP到那个地址)
所以从启动开始,如果你想让CPU开始执行你的代码,它必须位于内存0000:7c00。而这部分代码是从硬盘的第一个扇区加载的 - 也是由硬件完成的。并且它只是第一个被加载的扇区,然后代码的其余部分必须由这个初始的“引导程序”加载。
此处提供更多信息(关于硬盘启动扇区和7c00功能):
http://www.ata-atapi.com/hiwdos.html
http://www.ata-atapi.com/hiwmbr.html
请不要与CPU的启动模式混淆 - 它将获取和执行的第一条指令位于物理地址0xfffffff0(参见第9-5页):
并且在此阶段它正在执行非易失性(意味着您无法轻松地重新编程,因此不是引导加载程序的责任)BIOS代码。
更新:2015年10月6日
但是这个BIOS代码确实有一些变化(正如Michael Petch强调的那样) - 某些BIOS将从07c0:0000而不是0000:7c00加载,并从“grub”bootloader源代码中提取:
.globl _start; _start:
/*
* _start is loaded at 0x7c00 and is jumped to with CS:IP 0:0x7c00
*/
/*
* Beginning of the sector is compatible with the FAT/HPFS BIOS
* parameter block.
*/
jmp after_BPB
nop /* do I care about this ??? */
after_BPB:
/* general setup */
cli /* we're not safe here! */
boot_drive_check:
jmp 1f
testb $0x80, %dl
jnz 1f
movb $0x80, %dl
1:
/*
* ljmp to the next instruction because some bogus BIOSes
* jump to 07C0:0000 instead of 0000:7C00.
*/
ljmp $0, $ABS(real_start)
答案 2 :(得分:0)
您尚未提供此问题的任何背景信息。但我会尝试给出某种形式的答案。
当程序在加载到内存后执行时,程序必须位于某处,想象这是地址7C00。处理器开始在某处开始,在你的情况下很可能是7C00。 ORG语句告诉汇编程序,以下指令的地址将出现在此地址中。
为什么不是0?好吧,你的处理器可能想要那些地址的其他东西,即。中断向量。
处理器的数据表将为您提供有关其启动顺序的更多信息。
祝你好运。从快速的好处......
答案 3 :(得分:-1)
我也很困惑。看起来它取决于您的代码和链接参数。如果你看一下grub2中的boot.S,它没有“.org 0”或“.org 0x7c00”。
我还写了一个简单的bootloader代码。我使用的是“.org 0”,但我可以在不破坏功能的情况下删除它。我的代码是这样构建的:
all:
i686-elf-as -o boot.o boot.S
i686-elf-ld --oformat=binary -Ttext=0x0 -o boot.bin boot.o