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

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

作者: AkuRinbu | 来源:发表于2019-04-30 20:10 被阅读0次

    学习笔记

    使用教材(配书源码以及使用方法)
    《一个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处的数据
    标号由于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

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/ayhunqtx.html