2011-11-15 1 views
10

Je suivais ce tutoriel comme une première incursion dans le développement bootloader/OS pour x86 en utilisant MSNA:x86 MSNA directive « org » signifie

http://joelgompert.com/OS/TableOfContents.htm

Et je suis sur la leçon 4, ce qui fait mon bootloader affiche la chaîne "Hello, world". Je ne comprends pas la signification de l'instruction org (directive?). Si je comprends bien, org définit où le programme en cours d'exécution est chargé en mémoire. Ceci est nécessaire lors de l'utilisation de toute sorte d'étiquettes ou d'adresses relatives dans le programme.

Supposons que j'ai une chaîne définie par une étiquette comme celui-ci dans mon programme:

szHello db 'Hello, world!', 0 

Et je puis essayer plus tard à la référence cette étiquette comme celui-ci (seulement des extraits pertinents):

org 0x7c00 
xor ax, ax 
mov ds, 0 
... 
mov si, szHello 
lodsb 
... 
int 0x10 ; Print first character of szHello 

Ma question est la suivante: pourquoi cela n'est-il pas équivalent? :

org 0 
mov ds, 0x7c00 
... 
mov si, szHello 
lodsb 
... 
int 0x10 

Lorsque je cours le premier exemple, ma chaîne apparaît correctement. Le deuxième exemple ne fonctionne pas.

Les pointeurs vers la documentation pertinente seraient également grandement appréciés, si le problème est un problème conceptuel de ma part.

Répondre

8

0000: 7C00 n'est pas équivalent à 7C00: 0000. La partie de segment est comptée en paragraphes, pas en octets. Essayez ceci:

mov ax, 0x7c0 
mov ds, ax 
+0

Excellent, ça marche, merci. Cependant, je ne suis pas sûr de bien comprendre. Est-ce que 'org' consomme une adresse de segment, ou un décalage dans un segment? –

+1

C'est un décalage dans le segment actuel. –

+0

'mov ds, 0x7c0' n'est pas une instruction valide. Peut-être que vous voulez dire quelque chose comme "mov ax, 0x7c0'' mov ds, ax' –

13

org définit où le programme en question ATTEND à charger dans la mémoire. Ce n'est pas là où il est réellement chargé - c'est contrôlé par celui qui fait le chargement - mais où il s'attend à être chargé.

+0

Intéressant. Qu'arrive-t-il à mon programme s'il est chargé ailleurs? Et puis, pourquoi 'org' existe-t-il du tout? –

+0

Si elle est chargée ailleurs, les décalages calculés par l'assembleur (comme l'adresse de l'étiquette szHello) seront erronés et ce qui se passe ensuite est une conjecture. –

+1

Dit sous une autre forme: les adresses absolues seront fausses. – ninjalj

Questions connexes