2015-04-03 10 views
0

В настоящее время я играю с asm и низкоуровневыми материалами, такими как печатные символы на экране без ОС, только через вызовы прерывания BIOS.вывод lodsb на 2 разных машинах с 2 различными результатами

мой код работает с QEMU (seabios), но когда я пишу загрузочный сектор USB, я получаю две разные результаты на двух разных машинах

Следующий код просто вызывает прерывание BIOS (0х10), чтобы распечатать строка (соответственно символов в цикле) с функцией tty-вывода (0x0e).

Работает на qemu и на моем ноутбуке (выход на экране: «12341234567»). однако, когда я использую мой рабочий стол, вывод на экране ... ничего. Я просто получаю черный экран с мигающим _ (похоже, это происходит от функции TTY, и он только не печатает никаких символов)

некоторую информацию о своих системах:

эмуляция с «qemu- система-x86_64/DEV/SDB»на моем ноутбуке

ноутбуков: Intel Atom N270 (32-разрядные, Phoenix Bios)

настольных ПК: x6 1090T AMD Phenom II (64-бит, AMI Bios v1. 17)

[org 0x7c00] 

mov bp, 0xffff ; set stack location 
mov sp, bp 

mov ax, cs ; store cs in ds 
mov ds, as 

cld 
mov si, MSG_TEST 
call prnt 

jmp $ ; prevent cpu from executing arbitrary bytes after this stuff aka hang 

prnt: 
    push ax 
    push bx 
    push si 

    mov bh, 0 
    _test_loop: 
    lodsb 
    cmp al, 0 
    je _test_end 

    mov ah, 0x0e 
    int 0x10 
    jmp _test_loop 

_test_end: 
    pop si 
    pop bx 
    pop ax 
    ret 

MSG_TEST db "12341234567", 0 

times 510 - ($-$$) db 0 ; pad out (512 bytes) 
dw 0xaa55 ; magic number bootable 

Я не думаю, что эта проблема имеет какое-то отношение к совместимости с 32/64 бит, поскольку на этом этапе я все еще в 16-битном режиме.

+0

'мы ца, как' опечатки? должен быть 'mov ds, ax' –

+0

[link] (http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface)« 64-разрядная реализация прошивки UEFI может загружать только 64-разрядный загрузчик или ядро ​​операционной системы UEFI. Для обратной совместимости большинство программных средств UEFI на машинах класса ПК также поддерживают загрузку в устаревшем режиме BIOS из дисков с разделением MBR через модуль поддержки совместимости (CSM), который обеспечивает совместимость с устаревшим BIOS. В этом случае загрузка выполняется в так же, как на устаревших системах на базе BIOS, игнорируя таблицу разделов и полагаясь на содержимое загрузочного сектора ». –

ответ

1

Вариант 1.
Функция 0x0e требует наличия активной страницы режима видео в регистре BH. По умолчанию это 0. mov bh, 0 до _test_loop: должен решить проблему.
Вариант 2.
BIOS загружает загрузочный код по адресу 0x07c0: 0 вместо 0: 0x7c00. В этом случае сегменты данных и кода должны отличаться. DS: SI просто указывает на неправильное место
Вариант 3.
ПК загружается в графическом режиме, в этом случае BL должен содержать цвет символов: mov bx, 7
Вариант 4
Stack проблема выравнивания: 0xffff является плохим смещением , Это должно быть ровно. Например, 0xfffe.
Вариант 5
этап сегмент проблема. ss должен быть инициализирован, слишком

Что происходит, если вы пытаетесь

org 0x7c00 

    xor cx, cx 
    mov ss, cx 
    mov sp, 0x7bfe 
    mov ds, cx 
    mov es, cx 
    mov si, text 
    call print 
    jmp $ 

print: 
    ; 
    ; display null-terminated ascii string in teletype mode 
    ; at current cursor position 
    ; 
    ; input: 
    ; ds:si  - pointer to string 
    ; 
    mov bh, 0 
    mov ah, 0x0e 
    lodsb 
    test al, al 
    jz short $+6 
    int 0x10 
    jmp short $-7 
    ret 
+0

оно не разрешило проблему.У меня такие же эффекты (эмулятор/ноутбук работает, но не на ПК). Отредактировав мой пост с вашими предложениями, я также добавлю bx в стек и вытащу его сразу после mov bh, 0 на всякий случай, если – user3469811

+0

обновлен с другими возможными вариантами. –

+0

нормально, это хороший ввод, я проверю его. спасибо – user3469811