这段是什么意思:
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
答案 0 :(得分:1)
ES
本身并不指向0000:7c00,因为ES是16位。这些评论应该说的是DS:SI
和ES:SI
都指向0000:7c00。
这是因为DS
和ES
都通过按AX
(在该点包含0)设置为0,然后弹出段寄存器。由于SI
的值为7c00,因此DS:SI
和ES: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,AX
和MOV DS,AX
而不是push / pop。两个版本的成本都是2个字节(例如MOV ES,AX
为2个字节,PUSH AX
为1个字节加POP ES
的另一个字节)因此差异无关紧要(代码大小是最重要的你只能使用512个字节,其中66个必须是分区表和魔术签名。