2015-04-03 2 views
0

Je suis en train de jouer avec asm et des trucs de bas niveau comme imprimer des caractères sur l'écran sans OS, juste via des appels d'interruption bios.Sortie lodsb sur 2 machines différentes avec 2 résultats différents

mon code fonctionne avec qemu (seabios), mais quand j'écris mon bootsector à l'USB, je reçois deux résultats différents sur deux machines différentes

Le code suivant appelle simplement l'interruption du bios (0x10) pour imprimer un chaîne (resp. caractères dans une boucle) avec la fonction tty-output (0x0e).

Fonctionne sur qemu et sur mon ordinateur portable (sortie sur l'écran: "12341234567"). Cependant, quand j'utilise mon ordinateur de bureau, la sortie sur l'écran est ... rien. Je reçois juste un écran noir avec un clignotant _ (on dirait qu'il vient de la fonction TTY, et seulement n'a pas imprimer des caractères)

Quelques informations sur mes systèmes:

Emulation avec « qemu- système x86_64/dev/sdb » sur mon ordinateur portable

portable: Intel Atom N270 (32 bits, Phoenix Bios)

Desktop-PC: AMD Phenom II x6 1090T (64 bits, 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 

Je ne pense pas que ce problème a quelque chose à voir avec la compatibilité 32/64 bits puisque dans cette étape, je suis toujours en mode réel 16 bits.

+0

'mov ds, as' une faute de frappe? "mov ds, ax" –

+0

[link] (http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface) "Une implémentation de microprogramme UEFI 64 bits ne peut charger qu'un chargeur de démarrage ou un noyau de système d'exploitation UEFI 64 bits. Pour des raisons de compatibilité ascendante, la plupart des implémentations du microprogramme UEFI sur les machines de classe PC prennent également en charge le démarrage en mode BIOS hérité des disques partitionnés par MBR, via le module CSM (Compatibility Support Module) qui assure la compatibilité BIOS héritée. de la même manière que sur les systèmes basés sur le BIOS hérités, en ignorant la table de partition et en s'appuyant sur le contenu d'un secteur de démarrage. " –

Répondre

1

Option 1.
La fonction 0x0e requiert une page de mode vidéo active dans le registre BH. Par défaut, il est 0. mov bh, 0 avant _test_loop: devrait résoudre le problème.
Option 2.
Le BIOS charge le code de démarrage à l'adresse 0x07c0: 0 au lieu de 0: 0x7c00. Dans ce cas, les segments de données et de codes doivent différer. ds: si juste des points à mauvais endroit
Option 3.
PC démarre en mode graphique, dans ce cas BL doit contenir la couleur des caractères: mov bx, 7
Option 4
question d'alignement de la pile: 0xffff est un mauvais décalage . Ça devrait être pair. Par exemple, 0xfffe.
Option 5
problème de segment de pile. ss doit être initialisé, trop

Qu'est-ce qui se passe si vous essayez

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

cela n'a pas résolu le problème.J'ai les mêmes effets (émulateur/ordinateur portable fonctionnant, mais pas sur pc). Edited mon poste avec vos suggestions, et je pousse également bx sur la pile et le retirer, juste après mov bh, 0 juste au cas où – user3469811

+0

mis à jour avec d'autres options possibles. –

+0

ok, c'est une bonne entrée, je vais le tester. Merci pour l'instant – user3469811