2010-11-04 6 views
1

Ceci est un paragraphe de la série de développement du système d'exploitation broken thorn. Il y a 3 lignes de code. Il faudra 512 octets pour charger jusqu'à la deuxième ligne et 514 octets jusqu'à la troisième ligne. Comment pouvons-nous calculer cela? Si possible, veuillez me donner un lien où je peux le lire en détail. Merci d'avance.Comment calculer la mémoire requise pour un code d'assemblage?

En langage d'assemblage, nous pouvons très facilement dépasser la marque de 512 octets en . Donc, le code pourrait sembler très bien, mais seulement une partie de celui-ci sera dans la mémoire . Par exemple, coinsider ceci:

mov ax, 4ch 
inc bx ; 512 byte 
mov [var], bx ; 514 byte 

Dans le langage de l'Assemblée, l'exécution commence par le haut du fichier vers le bas. Cependant, rappelez-vous que, lors du chargement de fichiers en mémoire, , nous sommes secteurs de chargement. Chacun de ces secteurs est de 512 octets, de sorte que copie 512 octets du fichier dans la mémoire .

Si le code ci-dessus a été exécuté, et seul le premier secteur a été chargé en mémoire, il ne copier jusqu'à 512 octets (L'instruction inc bx ). Ainsi, alors que la dernière instruction mov est toujours sur le disque, elle n'est pas en mémoire !. Que fera le processeur après inc bx alors? Il continuera continuer sur l'octet 514. Comme ce n'était pas en mémoire, il va exécuter après la fin de notre fichier! Le résultat final ? Un accident.

Répondre

5

Cet exemple est source de confusion. Ces deux premières instructions ne prennent que quelques octets. L'auteur supposait que inc bx est tombé sur le 512ème octet. En général, vous devez assembler le code pour savoir quelle sera sa taille avec x86, car les opcodes ont des longueurs différentes (à partir de 1 environ 7 octets [*]). Vous pouvez placer une étiquette avant et après votre code et soustraire les pour savoir comment il est grand.

Dans d'autres architectures (comme PowerPC, par exemple), chaque instruction a la même taille, et vous pouvez simplement les compter et multiplier par 4 et être très proche.

[*] Je me attends plusieurs réponses un autre avec upping longues instructions x86 préfixés ...

+0

Merci, j'ai compris. – narayanpatra

0

code écrit en langage assembleur est transformé en instructions du processeur qui sont interprétées par la CPU. Selon la spécification Itel x86, les instructions peuvent être de longueur variable.

Je ne sais pas si cette réponse est tout à fait CORRCT, mais il coutures plausible que la mémoire requise représenterait la taille totale en octets de toutes les instructions de montage, ainsi que toutes les données chargées par l'application

3

Le L'article concerne le bootloader. Lorsque vous écrivez le code pour un boot sector (et sa taille est de 512 octets), vous devez faire attention à utiliser au plus 512 octets (510, pour être exact, car 2 derniers octets sont utilisés comme signature).

EDIT: ces 3 instructions ont 3, 1 et 3 (ou 2?) Octets. Il expliquait le cas où ce code commence déjà à grand offset.

La manière habituelle de calculer la taille du code consiste à prendre la différence entre deux étiquettes autour d'un bloc de code.

+0

Que je sais. Ma question porte sur la façon dont il a calculé 512 octets et 514 octets? – narayanpatra

+0

Merci pour l'explication. – narayanpatra

Questions connexes