2

我正在尝试一种新方法来处理 int 0x13(只是为了了解有关系统工作方式的更多信息):使用堆栈创建 DAP ..

假设 DL 包含磁盘号,AX 包含 PT 中可引导条目的地址,DS 更新到正确的段并正确设置堆栈,这是代码:

推送 DWORD 0x00000000
添加斧头,0x0008
mov si, ax
推 DWORD [ds:(si)]
推送 DWORD 0x00007c00
推 WORD 0x0001
推 WORD 0x0010
推 ss
流行音乐
mov si, sp
mov sp, bp
移动啊,0x42
整数 0x13

如您所见:我将 dap 结构压入堆栈,更新 DS:SI 以指向它,DL 已设置,然后将 AX 设置为 0x42 并调用 int 0x13

结果是 AH 中的错误 0x01 和明显的 CF 设置。没有扇区被转移。我没完没了地检查堆栈跟踪,没关系,分区表也没问题..我不知道我错过了什么......

这是磁盘地址包的堆栈跟踪部分:

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

我正在使用 qemu 最新版本并尝试从硬盘驱动器(0x80)读取,还尝试对具有相同结果的结构进行 4 字节对齐(CF 1 AH 0x01),存在扩展。

4

2 回答 2

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       +-----------+
于 2010-06-19T16:55:58.817 回答
0

您是否确保支持 INT 13 扩展?

MOV AH, 41H
MOV BX, 55AAH          
MOV DL, 80H                ; drive number
INT 13H
JC Unsupported
于 2010-06-19T16:43:27.247 回答