回 帖 发 新 帖 刷新版面

主题:求助关于一段从软盘启动的boot sector代码

org 7c00h
   mov ax,cs
   mov ds,ax
   mov es,ax
   call  DispStr
   jmp  $
DispStr:
   ........
   ........;调用显示字符串例程 
   ........
   ret
times 500-($-$$)
dw 0xaa55


这段代码是放在软盘的第一个扇区
然后书上说:只要把"org 07c00h"这一行改成"org 0100h"就可以编译成一个.COM文件让他在dos下运行.
那1.这句话是什么意思亚?
  2.要是前面那段代码没有一开始那句org 07c00h 运行起来会是什么情形亚?
  3.在网上看到说要在最后写入aa55,不能这样
             org 510
             dw 0xaa55    
    这又是为什么亚?                       
[em8]

回复列表 (共1个回复)

沙发

1. 引导程序加载后,所有段寄存器的初始值都为0. 所以开头定义了org xxxxh后,程序中的各地址值将被转化成绝对地址(这样DS:addr,即0:addr = addr才是正确的地址)。这和普通汇编是不一样的。
因此,定义了org 7c00h后编译出的程序如果被加载到非7c00h处的话其中的地址访问语句基本上都会执行错误。

而引导程序必然被加载到7c00h处,dos下的com程序必然被加载到0100h处,这是约定。
参考文章: "Nasm-org指令深入理解", 大约7页的一篇文章,自己上网搜一下;

2. 如果没有开始的org 7c00h定义,引导程序的字符串将不能正确打印,这是由于地址值不正确造成的,原因见1.

3. 每个扇区512字节,磁盘0扇区必须以0xAA55结束,BIOS才会认为它是引导扇区。
上述代码中 times 500-($-$$) 这一句有误,应为times 510-($-$$)
推荐 "自己动手写操作系统"一书

我来回复

您尚未登录,请登录后再回复。点此登录或注册