2010-06-17 85 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