【发布时间】:2013-07-15 15:47:42
【问题描述】:
我正在尝试学习实模式汇编。我想读取硬盘的引导扇区,所以下面是代码
org 100h
start:
xor ax, ax
mov es, ax ; ES <- 0
mov cx, 1 ; cylinder 0, sector 1
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, buff ; segment offset of the buffer
mov ax, 0201h ; AH = 02 (disk read), AL = 01 (number of sectors to read)
int 13h
jnc .read
.read:
mov ax, cs ; set up segments
mov ds, ax
mov es, ax
mov al, 03h
mov ah, 0
int 10h
mov si, buff
call print_string
.done:
jmp .done
print_string:
lodsb ; grab a byte from SI
test al, al ; logical or AL by itself
jz .done ; if the result is zero, get out
mov ah, 0x0E
int 0x10 ; otherwise, print out the character!
jmp print_string
.done:
ret
buff dw 512
我的执行环境是DosBox0.70,exe文件是.COM。 我希望在屏幕上看到 512 个字节,但是当我运行我的 .COM 文件时,它只是空白屏幕。我可以看到它背后的几个原因
1) 给出的代码没有从 Bios 中断正确返回 (int 13h)。 2)String 应该以 null 结束,这里没有发生。
但不确定是否是上述原因导致它发生,如果是,我该如何应对这些问题??
【问题讨论】:
-
试试
mov bx, offset buff -
@EgorSkriptunoff:代码看起来像是为 NASM 编写的,它没有/不需要
offset关键字。 -
引导扇区很可能包含超出 ASCII 表中可打印范围的字节(并且它包含值为 0 的字节)。尝试编写一个将每个字节打印为两个十六进制数字并重复此操作 512 次的函数,而不是使用您的 print_string 函数。顺便说一句,您已将缓冲区声明为可容纳 1024 个字节(512 个字)。
-
版本#2:由于某种原因,MBR 的第一个字节为零。
-
@EgorSkriptunoff 如果 MBR 的第一个字节为零,则不应打印任何内容。