Atualizado: 09/11/2025

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

Estruturas e Macros STRUC / ENDSTRUC em Assembly NASM

O NASM oferece os macros STRUC e ENDSTRUC para simplificar a definição e o uso de estruturas em Assembly. Com eles, é possível criar modelos reutilizáveis de dados, evitando cálculos manuais de deslocamento (offset) e erros de alinhamento.

Em geral, o trabalho com estruturas no NASM segue três etapas:

  1. Definir o modelo com STRUC e ENDSTRUC.
  2. Alocar memória (criar instâncias) nas seções .data ou .bss.
  3. Acessar os campos somando o endereço base com o deslocamento de cada campo.

Definição de um Modelo de Estrutura

A sintaxe básica é a seguinte:

struc nome_estrutura
    campo1:  tipo1  tamanho1
    campo2:  tipo2  tamanho2
    ...
    campoN:  tipoN  tamanhoN
endstruc
  • O primeiro parâmetro de STRUC é o nome da estrutura.
  • O segundo (opcional) define um deslocamento base.
  • O bloco entre STRUC e ENDSTRUC lista os campos, cada um com nome, tipo e tamanho.
  • Os tipos são definidos com diretivas de reserva como resb, resw, resd etc.

Esses macros não alocam memória, apenas definem offsets e o tamanho total da estrutura. O NASM também cria automaticamente a constante <nome>_size contendo o tamanho total em bytes.

Exemplo:

struc person
    .id:   resd 1    ; 4 bytes
    .name: resb 20   ; 20 bytes
    .age:  resw 1    ; 2 bytes
endstruc

O NASM gerará automaticamente:

CampoOffset (bytes)
person.id0
person.name4
person.age24
person_size26

Criação de Instâncias

Após definir o modelo, é possível criar instâncias não inicializadas (em .bss) ou inicializadas (em .data).

Instância Não Inicializada (.bss)

section .bss
person1: resb person_size
person2: resb person_size

Cada instância ocupa 26 bytes.


Instância Inicializada (.data)

Para inicializar campos, usa-se o conjunto de macros ISTRUC, AT e IEND:

section .data
tom:
    istruc person
        at person.id,   dd 101
        at person.name, db "Tom", 0
        at person.age,  dw 2
    iend

Os campos devem seguir a mesma ordem definida em STRUC.


Acesso aos Campos da Estrutura

O acesso ocorre somando o endereço base ao deslocamento do campo. Exemplo com a estrutura tom:

mov eax, [tom + person.id]    ; EAX = 101
mov bx,  [tom + person.age]   ; BX = 2
lea esi, [tom + person.name]  ; endereço da string "Tom"

E exemplo com instância não inicializada:

mov byte  [person1 + person.name], 'A'
mov dword [person1 + person.id], 102

Exemplo Completo (Linux x86-64)

global _start

; Definição do tipo person
struc person
    .id:   resd 1
    .name: resb 20
    .age:  resw 1
endstruc

section .data
tom:
    istruc person
        at person.id,   dd 101
        at person.name, db "Tom", 10
        at person.age,  dw 41
    iend

section .text
_start:
    mov rsi, tom + person.name
    mov rdi, 1
    mov rdx, person.age - person.name
    mov rax, 1
    syscall

    mov rdi, [tom + person.age]
    mov rax, 60
    syscall

Compilação e Execução

programicio@pc:~$ nasm -f elf64 estrutura.asm -o estrutura.o
programicio@pc:~$ ld estrutura.o -o estrutura
programicio@pc:~$ ./estrutura
Tom
programicio@pc:~$ echo $?
41

A execução imprime o nome Tom no terminal e retorna 41, o valor armazenado no campo age.


Resumo

  • STRUC e ENDSTRUC definem o modelo da estrutura.
  • ISTRUC, AT e IEND inicializam instâncias em .data.
  • resb, resw, resd, resq definem o tamanho de cada campo.
  • O NASM gera automaticamente <nome>_size com o tamanho total.
  • Acessos são feitos com [base + deslocamento].
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