我正在开发一个“只在过程中握住你的手,使用汇编编写你自己的操作系统”项目。除了硬盘读写之外,我已经用 MikeOS 之类的东西从头开始编写了所有内容。读写的重要性在于允许操作系统大于512长度的基本输入输出系统内存。
我编写了一个测试用例,用于从硬盘读取并在屏幕上打印第一个字符。使用qemu,我可以定义哪个文件用作硬盘驱动器,因为我定义了程序可以在读取函数中断期间使用 0x80 选项指向该硬盘驱动器的寄存器的位置。
第一个测试代码没有选择硬盘驱动器,因此读取代码将读取它自己的运行二进制文件并产生一个“a”,假设由于二进制文件在加载到的运行文件的开头产生了一个“a”(ascii)基本输入输出系统。_ _ _ _
所以我的问题是......
当我定义硬盘驱动器选择时,为什么它不像我没有定义硬盘驱动器时那样读取屏幕上文件中的字符串“Hello”?
我的代码开头是否正确,屏幕上生成的“a”是巧合,在模拟器中运行的生成的二进制文件的开头有一个“a”?
为了大家,请用解释和代码回复。我在 Stack Overflow 中发现了两个问题,它们都用英文解释来回答他们的代码有什么问题,但没有代码可以证明为什么他们的解释是正确的。解释但不展示你的工作是一个有争议的问题。
不要建议我使用 C、C++ 或除汇编之外的任何其他语言,如果您已经完成研究并且我已经完成研究并反汇编高级语言(如 C、C++ 或其他任何语言),您会看到一个简单的“定义并在控制台上读取字符串”不仅要大得多,而且在效率方面也很粗心。这些反汇编的 C 代码与手写汇编示例的比较也将在项目文件中发布。
感谢您的宝贵时间,当我将项目作为开源教程发布时,社会将感谢您为与我处于相同位置的其他人节省了多少时间。(人类知识属于世界——反垄断电影,2001 年)
[bits 16]
[org 0x7c00]
message db "Hello"
mov ah, 0x02 ;point to read sector function
mov ch, 0x00 ;ch track/cylinder number
mov dh, 0x00 ;dh head number
mov cl, 0x00 ;cl sector number
mov dl, 0x80 ;drive number 80 is drive0, 81 is drive1
int 0x13
;read disk into terminal.... might be working, just displays 'a'...
mov ah, 0x0e
mov al, [bx]
int 0x13
;Purpose, move to the next character read from file
mov ah, 0x0e
mov es, bx
mov al, [bx]
int 0x13
times 510 - ($-$$) db 0
dw 0xAA55
;==============================================================
; Reference Notes
;==============================================================
;
;;;;;;;;;;;;; Interupt 02 - Read from sector ;;;;;;;;;;;;
;AH = 02
;AL = number of sectors to read (1-128 dec.)
;CH = track/cylinder number (0-1023 dec., see below)
;CL = sector number (1-17 dec.)
;DH = head number (0-15 dec.)
;DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
;ES:BX = pointer to buffer
;
;on return:
;AH = status (see INT 13,STATUS)
;AL = number of sectors read
;CF = 0 if successful
; = 1 if error
;;;;;;;; Inturrupt 13 - Video card functions ;;;;;;;;
;AH = 02, means TTY mode, print to console mode
;AL = which character to print to console