Atualizado: 18/10/2025

Este conteúdo é original e não foi gerado por inteligência artificial.

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_CONSTANTE

O 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
    syscall

Aqui, 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
    syscall

O 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 1

Cá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
    syscall

Essas 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
    syscall

A 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
    ret

Constantes 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
    syscall

Aqui, 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
    ret

Resumo

  • As constantes representam valores imutáveis definidos durante a montagem.
  • A diretiva EQU associa 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.
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com