В настоящее время я играл с asm и низкоуровневыми вещами, такими как печать символов на экране без ОС, просто через вызовы прерывания BIOS.
мой код работает с qemu (seabios), но когда я записываю свой загрузочный сектор на usb, я получаю два разных результата на двух разных машинах
Следующий код просто вызывает прерывание BIOS (0x10), чтобы распечатать строку (соответственно символы в цикле) с функцией tty-output (0x0e).
Работает на qemu и на моем ноутбуке (вывод на экран: «12341234567»). однако, когда я использую свой настольный компьютер, вывод на экран ... ничего. Я просто получаю черный экран с мигающим знаком _ (похоже, он исходит от функции tty, и только он не печатал никаких символов)
Некоторая информация о моих системах:
Эмуляция с "qemu-system-x86_64 / dev / sdb" на моем ноутбуке
Ноутбук: Intel Atom n270 (32-бит, Phoenix Bios)
Настольный ПК: AMD Phenom II x6 1090t (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-битном реальном режиме.
mov ds, as
опечатка? должно бытьmov ds, ax
- person Alexander Zhak   schedule 03.04.2015