无法使用自定义引导加载程序使用 int13H 读取扇区
Unable to read a sector using int13H using custom Bootloader
最近我正在学习 x86 汇编,为了练习,我决定推出我自己的引导加载程序。在引导加载程序本身中使用 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 中的 return 代码和进位标志,进位标志已设置,表示读取成功。在我脑海中没有其他来源的情况下,首先要参考的是堆栈溢出。如果有人帮助我,我将非常感激。
此类问题通常与段(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 指令。
我有可能有用。
最近我正在学习 x86 汇编,为了练习,我决定推出我自己的引导加载程序。在引导加载程序本身中使用 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 中的 return 代码和进位标志,进位标志已设置,表示读取成功。在我脑海中没有其他来源的情况下,首先要参考的是堆栈溢出。如果有人帮助我,我将非常感激。
此类问题通常与段(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 指令。
我有