【问题标题】:Problem with stack based implementation of function 0x42 of int 0x13基于堆栈的int 0x13函数0x42实现的问题
【发布时间】:2011-03-05 04:45:14
【问题描述】:

我正在尝试一种新方法来处理 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) 读取,还尝试对具有相同结果 (CF 1 AH 0x01) 的结构进行 4 字节对齐,扩展存在。

【问题讨论】:

    标签: assembly x86 interrupt bootloader mbr


    【解决方案1】:

    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       +-----------+
    

    【讨论】:

    • bp 点正好在 DAP 之前。我想你明白了,我在调用 int 0x13 后检查了堆栈,并且 DAP 结构完全错误,但我不明白为什么,那一刻..
    【解决方案2】:

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

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

    【讨论】:

    • 当然可以,正如我在问题末尾所说的那样,存在扩展。
    猜你喜欢
    • 1970-01-01
    • 2013-03-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-09
    相关资源
    最近更新 更多