最近我正在学习x86汇编,为了实践,我决定卷起自己的Boot loader。在引导程序本身中使用int13H之前,我决定尝试读取软盘上的扇区(逻辑19)。但是不幸的是,写下代码并在QEMU上运行之后,没有数据被加载。我想我可能在某个地方错了。这是我的代码。
read_sector:
mov ah,02H ; Function code to Read Sector
mov al,01 ; Read one sector
lea bx,[SECTOR] ; Address of input buffer
mov ch,00 ; Track 0
mov cl,02 ; Sector 1
mov dh,01 ; Head number 1
mov dl,00 ; Drive Number ( 0 - Floppy)
int 13H ; call the routine
mov ah,0EH
add al,48
int 10H
ret
为了弄清楚我实际上正在阅读:
逻辑部门19: 音轨-0 头-1 部门-2
在代码SECTOR中代表一个标签,通过它我可以访问扇区以及从扇区读取输入数据。
我的打印功能(基本)代码:
print:
mov al,03H
int 10H
.repeat:
lodsb
mov ah,0EH
cmp al,0
je .done
int 10H
jmp .repeat
.done:
ret
很抱歉代码中剩下的一些小问题:(
关于调用此函数并在此处访问(打印)数据的是代码。
call read_sector
mov si,[SECTOR]
但是运行它不会在屏幕上显示任何内容。我还参考了Ralf Brown文件,并检查了所有内容(int 13H fun:02H)。我还检查了ax和进位标志中的返回码,并且设置了进位标志以指示读取成功。在我想到没有其他来源的情况下,首先要引用的地方是堆栈溢出。如果有人帮助我,我将非常感激。
答案 0 :(得分:0)
此类问题通常与未正确设置段( ES )寄存器有关。 Int 13h/AH=2h的记录方式如下:
需要将AH = 02h AL = number of sectors to read (must be nonzero) CH = low eight bits of cylinder number CL = sector number 1-63 (bits 0-5) high two bits of cylinder (bits 6-7, hard disk only) DH = head number DL = drive number (bit 7 set for hard disk) ES:BX -> data buffer
ES 设置为数据缓冲区偏移所在的段。
在将引导程序或 JMP 设置为在另一个段中进行编码时,应始终确保为段寄存器加载了适当的值。您使用的段将取决于您在代码中使用的ORG指令。
我有general bootloader tips可能有用。