Je suis un débutant en langue d'assemblage 8086. Je peux comprendre la logique utilisée dans le programme et écrire moi-même de petits programmes. Mais je veux juste savoir ce que cela fait:
.model small
.stack 300h
Quelle est l'explication de .model small?
J'utilise masm
.
Avec .model tiny
vous obtenez un programme où CS
, DS
et SS
pointent tous vers les mêmes 64 Ko de mémoire. La pile est placée dans la région la plus élevée de ce segment de 64 Ko.
Avec .model small
vous obtenez un programme où CS
pointe vers un segment qui lui est propre, suivi du segment où DS
et SS
pointent. La pile est placée dans la région la plus haute du segment SS
.
La directive .stack 300h
indique à MASM la taille de la pile, afin que MASM puisse vous avertir lorsque le reste du programme (données, bss, tas) se heurterait à la pile.
Dans ces deux modèles, tous les accès aux éléments de données se font à l'aide de pointeurs proches.
Étant donné que 8086 est une architecture 16 bits, il a des difficultés à accéder à plus de 64 Ko de mémoire.
La façon la plus efficace d'utiliser des pointeurs est d'utiliser les registres 16 bits dédiés (comme bx
). Cependant, lorsque votre programme souhaite accéder à plus de 64 Ko, il doit également utiliser des registres de segment (comme es
). Pour permettre les deux façons d'adresser, modèles de mémoire ont été inventés.
Ainsi, la directive .model small
indique à l'assembleur que vous avez l'intention d'utiliser le petit modèle de mémoire - un segment de code, un segment de données et un segment de pile - et les valeurs des registres de segment ne sont jamais modifiées.
Il a les effets suivants:
Vous êtes autorisé à écrire l'instruction retn
(retour d'un sous-programme near
) sous la forme ret
. Parce que l'assembleur sait que tout votre code est dans le même segment, tous vos sous-programmes seront near
(c'est-à-dire ont une adresse 16 bits) et toutes les instructions ret
signifient retn
.
Cela semble idiot et insignifiant? Continuer à lire.
Si votre code est dispersé sur plusieurs fichiers source, vous aurez des instructions call
qui appellent des sous-programmes dont l'assembleur ne sait rien. Lorsque vous utilisez un petit modèle de mémoire, il sait au moins que chaque sous-programme a une adresse 16 bits, et un près opcode d'appel peut être utilisé.
Vous pouvez écrire du code sans déclarer votre modèle de mémoire, mais vous devrez alors call near
au lieu de simplement call
.
Si tous vos fichiers source déclarent .model small
, l'éditeur de liens prendra tous les segments de code et essaiera de les adapter à 64 Ko (de même pour les segments de données). Cela peut échouer si le contenu est trop volumineux.
Les petits programmes d'assemblage ne se soucient généralement pas du modèle de mémoire - un code de 64 Ko est plus que suffisant pour écrire des programmes complexes, sauf si vous utilisez une grande bibliothèque externe. Dans ce cas, .model small
peut signifier "Je m'en fiche de ce modèle de mémoire, utilisez simplement la valeur par défaut".