【发布时间】:2018-08-24 09:35:08
【问题描述】:
最近我正在学习 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 和进位标志中的返回码,并设置了进位标志,表示读取成功。在我没有其他来源的情况下,首先要参考的是堆栈溢出。如果有人帮助我,我将非常感激。
【问题讨论】:
-
“最近我在学习 x86 汇编,为了练习,我决定创建自己的 Boot loader。”不要气馁,但你决定在一个臭名昭著的敌对环境中开始......可能更简单的开始将是一个简单的 DOS COM 程序 - 你仍然可以完全控制机器,但环境已经处于良好状态并且你有更多服务(例如文件 I/O)。
-
我已经在这方面工作了几个月。现在我想制作自己的操作系统。这就是为什么我下到金属
-
先生,创建操作系统实际上是我的梦想。所以我可以在任何恶劣的环境中工作
-
"设置了进位标志" - 如果设置了进位标志,则读取失败。你的意思是进位标志被清除了?此外,当您调用 int 10 时,您并没有在 bh 中设置值。
-
缓冲区位于 ES:BX。您是否正确设置了 ES,使其对应于 BX(扇区)所在的段?您可能在设置段寄存器时遇到问题,并且与正在使用的 ORG 指令不匹配。除非您发布了所有代码来制作此minimal reproducible example,否则这是一个猜谜游戏。PS:启动驱动器不需要硬编码。当 BIOS 将控制权转移到引导加载程序时,它在 DL 中设置。您可以使用(或保存到内存并重复使用)该值用于磁盘 BIOS 调用。
标签: assembly nasm x86-16 bootloader bios