11
votes

Comment charger un noyau de disque avec BIOS INT 13H dans l'assemblage NASM?

J'ai été coincé avec cela pendant des semaines maintenant et je n'ai aucune idée où je me trompe parce que Nasm ne m'a pas donné d'erreurs. Le code est assez explicite à cause des commentaires.

Ceci est le code chargé à partir du BIOS P>

 ;--------------------------------------------
 ; 'load.asm'
 ; loaded from 'boot.asm'

 [org 0x8000]
 [bits 16]

 ;--------------------------------------------

 main:
  mov ah, 0x0E  ; print function
  mov al, '.'   ; ascii char
  int 0x10   ; IO int

  jmp $    ; hang


2 commentaires

S'il vous plaît, correct si je me trompe, mais peut-être que ce sera une meilleure approche si au lieu de JMP $ vous faites cli pour effacer les interruptions suivies de HLT < / code> pour arrêter la CPU. De cette façon, vous évitez de consommer beaucoup de temps de la CPU.


Gaz de travail minimal Exemple: github.com/cirosanttilli/x86 -bare-métal-exemples / blob / ...


5 Réponses :


2
votes

Je ne suis pas sûr de ce que vous essayez de réaliser avec le code, mais si je le comprends correctement, vous souhaitez lire quelques secteurs du disque dans l'emplacement 0x8000, puis exécuter ce code?

Si tel est le cas, alors vous devrez expliquer expliquer un appel / sauter à cet emplacement particulier. Le BIOS n'appellera pas ce code pour vous. Au démarrage, une fois le BIOS initialisé, il définira l'adresse IP du pointeur d'instructions sur l'adresse 0x7C00. La CPU commencera ensuite à exécuter le code séquentiellement, donc sans JMP / appel à 0x8000, il n'exécutera pas le code à 0x8000 jusqu'à ce qu'il ait exécuté toutes les adresses de mémoire entre 0x7C00 à 0x8000, etc.

La solution serait donc d'avoir une instruction JMP ou d'appel après votre JC ReadDisk.

Si ma compréhension est incorrecte, je m'excuse. J'espère que cela aide.


3 commentaires

Le JMP est après le JC ReadDisk: JMP [ES: BX] Où ES: BX est le tampon de code


Désolé j'ai manqué celui-là. Juste une chose, en regardant votre code. Êtes-vous sûr que votre fichier charger.asm est au secteur 2?


Oui, j'utilise dd pour Win32 et c'est sur le secteur après le démarrage



1
votes

Je ne sais pas si vous utilisez une disquette pour démarrer votre système d'exploitation, mais si vous utilisez, je vous suggère de déclarer certaines choses après la déclaration d'org et de bits, jetez un coup d'œil (ils sont très importants):

JMP short main   ; Jump past disk description section
NOP              ; Pad out before disk description

; ------------------------------------------------------------------
; Disk description table, to make it a valid floppy
; Note: some of these values are hard-coded in the source!
; Values are those used by IBM for 1.44 MB, 3.5 diskette

OEMLabel            db "BERL OS"    ; Disk label - 8 chars
BytesPerSector      dw 512          ; Bytes per sector
SectorsPerCluster   db 1            ; Sectors per cluster
ReservedForBoot     dw 1            ; Reserved sectors for boot record
NumberOfFats        db 2            ; Number of copies of the FAT
RootDirEntries      dw 224          ; Number of entries in root dir
LogicalSectors      dw 2880         ; Number of logical sectors
MediumByte          db 0F0h         ; Medium descriptor byte
SectorsPerFat       dw 9            ; Sectors per FAT
SectorsPerTrack     dw 18           ; Sectors per track (36/cylinder)
Sides               dw 2            ; Number of sides/heads
HiddenSectors       dd 0            ; Number of hidden sectors
LargeSectors        dd 0            ; Number of LBA sectors
DriveNo             dw 0            ; Drive No: 0
Signature           db 41           ; Drive signature: 41 for floppy
VolumeID            dd 00000000h    ; Volume ID: any number
VolumeLabel         db "BERL OS"    ; Volume Label: any 11 chars
FileSystem          db "FAT12"      ; File system type: don't change!

; End of the disk description table
; ------------------------------------------------------------------


2 commentaires

Cela n'a pas d'importance. C'est pour les systèmes de fichiers et le BIOS


Ok, maintenant je connais l'idée principale. Salutations



2
votes

Un gotcha avec INT13 est que la tête et les numéros de piste commencent à 0, mais les numéros sectoriels pour une raison quelconque commencent à 1. Vous pouvez vérifier que votre utilitaire de rédaction sectorielle est conforme à ce schéma de numérotation.

questions:

  • Combien de points voyez-vous lorsque vous démarrez?
  • Le moteur de la disquette sur la disquette?

1 commentaires

Oui, j'ai vérifié ça et ce n'est pas ça. De plus, j'utilise un émulateur (Win32 QEMU) afin que le moteur à la disquette ne soit pas lancé.



7
votes

JMP [ES: BX] ne passe pas à l'adresse ES: BX . Cette commande fait un saut près de l'adresse stockée dans le mot à ES: bx . C'est pourquoi beaucoup d'assembleurs plus anciens vous ont fait épeler ce type d'instruction comme JMP Word PTR [ES: BX] ou même JMP près de PTR [ES: BX] ; Il est plus clair de cette façon ce qui va se passer. Ce que vous voulez probablement ici, c'est un coup de distance à un emplacement fixe: xxx

si vous souhaitez passer à ES: bx , utiliser repor : xxx


3 commentaires

Cela ressemble à la bonne chose, mais je ne peux pas le faire travailler. Toute liens vers des tutoriels / docs?


Non: s, cela fonctionne. Juste j'ai utilisé un ".Img" au lieu de "A:". Je vais devoir changer ça.


Pourquoi ne pas juste faire directement "JMP 0x0000: 0x8000" dans NASM à la place? C'est plus lisible.



0
votes

Je ne sais pas pourquoi le code ne fonctionne pas, car je ne peux pas vérifier l'environnement entier (disque, vidage mémoire, etc.) ... Mais ce que je peux dire, c'est ... Le code est faux . Vous chargez le deuxième programme, pas au 0x8000 (c'était le point d'utiliser 0rg 0x8000 non?), Mais à 0x80000 .

La raison étant, vous utilisez le segment: Décalage de l'adressage dans le mauvais sens, L'adresse 0x8000: 0x0000 est résolue à l'adresse linéaire 0x80000 , car La valeur de segment est déplacée à gauche par 4 bits A puis ajouté au décalage.

Pour résoudre ce problème, vous devez jeter un coup d'œil à une mémoire de mémoire et voir si Le programme fonctionne comme vous l'attendez trop .... Soit cela ou vous chargez le Mauvais secteurs du disque.


0 commentaires