[OS64位][005]源码阅读:代码清单3-6 软盘读取 Fu
学习笔记
使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171
代码清单3-6 (程序3-2 boot.asm)
以第105行的一次call Func_ReadOneSector 调用举例
line 105: call Func_ReadOneSector
书上设置的传入参数:
书上设置的传入参数
ES:BX=0x0000:8000
输出的目标缓冲区
CL=1
读入的扇区数是1
AX
待读取的扇区号LBA
-
line 204 ~ 231
:Func_ReadOneSector:
软盘读取
Func_ReadOneSector 软盘读取
-
push bp
的时候,bp
被压入栈,即被备份到内存地址0x7bfe-0x7bff
这两个字节内存空间处,原因在于压栈操作push,是sp
寄存器先减去2
,再往SS:SP
处填入数据
205 ;======= read one sector from floppy
206
207 Func_ReadOneSector:
208
209 00000136 55 push bp
210 00000137 89E5 mov bp, sp
211 00000139 6683EC02 sub esp, 2
212 0000013D 884EFE mov byte [bp - 2], cl
213 00000140 53 push bx
214 00000141 8A1E[1800] mov bl, [BPB_SecPerTrk]
215 00000145 F6F3 div bl
216 00000147 FEC4 inc ah
217 00000149 88E1 mov cl, ah
218 0000014B 88C6 mov dh, al
219 0000014D D0E8 shr al, 1
220 0000014F 88C5 mov ch, al
221 00000151 80E601 and dh, 1
222 00000154 5B pop bx
223 00000155 8A16[2400] mov dl, [BS_DrvNum]
224 Label_Go_On_Reading:
225 00000159 B402 mov ah, 2
226 0000015B 8A46FE mov al, byte [bp - 2]
227 0000015E CD13 int 13h
228 00000160 72F7 jc Label_Go_On_Reading
229 00000162 6683C402 add esp, 2
230 00000166 5D pop bp
231 00000167 C3 ret
测试运行
[anno@localhost Desktop]$ nasm boot.asm -o boot.bin -l boot.lst
[anno@localhost Desktop]$ dd if=boot.bin of=boot.img bs=512 count=1 conv=notrunc
[anno@localhost Desktop]$ bochs -f ./bochsrc
-
[ label ]
是取出内存地址DS:label
处的数据
参考资料
关于标号 [ label ]
iv. 在NASM中所有出现标号的地方都会用标号的汇编地址替换,因此诸如mov ax, tag之类的指令,仅仅就是将一个立即数(tag的汇编地址)传送至ax而已,而不是取tag地址内的数据了!!!如果要取标号处内存中的数据就必须使用
[ ]
(类似C语言的指针运算符*
),比如[tag]
就代表取tag地址内存中的数据;
原文:https://blog.csdn.net/Lirx_Tech/article/details/42340619
关于 org 0x7C00
[OS64位][003] org 0x7c00 有什么用?
https://www.jianshu.com/p/dbbbc714f942
关于压栈push操作中SP寄存器的变化情况
[010][汇编语言]栈 栈顶SS:IP 出栈pop 入栈push
https://www.jianshu.com/p/4d8ca702549d
关于软盘读写
[082][汇编语言]编程:应用BIOS int 13H中断例程对 软盘A 进行读写
https://www.jianshu.com/p/bfeed0397631
- 3.5 英寸 软盘 3.5-inch floppy disk
上下两个面: 面号 0、1号 ,
每个面 80个磁道 : 磁道号 0~79号,
每个磁道分为18个扇区:扇区号 1~18号 ,
每个扇区512个字节(KB)
容量 = 2面 * 80磁道 * 18扇区 * 521字节 = 1440 KB ≈ 1.44 MB
[004][x86汇编语言]关于硬盘(Hard Disk)
磁盘读写原理
https://www.jianshu.com/p/51c03a83650d
[083][汇编语言]实验17 安装一个新的int 7CH 中断例程,实现通过逻辑扇区号对软盘进行读写
https://www.jianshu.com/p/2690c33851c4
从逻辑扇区号 LBA 计算出物理的扇区信息 CHS