给定MBR汇编代码,堆栈如何工作?关于MBR的几个问题

时间:2012-12-15 07:21:36

标签: assembly

这段是什么意思:

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

2 个答案:

答案 0 :(得分:1)

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

这是因为DSES都通过按AX(在该点包含0)设置为0,然后弹出段寄存器。由于SI的值为7c00,因此DS:SIES:SI都指向0000:7c00(实模式中的绝对地址为segment * 0x10 + offset)。

答案 1 :(得分: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加载OS的引导扇区并且不能覆盖自身,因此必须首先重新定位。

我不知道为什么他们没有使用MOV ES,AXMOV DS,AX而不是push / pop。两个版本的成本都是2个字节(例如MOV ES,AX为2个字节,PUSH AX为1个字节加POP ES的另一个字节)因此差异无关紧要(代码大小是最重要的你只能使用512个字节,其中66个必须是分区表和魔术签名。