2012-12-15 52 views
1

問題夫婦意味着什麼這一段:鑑於MBR彙編代碼,堆棧是如何工作的?對MBR

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

在絃樂器操作上找到了不錯的導師:http://www.csc.depauw.edu/~bhoward/asmtut/asmtut7.html 但是隻是說'MOVSW'減少CX相對於'MOVSB'(它顯示爲不)。有趣的是,MOVSB如何通過一個字符串循環 – Xsi

+0

早期的字符串:'每條指令在一個元素上工作,然後自動調整SI和/或DI'。問題還是(不)和?如果這是正確的 - 只有一個索引章是變化(在什麼特定情況下) – Xsi

+0

http://olivier.poudade.free.fr/arc/MICROSOFT.WINDOWS.95.MBR.ASM.TXT – Xsi

回答

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而不是push/pop。兩個版本的開銷都是2字節(例如,MOV ES,AX的2字節與PUSH AX的1字節加上POP ES的另一個字節),所以差異是無關緊要的(當你只有512字節的時候,代碼大小是最重要的,他們必須在最後分區表和魔術簽名)。

+0

':7C0F FC CLD清楚directionx :7C10 BF0006 MOV DI,0600 DI現在0600 :7C13 B90001 MOV CX,0100移動256瓦特(512 B) :7C16 F2 REPNZ從0000移動MBR:7c00 :7C17 A5 MOVSW到0000:0600 :7C18 EA1D060000 JMP 0000:061D JMP到NEW_LOCATION ' http://www.nondot.org/sabre/os/files/Booting/mbr.txt - 模型MBR,(如果沒有,我會比較其中的幾十個來找到模型,初始或標準的)。對不起,不提供作者的來源。 – Xsi

+0

我認爲這個問題得到了解答。 – Xsi

1

ES通過本身在0000不指向:7c00,由於ES是16位。這些評論應該說的是DS:SIES:SI都指向0000:7c00。

這是因爲DSES都被設置爲0,通過推AX(其中包含0),然後彈出段寄存器。由於SI的值爲7c00,因此您將指向0000:7c00的DS:SIES:SI(實模式下的絕對地址爲segment * 0x10 + offset)。

+0

它可能是與堆棧被認爲是最快的,這就是爲什麼push/pop是頻繁的優先選項(我記得AFAIK) – Xsi

+1

我不知道爲什麼作者在這種情況下使用'PUSH/POP'而不是'MOV'來修改段寄存器。有用的一種情況是你想爲段寄存器賦值一個立即值,而你在GPR中沒有這個值(比如'AX')。因爲'MOV segreg,immed'不是一個有效的指令,所以你使用'PUSH immed''' POP segreg'來代替。 – Michael