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