我嘗試一種新的方法爲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),擴展存在。
bp點恰好在DAP之前..我想你明白了,我在調用int 0x13後檢查了堆棧,並且DAP結構完全錯誤,但是我沒有弄清楚爲什麼,那一刻.. – AlQafir 2010-06-20 00:03:57