1

这一段是什么意思:

MOV     SI,SP
PUSH    AX
POP     ES

ES 如何获得 0000:7c00(以及进一步的 DS)

在这个 MBR 模型中?

0000:7C00 FA            CLI                     disable int's
0000:7C01 33C0          XOR     AX,AX           set stack seg to 0000
0000:7C03 8ED0          MOV     SS,AX
0000:7C05 BC007C        MOV     SP,7C00         set stack ptr to 7c00
0000:7C08 8BF4          MOV     SI,SP           SI now 7c00
0000:7C0A 50            PUSH    AX
0000:7C0B 07            POP     ES              ES now 0000:7c00
0000:7C0C 50            PUSH    AX
0000:7C0D 1F            POP     DS              DS now 0000:7c00
0000:7C0E FB            STI                     allow int's
0000:7C0F FC            CLD                     clear direction
0000:7C10 BF0006        MOV     DI,0600         DI now 0600

我发布它就像一些特殊情况(或未记录的过程) - 在中断 CLI / STI 之前和之后,被阻止。

/upd 源添加:http ://www.nondot.org/sabre/os/files/Booting/mbr.txt

4

2 回答 2

1

ES它本身并不指向 0000:7c00,因为 ES 是 16 位的。这些评论应该说的是,DS:SI两者ES:SI都指向 0000:7c00。

这是因为DSES都通过推入AX(此时包含 0)设置为 0,然后弹出段寄存器。由于SI给出了值 7c00,您将同时拥有DS:SIES:SI指向 0000:7c00(实模式下的绝对地址是segment * 0x10 + offset)。

于 2012-12-15T07:42:29.947 回答
1

这是我对代码的解释:

0000:7C00 FA        CLI               disable int's
0000:7C01 33C0      XOR     AX,AX     AX = 0x0000
0000:7C03 8ED0      MOV     SS,AX     SS = 0x0000
0000:7C05 BC007C    MOV     SP,7C00   SS:SP = 0x0000:0x7C00
0000:7C08 8BF4      MOV     SI,SP     SI = 0x7C00
0000:7C0A 50        PUSH    AX
0000:7C0B 07        POP     ES        ES = 0x0000
0000:7C0C 50        PUSH    AX
0000:7C0D 1F        POP     DS        DS = 0x0000
0000:7C0E FB        STI               allow int's
0000:7C0F FC        CLD               clear direction
0000:7C10 BF0006    MOV     DI,0600   DI = 0x0600

                    MOV CX,0100       CX = 0x0100
                    REP MOVSW         Copy 256 words (512 bytes)
                                        from 0x0000:0x7C00 to
                                        0x0000:0x0600
                    JMP ??            Jump to relocated code

我编了最后3条指令;但我几乎可以保证这就是实际的 MBR 所做的。这样做的原因是 MBR 通常在 0x7C00 加载操作系统的引导扇区并且不能覆盖自己,因此必须首先重新定位自己。

我不知道他们为什么不使用MOV ES,AXMOV DS,AX不是推/弹出。两个版本都花费 2 个字节(例如 2 个字节MOV ES,AX与 1 个字节PUSH AX加上另一个字节POP ES),因此差异无关紧要(当您只有 512 个字节可用且其中 66 个必须是时,代码大小是最重要的最后的分区表和魔术签名)。

于 2012-12-15T09:05:33.067 回答