关于阅读《一个64位操作系统的设计与实现》遇到的问题

img

img

代码如下:


;=======    get FAT Entry

Func_GetFATEntry:

    push    es
    push    bx
    push    ax
    mov    ax,    00
    mov    es,    ax
    pop    ax
    mov    byte    [Odd],    0
    mov    bx,    3
    mul    bx
    mov    bx,    2
    div    bx
    cmp    dx,    0
    jz    Label_Even
    mov    byte    [Odd],    1

Label_Even:

    xor    dx,    dx
    mov    bx,    [BPB_BytesPerSec]
    div    bx
    push    dx
    mov    bx,    8000h
    add    ax,    SectorNumOfFAT1Start
    mov    cl,    2
    call    Func_ReadOneSector
    
    pop    dx
    add    bx,    dx
    mov    ax,    [es:bx]
    cmp    byte    [Odd],    1
    jnz    Label_Even_2
    shr    ax,    4

Label_Even_2:
    and    ax,    0fffh
    pop    bx
    pop    es
    ret

以上是我在阅读《一个64位操作系统的设计与实现》时存在问题的部分,问题如下:
1.请问为何要将FAT表项乘以3除以2,即为何要扩大1.5倍
2.偏移位置如何计算?
3.后面的奇偶项错位问题为什么会出现?对于汇编写的处理方法不是很理解
4.此程序将写入软盘用于引导操作系统启动,FAT12文件系统应该由操作系统解析,这里还没有操作系统,那FAT表,根目录区这些结构是由谁建立并解析呀?
5.对于这两页的汇编代码还有这个模块的算法思路不是很理解,能否详细解释下,非常感谢!

你好,这些问题,如果不明白,可以反复多去阅读分析的。
比如第一个问题:因为你这个系统的文件系统格式是FAT12的,意味着每个FAT项占12bit,这也所被成为FAT12的原因。而我们计算机每个字节是8bit的,因此在寻址时,是需要1.5倍去换算的。