基于堆栈的int 0x13函数0x42的实现问题

时间:2010-06-17 21:41:17

标签: assembly x86 interrupt bootloader mbr

我正在尝试使用int 0x13的新方法(只是为了更多地了解系统的工作方式):使用堆栈创建DAP ..

假设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

结果是AH中的错误0x01,显然是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)读取,也尝试使用4字节对齐结构具有相同的结果(CF 1 AH 0x01),扩展名存在。

2 个答案:

答案 0 :(得分:2)

mov sp, bp做什么 - BP在哪里指出?它是在上面的代码片段之前(或接近)SP吗?

我的猜测是你正在重置堆栈指针,使得DAP被INT 13调用的堆栈使用损坏。 e.g:

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       +-----------+

答案 1 :(得分:0)

您确定支持INT 13扩展吗?

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