Constantes em Assembly NASM
Diferentemente das variáveis, as constantes representam valores imutáveis.
O assembler NASM permite defini-las de duas formas, sendo a mais comum o uso da diretiva EQU.
Diretiva EQU
A diretiva EQU define constantes que são substituídas pelo seu valor durante a montagem do programa.
A sintaxe geral é:
NOME_DA_CONSTANTE equ VALOR_DA_CONSTANTEO nome da constante deve ser descritivo, indicando claramente seu propósito. O valor pode ser um número literal ou uma expressão que resulte em um número.
Exemplo:
global _start
const1 equ 1
const2 equ 2
const3 equ 3
section .text
_start:
mov rdi, const1 ; RDI = 1
add rdi, const2 ; RDI = RDI + 2 = 3
add rdi, const3 ; RDI = RDI + 3 = 6
mov rax, 60
syscallAqui, três constantes (const1, const2 e const3) são definidas com os valores 1, 2 e 3.
Durante a montagem, o NASM substitui cada nome de constante pelo valor correspondente.
O código acima é, portanto, equivalente a:
global _start
section .text
_start:
mov rdi, 1
add rdi, 2
add rdi, 3
mov rax, 60
syscallO uso de nomes descritivos facilita a leitura e compreensão do código, permitindo identificar facilmente o propósito de cada valor.
Após o nome da constante, pode haver dois pontos (:), mas eles são opcionais:
const1: equ 1Cálculo Dinâmico de Constantes
As constantes também podem ser definidas com base em expressões aritméticas, inclusive usando outras constantes como parte da operação.
Exemplo (Linux):
global _start
first equ 0
second equ first + 8 ; second = 8
third equ second + 8 ; third = 16
section .text
_start:
mov rdi, first ; RDI = 0
add rdi, second ; RDI = 8
add rdi, third ; RDI = 24
mov rax, 60
syscallEssas expressões são resolvidas em tempo de montagem.
Assim, second depende de first, e third depende de second.
O assembler calcula todos os valores antes da execução do programa.
As constantes podem ser usadas em qualquer lugar onde valores numéricos são aceitos, inclusive para endereçamento com deslocamento.
Constantes como Deslocamentos
Exemplo (Linux):
global _start
section .data
nums dq 5, 6, 7
first equ 0
second equ first + 8
third equ second + 8
section .text
_start:
mov rdi, [nums + third] ; RDI = 7
mov rax, 60
syscallA constante third representa o deslocamento do terceiro elemento (16 bytes após o início).
Embora fosse possível escrever [nums + 16], o uso de um nome descritivo torna o código mais legível.
Exemplo equivalente no Windows:
global _start
section .data
nums dq 5, 6, 7
first equ 0
second equ first + 8
third equ second + 8
section .text
_start:
mov rax, qword [rel nums + third] ; RAX = 7
retConstantes Usadas em Variáveis
As constantes também podem ser usadas para definir valores de variáveis.
Exemplo (Linux):
global _start
section .data
num1 dq intSize ; num1 = 4
num2 dq intSize + 4 ; num2 = 8
intSize equ 4
section .text
_start:
mov rdi, [num2] ; RDI = 8
mov rax, 60
syscallAqui, intSize é uma constante com valor 4.
A variável num1 recebe esse valor, enquanto num2 armazena o resultado da expressão intSize + 4.
Exemplo correspondente no Windows:
global _start
section .data
num1 dq intSize ; num1 = 4
num2 dq intSize + 4 ; num2 = 8
intSize equ 4
section .text
_start:
mov rax, qword [rel num2] ; RAX = 8
retResumo
- As constantes representam valores imutáveis definidos durante a montagem.
- A diretiva
EQUassocia um nome a um valor ou expressão. - Podem ser usadas em expressões aritméticas, endereços e variáveis.
- O NASM substitui as constantes por seus valores antes da execução.
- Constantes tornam o código mais legível e reduzem erros de cálculo manual.