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

Assembly int 0x13的函数0x42基于堆栈的实现存在问题,assembly,x86,interrupt,bootloader,mbr,Assembly,X86,Interrupt,Bootloader,Mbr,我正在尝试一种新的int0x13方法(只是为了进一步了解系统的工作方式):使用堆栈创建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 mo

我正在尝试一种新的int0x13方法(只是为了进一步了解系统的工作方式):使用堆栈创建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 推送DWORD 0x00000000 添加ax,0x0008 mov-si,ax 推送双字[ds:(si)] 推送DWORD 0x00007c00 推送字0x0001 推送字0x0010 推送ss 流行音乐 mov si,sp 英国石油公司 mov-ah,0x42 int 0x13 如您所见:我将dap结构推到堆栈上,更新DS:SI以指向它,DL已经设置,然后将AX设置为0x42并调用int 0x13

结果是AH和CF集合中出现错误0x01。没有部门被转移。 我没完没了地检查了堆栈跟踪,一切正常,分区表也正常。。我不知道我错过了什么

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

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) 0x000079ea:100 adc%al、(%bx、%si) 0x000079ec:01 00添加%ax,(%bx,%si) 0x000079ee:00 7c 00添加%bh,0x0(%si) 0x000079f1:00添加%al,(%bx,%si) 0x000079f3:08 00或%al,(%bx,%si) 0x000079f5:00添加%al、(%bx、%si) 0x000079f7:00添加%al、(%bx、%si) 0x000079f9:00 a0 07将添加%ah,-0x41f9(%bx,%si)
我正在使用qemu的最新版本,并尝试从硬盘(0x80)读取数据,还尝试了结构的4字节对齐,结果相同(CF 1 AH 0x01),存在扩展。

是否确保支持INT 13扩展

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

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)初始状态:2)按下DAP后:
|(东西)| |(东西)|

+-----------+当然是的,正如我在问题末尾所说的,扩展是存在的。bp点正好在DAP之前。。我想你明白了,我在调用int 0x13后检查了堆栈,DAP结构完全错误,但我不知道为什么,那一刻。。