[OS64位][005]源码阅读:代码清单3-6 软盘读取 Fu

2019-04-30  本文已影响0人  AkuRinbu

学习笔记

使用教材(配书源码以及使用方法)
《一个64位操作系统的设计与实现》
http://www.ituring.com.cn/book/2450
https://www.jianshu.com/p/28f9713a9171

代码清单3-6 (程序3-2 boot.asm)

以第105行的一次call Func_ReadOneSector 调用举例

书上设置的传入参数:
ES:BX=0x0000:8000 输出的目标缓冲区
CL=1 读入的扇区数是1
AX 待读取的扇区号 LBA

书上设置的传入参数
Func_ReadOneSector 软盘读取
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
标号由于org 0x7C00的缘故 自动加上0x7C00 0x18 以及 0x24 偏移处的标号

参考资料

关于标号 [ 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

上一篇下一篇

猜你喜欢

热点阅读