2010-06-17 13 views
2

我嘗試一種新的方法爲int 0×13(只是爲了更多地瞭解系統的工作方式)的功能的0x42:使用堆棧來創建DAP ..問題與基於棧實現的INT 0×13

假設該DL包含磁盤數量,AX包含PT的啓動項的地址,DS更新爲右段和堆棧設置是否正確,這是代碼:

 
push DWORD 0x00000000 
add ax, 0x0008 
mov si, ax 
push DWORD [ds:(si)] 
push DWORD 0x00007c00 
push WORD 0x0001 
push WORD 0x0010 
push ss 
pop ds 
mov si, sp 
mov sp, bp 
mov ah, 0x42 
int 0x13 

正如你所看到的:我將dap結構推入堆棧,更新DS:SI以指向它,DL已經設置,然後將AX設置爲0x42並且調用int 0x13

結果是錯誤0x01在AH和顯然CF集。沒有行業轉移。 我檢查堆棧跟蹤不休,這是好的,分區表也沒關係。我想不通,我錯過了什麼?

這是磁盤地址包的堆棧跟蹤部分:

 
    0x000079ea: 10 00 adc %al,(%bx,%si) 
    0x000079ec: 01 00 add %ax,(%bx,%si) 
    0x000079ee: 00 7c 00 add %bh,0x0(%si) 
    0x000079f1: 00 00 add %al,(%bx,%si) 
    0x000079f3: 08 00 or  %al,(%bx,%si) 
    0x000079f5: 00 00 add %al,(%bx,%si) 
    0x000079f7: 00 00 add %al,(%bx,%si) 
    0x000079f9: 00 a0 07 be add %ah,-0x41f9(%bx,%si) 

我正在使用qemu最新版本,並試圖從硬盤驅動器(0x80)讀取,也嘗試使用4bytes對齊的結構具有相同的結果(CF 1 AH 0x01),擴展存在。

回答

2

mov sp, bp什麼是 - BP點在哪裏?在上面的代碼片段之前是否在(或接近)SP?

我的猜測是你正在重置堆棧指針,使得你的DAP被INT 13調用的堆棧使用損壞。例如:

1) Initial state:   2) After pushing DAP: 

| (stuff) |    | (stuff) | 
+-----------+ <-SP   +-----------+ <-BP? 
      (== BP?)  |   | 
          | DAP | 
          |   | 
          +-----------+ <-SP 


3) After mov sp, bp   4) INT 13 stack usage corrupts DAP: 

| (stuff) |    | (stuff) | 
+-----------+ <-SP?   +-----------+ SP 
|   |    |XXXXXXXXXXX| | INT 13 uses stack 
| DAP |    |XXXXXXXXXXX| v 
|   |    |corrupt DAP| 
+-----------+ <-DS:SI  +-----------+ 
+0

bp點恰好在DAP之前..我想你明白了,我在調用int 0x13後檢查了堆棧,並且DAP結構完全錯誤,但是我沒有弄清楚爲什麼,那一刻.. – AlQafir 2010-06-20 00:03:57

0

您是否確定支持INT 13擴展?

MOV AH, 41H 
MOV BX, 55AAH   
MOV DL, 80H    ; drive number 
INT 13H 
JC Unsupported 
+0

當然是的,正如我在問題結尾處所說的,擴展名是存在的。 – AlQafir 2010-06-19 23:59:19