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
5 Réponses :
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? P>
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. P>
La solution serait donc d'avoir une instruction JMP ou d'appel après votre JC ReadDisk. p>
Si ma compréhension est incorrecte, je m'excuse. J'espère que cela aide. P>
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
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 ; ------------------------------------------------------------------
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
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. P>
questions: p>
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é.
si vous souhaitez passer à JMP [ES: BX] code> ne passe pas à l'adresse
ES: BX code>. Cette commande fait un saut près de l'adresse stockée dans le mot à
ES: bx code>. C'est pourquoi beaucoup d'assembleurs plus anciens vous ont fait épeler ce type d'instruction comme
JMP Word PTR [ES: BX] CODE> ou même
JMP près de PTR [ES: BX] code>; 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:
ES: bx code>, utiliser
repor Code>: p>
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.
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 La raison étant, vous utilisez le segment: Décalage de l'adressage dans le mauvais sens,
L'adresse 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. P> 0x8000 code> (c'était le point d'utiliser
0rg 0x8000 code> non?), Mais à
0x80000 code>. p>
0x8000: 0x0000 code> est résolue à l'adresse linéaire
0x80000 code>, car
La valeur de segment est déplacée à gauche par 4 bits A puis ajouté au décalage. P>
S'il vous plaît, correct si je me trompe, mais peut-être que ce sera une meilleure approche si au lieu de
JMP $ code> vous faites
cli code> 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 / ...