Montagem - Modos de endereçamento

A maioria das instruções em linguagem assembly requer que operandos sejam processados. Um endereço de operando fornece o local onde os dados a serem processados ​​são armazenados. Algumas instruções não exigem um operando, enquanto outras instruções podem exigir um, dois ou três operandos.

Quando uma instrução requer dois operandos, o primeiro operando é geralmente o destino, que contém dados em um registro ou local de memória e o segundo operando é a fonte. A fonte contém os dados a serem entregues (endereçamento imediato) ou o endereço (no registro ou na memória) dos dados. Geralmente, os dados de origem permanecem inalterados após a operação.

Os três modos básicos de endereçamento são -

  • Registrar endereçamento
  • Endereçamento imediato
  • Endereçamento de memória

Registrar Endereçamento

Neste modo de endereçamento, um registro contém o operando. Dependendo da instrução, o registro pode ser o primeiro operando, o segundo operando ou ambos.

Por exemplo,

MOV DX, TAX_RATE   ; Register in first operand
MOV COUNT, CX	   ; Register in second operand
MOV EAX, EBX	   ; Both the operands are in registers

Como o processamento de dados entre registradores não envolve memória, ele fornece um processamento de dados mais rápido.

Endereçamento Imediato

Um operando imediato possui um valor constante ou uma expressão. Quando uma instrução com dois operandos usa endereçamento imediato, o primeiro operando pode ser um registro ou localização na memória e o segundo operando é uma constante imediata. O primeiro operando define o comprimento dos dados.

Por exemplo,

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

Endereçamento Direto de Memória

Quando operandos são especificados no modo de endereçamento de memória, é necessário acesso direto à memória principal, geralmente ao segmento de dados. Essa forma de abordar resulta em um processamento mais lento dos dados. Para localizar a localização exata dos dados na memória, precisamos do endereço inicial do segmento, que normalmente é encontrado no registro DS e um valor de deslocamento. Este valor de deslocamento também é chamadoeffective address.

No modo de endereçamento direto, o valor de deslocamento é especificado diretamente como parte da instrução, geralmente indicado pelo nome da variável. O montador calcula o valor de deslocamento e mantém uma tabela de símbolos, que armazena os valores de deslocamento de todas as variáveis ​​usadas no programa.

No endereçamento de memória direto, um dos operandos se refere a uma localização de memória e o outro operando faz referência a um registrador.

Por exemplo,

ADD	BYTE_VALUE, DL	; Adds the register in the memory location
MOV	BX, WORD_VALUE	; Operand from the memory is added to register

Endereçamento de deslocamento direto

Este modo de endereçamento usa os operadores aritméticos para modificar um endereço. Por exemplo, observe as seguintes definições que definem tabelas de dados -

BYTE_TABLE DB  14, 15, 22, 45      ; Tables of bytes
WORD_TABLE DW  134, 345, 564, 123  ; Tables of words

As seguintes operações acessam dados das tabelas na memória em registros -

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

Endereçamento de memória indireta

Este modo de endereçamento utiliza a capacidade do computador de Segmento: Endereçamento de deslocamento . Geralmente, os registradores base EBX, EBP (ou BX, BP) e os registradores de índice (DI, SI), codificados entre colchetes para referências de memória, são usados ​​para esse propósito.

O endereçamento indireto é geralmente usado para variáveis ​​contendo vários elementos, como arrays. O endereço inicial do array é armazenado, digamos, no registrador EBX.

O fragmento de código a seguir mostra como acessar diferentes elementos da variável.

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

A Instrução MOV

Já usamos a instrução MOV que é usada para mover dados de um espaço de armazenamento para outro. A instrução MOV leva dois operandos.

Sintaxe

A sintaxe da instrução MOV é -

MOV  destination, source

A instrução MOV pode ter uma das seguintes cinco formas -

MOV  register, register
MOV  register, immediate
MOV  memory, immediate
MOV  register, memory
MOV  memory, register

Observe que -

  • Ambos os operandos em operação MOV devem ser do mesmo tamanho
  • O valor do operando de origem permanece inalterado

A instrução MOV às vezes causa ambigüidade. Por exemplo, veja as declarações -

MOV  EBX, [MY_TABLE]  ; Effective Address of MY_TABLE in EBX
MOV  [EBX], 110	      ; MY_TABLE[0] = 110

Não está claro se você deseja mover um equivalente de byte ou equivalente de palavra do número 110. Nesses casos, é aconselhável usar um type specifier.

A tabela a seguir mostra alguns dos especificadores de tipo comuns -

Especificador de Tipo Bytes endereçados
BYTE 1
PALAVRA 2
DWORD 4
QWORD 8
TBYTE 10

Exemplo

O programa a seguir ilustra alguns dos conceitos discutidos acima. Ele armazena um nome 'Zara Ali' na seção de dados da memória e, em seguida, altera seu valor para outro nome 'Nuha Ali' programaticamente e exibe ambos os nomes.

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 '

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Zara Ali Nuha Ali