果然发现了毛病!谢谢 wengier 关于这个 BUG 的详细描述!没有您的描述,很难找到毛病在哪里。GRUB for DOS 离不开您,wengier 兄。
在 grldrstart.S 中,有如下一段程序:
movb %al, %cl
xorb %ch, %ch /* CX = number of sectors read */
shlw $9, %cx /* CX = number of bytes read */
addw %cx, %bx /* ES:BX points to new location */
jnc 2f
movw %es, %ax /* BX=0, exceeds 64K boundary, adjust ES */
addw $0x1000, %ax
movw %ax, %es
movb $0x80, %ah /* adjust max number of sectors to read */
2:
改成如下这样就应当 OK 了:
movb %al, %cl
/* xorb %ch, %ch */ /* CX = number of sectors read */
注释掉该语句,是因为这个语句多余。保留该语句也不算错。注意下面有 shlw 左移 9 位的语句。
shlw $9, %cx /* CX = number of bytes read */
这一语句是关键。如果扇区数 CX= 0x80,则左移 9 位之后,CX 变成 0 了!!!!
jz 3f
当 CX=0 时,跳到标号 3: 去执行修正 ES 的语句。
addw %cx, %bx /* ES:BX points to new location */
如果 CX 是 0,则把它加到 BX,不可能有进位。执行下面的 JNC 就直接跳到标号 2:了。
jnc 2f
3:
movw %es, %ax /* BX=0, exceeds 64K boundary, adjust ES */
addw $0x1000, %ax
movw %ax, %es
movb $0x80, %ah /* adjust max number of sectors to read */
2:
在 ftp://ftp.cosoft.org.cn/incoming/ 之下已经有太多的 GRUB 文件了,有点垃圾的感觉。所以,我有点害怕上载了。谁能提供一个别的上载空间,临时的?因为最近有很多的修改之处,所以不想为一点点修改而上载到 cosoft 的宝贵空间上。
如果没有其它上载空间,要么等待下次一并更新,要么麻烦两位老兄自己编译更新。
因为我们亲手创建,这个世界更加美丽。