什么是自写的asm不匹配bochs

问题描述 投票:0回答:1

问什么自编译和boch不一致?我想从软盘上读取内容,出现错误。

mycode:

Load_FAT:
    and di, 0x0ffe0
    add di, 0x1a # 起始簇号的偏移量26
    mov cx, word ptr es:[di] # cx是起始簇号
    push    cx # 保存簇号, 因为Load_File用到. 空文件的簇号是0, 要处理 # TODO

    mov ax, 0x00
    mov es, ax
    mov bx, 0x8000 # es:bx=>数据缓冲区
    mov ax, word ptr [BPB_RsvdSecCnt] # 待读取的起始LBA扇区号
    mov cx, word ptr [BPB_FATSz16] # 要读入的扇区个数
    call    Func_ReadSectors

objdump disas:

1e9:    83 e7 e0                and    $0xffe0,%di
 1ec:   83 c7 1a                add    $0x1a,%di
 1ef:   26 8b 0d                mov    %es:(%di),%cx
 1f2:   51                      push   %cx
 1f3:   b8 00 00                mov    $0x0,%ax
 1f6:   8e c0                   mov    %ax,%es
 1f8:   bb 00 80                mov    $0x8000,%bx
 1fb:   a1 44 00                mov    0x44,%ax
 1fe:   8b 0e 4c 00             mov    0x4c,%cx
 202:   e8 7c ff                call   0x181

bochs disas:

# memory start from 0x10000
000101e9: (                    ): and di, 0xffe0            ; 83e7e0
000101ec: (                    ): add di, 0x001a            ; 83c71a
000101ef: (                    ): mov cx, word ptr es:[di]  ; 268b0d
000101f2: (                    ): push cx                   ; 51
000101f3: (                    ): mov ax, 0x0000            ; b80000
000101f6: (                    ): mov es, ax                ; 8ec0
000101f8: (                    ): mov bx, 0x8000            ; bb0080
000101fb: (                    ): mov ax, word ptr ds:0x44  ; a14400
000101fe: (                    ): mov cx, word ptr ds:0x0   ; 8b0e0000
00010202: (                    ): add byte ptr ds:[bx+si], al ; 0000
00010204: (                    ): add byte ptr ds:[si], cl  ; 004c00
00010207: (                    ): call .-132                ; e87cff

因为bochs运行mov cx, word ptr ds:0x0,我得到了错误的结果。

assembly x86-16 bootloader gas bochs
1个回答
2
投票

看起来好像在该指令的末尾和下一条指令的开始处在地址00010200处至少存储了4个字节的零。请注意,反汇编中的next指令为add byte ptr ds:[bx+si], al ; 0000,它也与您的源代码或objdump不匹配。

在BOCHS中设置一个观察点,以查看哪些指令在执行之前覆盖了您的代码字节。

或者实际上结果是nothing从未写过,甚至没有写过扇区加载器,因为第一级引导加载器中存在偏移错误。 BOCHS将该内存初始化为00。 (请参阅@MichaelPetch的注释;所有对他进行调试的功劳都归功于他。)


BTW,objdump具有-Mintel模式,因此您可以使其使用与BOCHS和源相同的语法。

© www.soinside.com 2019 - 2024. All rights reserved.