Assemblage - Modes d'adressage
La plupart des instructions en langage d'assemblage nécessitent le traitement d'opérandes. Une adresse d'opérande fournit l'emplacement où les données à traiter sont stockées. Certaines instructions ne nécessitent pas d'opérande, tandis que d'autres instructions peuvent nécessiter un, deux ou trois opérandes.
Lorsqu'une instruction nécessite deux opérandes, le premier opérande est généralement la destination, qui contient des données dans un registre ou un emplacement mémoire et le second opérande est la source. La source contient soit les données à livrer (adressage immédiat), soit l'adresse (en registre ou en mémoire) des données. En règle générale, les données source restent inchangées après l'opération.
Les trois modes d'adressage de base sont:
- Inscription adressage
- Adressage immédiat
- Adressage mémoire
Inscription adressage
Dans ce mode d'adressage, un registre contient l'opérande. En fonction de l'instruction, le registre peut être le premier opérande, le deuxième opérande ou les deux.
Par exemple,
MOV DX, TAX_RATE ; Register in first operand
MOV COUNT, CX ; Register in second operand
MOV EAX, EBX ; Both the operands are in registers
Comme le traitement des données entre les registres n'implique pas de mémoire, il permet un traitement des données le plus rapide.
Adressage immédiat
Un opérande immédiat a une valeur constante ou une expression. Lorsqu'une instruction avec deux opérandes utilise un adressage immédiat, le premier opérande peut être un registre ou un emplacement mémoire, et le second opérande est une constante immédiate. Le premier opérande définit la longueur des données.
Par exemple,
BYTE_VALUE DB 150 ; A byte value is defined
WORD_VALUE DW 300 ; A word value is defined
ADD BYTE_VALUE, 65 ; An immediate operand 65 is added
MOV AX, 45H ; Immediate constant 45H is transferred to AX
Adressage direct de la mémoire
Lorsque des opérandes sont spécifiés en mode d'adressage mémoire, un accès direct à la mémoire principale, généralement au segment de données, est requis. Cette façon d'adresser entraîne un traitement plus lent des données. Pour localiser l'emplacement exact des données en mémoire, nous avons besoin de l'adresse de début du segment, qui se trouve généralement dans le registre DS et d'une valeur de décalage. Cette valeur de décalage est également appeléeeffective address.
En mode d'adressage direct, la valeur de décalage est spécifiée directement dans le cadre de l'instruction, généralement indiquée par le nom de la variable. L'assembleur calcule la valeur de décalage et gère une table de symboles, qui stocke les valeurs de décalage de toutes les variables utilisées dans le programme.
Dans l'adressage direct en mémoire, l'un des opérandes fait référence à un emplacement mémoire et l'autre opérande fait référence à un registre.
Par exemple,
ADD BYTE_VALUE, DL ; Adds the register in the memory location
MOV BX, WORD_VALUE ; Operand from the memory is added to register
Adressage par décalage direct
Ce mode d'adressage utilise les opérateurs arithmétiques pour modifier une adresse. Par exemple, regardez les définitions suivantes qui définissent les tables de données -
BYTE_TABLE DB 14, 15, 22, 45 ; Tables of bytes
WORD_TABLE DW 134, 345, 564, 123 ; Tables of words
Les opérations suivantes permettent d'accéder aux données des tables de la mémoire dans les registres -
MOV CL, BYTE_TABLE[2] ; Gets the 3rd element of the BYTE_TABLE
MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3] ; Gets the 4th element of the WORD_TABLE
MOV CX, WORD_TABLE + 3 ; Gets the 4th element of the WORD_TABLE
Adressage mémoire indirect
Ce mode d'adressage utilise la capacité de l'ordinateur d' adressage Segment: Offset . Généralement, les registres de base EBX, EBP (ou BX, BP) et les registres d'index (DI, SI), codés entre crochets pour les références mémoire, sont utilisés à cet effet.
L'adressage indirect est généralement utilisé pour les variables contenant plusieurs éléments comme les tableaux. L'adresse de départ du tableau est stockée, par exemple, dans le registre EBX.
L'extrait de code suivant montre comment accéder à différents éléments de la variable.
MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
L'instruction MOV
Nous avons déjà utilisé l'instruction MOV qui est utilisée pour déplacer des données d'un espace de stockage à un autre. L'instruction MOV prend deux opérandes.
Syntaxe
La syntaxe de l'instruction MOV est -
MOV destination, source
L'instruction MOV peut avoir l'une des cinq formes suivantes:
MOV register, register
MOV register, immediate
MOV memory, immediate
MOV register, memory
MOV memory, register
Veuillez noter que -
- Les deux opérandes en fonctionnement MOV doivent être de la même taille
- La valeur de l'opérande source reste inchangée
L'instruction MOV provoque parfois une ambiguïté. Par exemple, regardez les déclarations -
MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX
MOV [EBX], 110 ; MY_TABLE[0] = 110
Il n'est pas clair si vous souhaitez déplacer un octet équivalent ou un équivalent mot du nombre 110. Dans de tels cas, il est sage d'utiliser un type specifier.
Le tableau suivant montre certains des spécificateurs de type courants -
Spécificateur de type | Octets adressés |
---|---|
OCTET | 1 |
MOT | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | dix |
Exemple
Le programme suivant illustre certains des concepts décrits ci-dessus. Il stocke un nom «Zara Ali» dans la section de données de la mémoire, puis change sa valeur en un autre nom «Nuha Ali» par programmation et affiche les deux noms.
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
;writing the name 'Zara Ali'
mov edx,9 ;message length
mov ecx, name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov [name], dword 'Nuha' ; Changed the name to Nuha Ali
;writing the name 'Nuha Ali'
mov edx,8 ;message length
mov ecx,name ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
name db 'Zara Ali '
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -
Zara Ali Nuha Ali