我正在尝试使用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),扩展名存在。
答案 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