我尝试一种新的方法为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