Complément du cours d’assembleur 1 2004-2005 COMPLEMENT DU COURS D’ASSEMBLEUR I
Complément du cours d’assembleur 1 2004-2005 COMPLEMENT DU COURS D’ASSEMBLEUR I.LA MEMOIRE VIVE 1.La segmentation de la mémoire Votre PC est conçu pour gérer 1 Mo (soit 220 octets) de mémoire vive en mode réel. Il faut donc 20 bits au minimum pour adresser toute la mémoire. Or en mode réel les bus d'adresses n’ont que 16 bits. Ils permettent donc d'adresser 216 = 65536 octets = 64 Ko, ce qui est insuffisant ! Afin de pallier ce manque, on utilise deux nombres pour adresser un octet quelconque de la RAM. Le premier est appelé adresse de segment, le second adresse d'offset. Ils seront stockés séparément. La mémoire est découpée en segments de 64 Ko chacun. Un segment est donc en quelque sorte un gros bloc de mémoire auquel on peut accéder grâce à une adresse de segment qui désigne son numéro. Par exemple, le premier segment est le segment 0000 (en hexa), le deuxième est le 0001, le quarante-deuxième est le 0029, etc... Chaque numéro est codé sur 16 bits, c’est-à-dire 4 chiffres hexa. Pour accéder à un octet particulier dans un segment, il suffit de compter le décalage de cet octet par rapport au début du segment. Ce décalage est obligatoirement inférieur ou égal à 65535 : il tient bien sur 16 bits lui aussi. On appelle ce décalage « offset ». L'adresse d'un octet se note XXXX:YYYY où XXXX est l'adresse de segment et YYYY est l'offset (tous deux en notation hexadécimale, bien sûr). Par exemple, le dix-septième octet de la RAM (le numéro 16) est situé à l'adresse 0000:0010. De même, l’octet 0000:0100 est l'octet numéro 256. Nous en arrivons à la petite subtilité qu’il convient de bien saisir, sous peine de ne rien comprendre à certains programmes en assembleur. On pourrait penser que l’octet qui se trouve à l’adresse 0001:0000 est le numéro 65536. Il n’en est rien. C'est l'octet numéro 16. Les segments ne sont pas situés gentiment les uns à la suite des autres. Ils n'attendent pas que les segments qui les précédent soient terminés avant de commencer ! Ils se marchent donc sur les pieds. Autrement dit, le deuxième segment ne démarre pas à l'octet 65536 comme il devrait le faire s'il était bien sage, mais à l'octet 16 ! Le troisième démarre à l'octet 32 et ainsi de suite… La notion de segment n’est pas tant physique que mathématique : elle sert à se repérer dans la RAM. Complément du cours d’assembleur 2 2004-2005 La conséquence immédiate de tout cela est qu'un octet n'a pas une adresse unique. Par exemple, l'octet numéro 66 peut être adressé par 0000:0042, mais aussi par 0001:0032, par 0002:0022, par 0003:0012 ou encore par 0004:0002. Toutes ces adresses sont équivalentes. on calcule l'adresse effective d'un octet, c'est à dire sa position absolue dans la RAM. Voici la solution : si l'adresse de l'octet est A17C:022E, alors son adresse effective est A17C x 16 + 022E, soit A17C0 + 022E = A19EE. On a multiplié par 16, car le segment A17C débute à l’octet A17C x 16, puis on a simplement ajouté le décalage. Au final, on a bien une adresse sur 20 bits puisqu'on obtient 5 chiffres hexa. Chaque petit bloc de 16 octets s’appelle un paragraphe. Remarque importante : Il est souvent plus simple de considérer qu’un segment est un bloc de taille quelconque qui débute à une adresse effective multiple de 16 et qui permet, à l’aide de son adresse de segment et d’un offset, d’adresser le bloc entier (64 Ko au maximum). Cette définition est celle qui a le plus de sens. 2. Structure d’un programme en mémoire Lorsque l’utilisateur exécute un programme, celui-ci est d’abord chargé en mémoire par le système. Le DOS distingue deux modèles de programmes exécutables : les fichiers COM et les fichiers EXE. La différence fondamentale est que les programmes COM ne peuvent pas utiliser plus d’un segment dans la mémoire. Leur taille est ainsi limitée à 64 Ko. Les programmes EXE ne sont quant à eux limités que par la mémoire disponible dans l’ordinateur. Complément du cours d’assembleur 3 2004-2005 a) les fichiers COM Lorsqu’il charge un fichier COM, le DOS lui alloue toute la mémoire disponible. Si celle-ci est insuffisante, il le signale à l’utilisateur par un message et annule toute la procédure d’exécution. Dans le cas contraire, il crée le PSP du programme au début du bloc de mémoire réservé, et copie le programme à charger à la suite. Mais qu’est-ce donc qu’un PSP ? Pour simplifier, le PSP (« Program Segment Prefix ») est une zone de 256 (= 100h) octets qui contient des informations diverses au sujet du programme. C’est dans le PSP que se trouve la ligne de commande tapée par l’utilisateur. Voici à titre indicatif la structure simplifiée du PSP (ne vous souciez pas de ce que vous ne comprenez pas : pour l'instant, seules les deux dernières lignes nous intéressent vraiment) : Offset Description Taille (octets) 00h Appel de l'int 20h 2 02h Adresse du 1er segment qui se trouve au delà du prog. 2 04h Réservé 1 05h Far call de l'int 21h (inutilisé) 5 0Ah Vecteur de l'int 22h 4 0Eh Vecteur de l'int 23h 4 12h Vecteur de l'int 24h 4 16h Réservé 22 2Ch Segment du bloc d'environnement 2 2Eh Réservé 82 80h Nombre de caractères dans la ligne de commande sans compter le code ASCII 13 (retour chariot) 1 81h Ligne de commande (à partir du caractère espace qui suit le nom du programme) + code ASCII 13 127 A présent que nous connaissons l’existence du PSP, il nous faut revenir sur un point important. Comme nous l’avons dit, un programme COM ne peut comporter qu’un seul segment, bien que le DOS lui réserve la totalité de la mémoire disponible. Ceci a deux conséquences. La première est que les adresses de segment sont inutiles dans le programme : les offsets seuls permettent d’adresser n’importe quel octet du segment. La seconde est que le PSP fait partie de ce segment, ce qui limite à 64 Ko – 256 octets la taille maximale d’un fichier COM. Cela implique également que le programme lui-même débute à l’offset 100h et non à l’offset 0h. Complément du cours d’assembleur 4 2004-2005 Exemple de fichier COM Voici un petit programme COM qui écrit le message « Bonjour, monde ! » à l’écran. Ce code source commence par des directives. Une directive est une information que le programmeur fournit au compilateur. Elle n’est pas transformée en une instruction en langage machine. Elle n’ajoute donc aucun octet au programme compilé. La directive “.386“ indique au compilateur que le programme est destiné à tourner sur des processeurs INTEL de modèle 386 (ou supérieur). Cela nous autorise à utiliser certaines instructions qui ne sont pas disponibles sur les modèles antérieurs, comme PUSHA ou POPA. Dans cet exemple, cette directive aurait très bien pu être omise. La ligne code segment use16 sert à déclarer un segment que l’on appelle “code”. On aurait tout aussi bien pu le nommer “marteau” ou “voiture”. Ce sera le segment de notre programme. N’oubliez pas qu’un fichier COM ne peut comporter qu’un seul segment. Cette ligne ne sera pas compilée : elle ne sert qu’à indiquer au compilateur le début d’un segment. Le mot “use16” indique que les adresses de segment et d’offset sont codées sur 16 bits et non sur 8 bits. Vous devez systématiquement l’écrire. La directive Complément du cours d’assembleur 5 2004-2005 assume cs:code, ds:code, ss:code informe le compilateur que tout au long du programme, CS, DS et SS pointeront de façon privilégiée vers le segment “code”, ce qui est évident d’ailleurs puisque c’est le seul segment… Vous comprendrez le sens exact de “assume” dans la troisième partie du cours. Enfin, les mots org 100h signifient qu’il faudra ajouter 100h (soit 256) à tous les offsets. Pourquoi ? Souvenez-vous de la structure d’un programme COM en mémoire. Si vous n’écrivez pas cette ligne, TASM considérera que le programme débute à l’offset 0000. Or, lors de l’exécution, le DOS le chargera après le PSP, c’est-à-dire à l’adresse 100h. C’est pourquoi il est nécessaire de recalculer les offsets : l’offset 0000 deviendra 0100. Cette directive est en quelque sorte le trait caractéristique des fichiers COM. Nous en arrivons au programme proprement dit. Il commence par un label : debut : Lui non plus n’est pas compilé. Il ne sert qu’à représenter l’adresse de l’instruction qui le suit, c’est-à-dire : mov ah, 09h Cette ligne demande au processeur de charger la valeur 9 dans le registre AH. C’est le numéro de la fonction de l’interruption 21h qui écrit une chaîne de caractères à l’écran. L’offset de cette chaîne est attendu dans DX. D’où la ligne suivante : mov dx, offset message Le mot-clé “offset” sert à extraire l’offset du label “message” qui représente quant à lui l’adresse du message à écrire (il contient donc une adresse de segment ET un offset). L’adresse de segment de la chaîne doit être transmise dans uploads/S4/ assemb-complement.pdf
Documents similaires










-
25
-
0
-
0
Licence et utilisation
Gratuit pour un usage personnel Attribution requise- Détails
- Publié le Jan 03, 2023
- Catégorie Law / Droit
- Langue French
- Taille du fichier 2.5986MB