какие самописные asm не соответствуют bochs - PullRequest
1 голос
/ 07 мая 2020

Спросите, какие самокомпиляция и бохи несовместимы? Я хочу что-то прочитать с дискеты, произошла ошибка.

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, я получил неверный результат.

1 Ответ

2 голосов
/ 07 мая 2020

Похоже, что что-то хранит как минимум 4 байта нулей в конце этой инструкции и начале следующей по адресу 00010200. Обратите внимание, что команда next в дизассемблировании - это add byte ptr ds:[bx+si], al ; 0000, которая также не соответствует вашему исходному файлу или objdump.

Установите точку наблюдения в BOCHS, чтобы увидеть, какие инструкции перезаписывают байты вашего кода перед выполнением достигает их.

Или на самом деле оказывается, что ничего никогда не писало туда, даже ваш сектор-загрузчик, из-за ошибки смещения в вашем загрузчике первой стадии. И BOCHS оставил эту память инициализированной на 00. (См. Комментарии @ MichaelPetch; вся его заслуга за отладку этого для вас.)


BTW, objdump имеет режим -Mintel, поэтому вы можете заставить его использовать тот же синтаксис, что и BOCHS и ваш источник.

...