2016-09-13 2 views
0

J'essaye d'écrire le code assembler dans mbr pour employer des ISR de BIOS. Je vous écris le code suivant à la mbr, attendant le caractère « ABCD » à imprimer à l'écran:pourquoi ce code en mode réel fonctionne dans la machine virtuelle mais ne fonctionne pas sur ma machine réelle?

mov ah,0x0e 
mov bp,0x8000 
mov sp,bp 

push 'A' 
push 'B' 
push 'C' 
push 'D' 

mov al, [0x7ffe] 
int 0x10 

mov al, [0x7ffc] 
int 0x10 

mov al, [0x7ffa] 
int 0x10 

mov al, [0x7ff8] 
int 0x10 

; infinite loop 
jmp $ 

; padding 0s and set the magic number to make it bootable 
times 510 -($ - $$) db 0  
dw 0xaa55 

ce code fonctionne bien sur le simulateur de Bochs ou qemu, mais quand j'écris mon vrai disque et de l'utilisation pour démarrer, rien n'est imprimé. J'ai testé pour définir directement le registre% al en caractères, et il s'imprime bien. J'utilise un processeur AMD PhenomII 955, tout ce que j'ai mal fait?

+2

Initialisez les registres de segment avec quelque chose comme 'xor ax, ax'' mov ss, ax' 'mov ds, ax'. L'instruction 'mov al, [...]' utilise 'ds' tandis que' push ... 'utilise' ss'. Assurez-vous qu'ils sont égaux. –

+0

@MargaretBloom Ça marche! Je vous remercie ! s'il vous plaît postez comme une réponse, alors je peux marquer cette question comme une réponse. –

Répondre

3

Réinitialisez les registres de segment avec quelque chose comme

xor ax, ax  ;Initialize seg regs with 0 
mov ss, ax 
mov ds, ax 

L'instruction mov al, [...] utilise ds tandis que push ... utilise ss.
Assurez-vous qu'ils sont égaux.


Je ne mentionne pas, mais comme Michael à juste titre noté, vous devez être prudent lors de la mise à jour SS.
La paire SS:SP doit être mise à jour atomiquement par rapport aux interruptions, sinon une interruption déclenchée à mi-chemin de l'initialisation utilisera une paire SS:SP pas entièrement valide.

La meilleure façon de le faire est en mettant à jour spjuste après l'initialisation de ss

mov bp, 0x8000 
mov ss, ax 
mov sp, bp 

beacuse la CPU inhibe les interruptions de l'instruction après tout mov ss, ....
Sinon, vous pouvez explicitement envelopper le code d'initialisation dans une paire clisti.

+2

Étant donné que l'OP ne désactive pas explicitement les interruptions (en théorie, le BIOS pourrait les laisser actives avant de sauter dans le code du secteur d'amorçage), pensez-vous qu'il est sage de mettre à jour _SS_ sans modifier _SP_? Je ferais probablement explicitement cela en mettant à jour _SS: SP_ que vous mettez à jour _SS_ et puis _SP_ juste après (Update à _SS_ et les interruptions sont désactivées jusqu'à la fin de l'instruction suivante) ou utilisez simplement _CLI_ pour les désactiver pour le durée du code de démarrage. –

+0

@MichaelPetch Vous avez absolument raison. Je suis en train de mettre à jour la réponse. –