Assembly int 0x13的函数0x42基于堆栈的实现存在问题
我正在尝试一种新的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)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
我正在使用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结构完全错误,但我不知道为什么,那一刻。。