Vous dites "démarrer directement dans Windows" donc je suppose que vous utilisez un PC physique. Note à venir à faire: Toujours utiliser un émulateur pour le développement! C'est juste plus facile. J'aime Bochs pour OSDeving parce qu'il a de jolies fonctionnalités de débogage. Maintenant, sur la solution possible.
Il y a beaucoup de BIOS buggés qui cassent les spécifications informelles du PC IBM pour l'adresse de chargement 0x7C00.
Cela peut donner beaucoup de problèmes avec les adresses de mémoire et autres lors de l'assemblage. Alors faites le début ressembler à ceci:
[BITS 16] ;tell the assembler that its a 16 bit code
[ORG 0x7C00] ;this tells the assembler where the code will be loaded at when it runs on your machine. It uses this to compute the absolute addresses of labels and such.
jmp word 0:flush ;#FAR jump so that you set CS to 0. (the first argument is what segment to jump to. The argument(after the `:`) is what offset to jump to)
;# Without the far jmp, CS could be `0x7C0` or something similar, which will means that where the assembler thinks the code is loaded and where your computer loaded the code is different. Which in turn messes up the absolute addresses of labels.
flush: ;#We go to here, but we do it ABSOLUTE. So with this, we can reset the segment and offset of where our code is loaded.
mov BP,0 ;#use BP as a temp register
mov DS,BP ;#can not assign segment registers a literal number. You have to assign to a register first.
mov ES,BP ;#do the same here too
;#without setting DS and ES, they could have been loaded with the old 0x7C0, which would mess up absolute address calculations for data.
Voir, une charge à 0x07C0:0000
et plus la charge (et son considérée comme propre à) à 0x0000:7C00
. C'est la même adresse plate, mais les différents paramètres de segment peuvent vraiment bousiller des adresses mémoire absolues. Donc, nous allons enlever la « magie » de l'assembleur et voir à quoi il ressemble (note que je ne vous garantis adresses être tout à fait correct avec cela. Je ne sais pas la taille de tous les opcodes)
jmp word 0:0x7C04 ;# 0x7C04 is the address of the `flush` label
...
Alors , nous sautons à une adresse absolue.
Maintenant alors.Que se passe-t-il lorsque nous ne faisons pas cela?
prendre ce programme par exemple:
mov ax,[mydata]
hlt
mydata: dw 500 ;#just some data
Ce désassemble à quelque chose comme
mov ax,[0x7C06]
Oh, eh bien, il utilise l'adressage absolu, alors comment pourrait-il aller mal? Eh bien, que si DS est effectivement 0x7C0
? alors au lieu d'obtenir l'assembleur prévu 0:0x7C06
il obtiendra 0x7C0:0x7C06
qui sont pas la même adresse plate.
J'espère que cela vous aide à comprendre. C'est vraiment un sujet compliqué et prend un moment de programmation de bas niveau pour bien comprendre.
Salut, merci pour la réponse. Malheureusement, votre code n'est pas syntaxiquement correct dans NASM. Il me dit qu'il y a une discordance dans la taille de l'opérande (??) sur la ligne commençant par "jmp FAR 0x0000 ...". Encore, merci pour le conseil émulateur merci. – DarkOwl
@Newbie yea ma syntaxe NASM est un peu rouillé essayer 'jmp word 0: begin' – Earlz
Juste installé Bochs et a démarré le code tutoriel original en elle. Le code forme chaque tutoriel fonctionne maintenant! La question est, est-ce mon BIOS phyiscal qui est non standard, ou est-ce le code? (Certainement tous les BIOS compatibles x86 doivent se conformer aux mêmes standards ???) Je vais quand même essayer votre amendement sur le BIOS physique de mon PC. – DarkOwl