Atualizado: 20/11/2025

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

Manipulação do Console e do Cursor com Sequências de Escape em Assembly NASM

A maioria dos sistemas operacionais modernos suporta um conjunto especial de sequências de caracteres, conhecidas como sequências de escape (escape sequences), que são interpretadas pelo terminal de forma especial em vez de serem simplesmente impressas. Essas sequências nos permitem executar ações como limpar a tela, mover o cursor e alterar as cores do texto.

A maioria dessas sequências segue o padrão ANSI e começa com o caractere ESC (código ASCII 27), seguido por [.

Limpando a Tela

Podemos limpar a tela do console enviando a sequência de escape correta. O programa a seguir para Linux demonstra essa ação.

global _start

section .data
    clear    db 27, "[2J" ; A sequência <ESC>[2J
    clearlen equ $-clear

section .text
_start:
    ; Limpa o console
    mov rax, 1          ; syscall write
    mov rdi, 1          ; stdout
    mov rsi, clear      ; Endereço da sequência
    mov rdx, clearlen   ; Tamanho da sequência
    syscall

    mov rax, 60
    syscall

A string clear começa com o byte de valor 27, que corresponde à tecla ESC. A parte seguinte, [2J, é o comando que o terminal interpreta como "limpar a tela inteira". Ao "imprimir" essa string, o terminal executa a ação em vez de exibir os caracteres.

A seguir, a versão análoga do programa para Windows.

global _start

extern WriteFile
extern GetStdHandle

section .data
    clear    db 27, "[2J"
    clearlen equ $-clear

section .text
_start:
    sub  rsp, 40
    mov  rcx, -11
    call GetStdHandle
    mov  rcx, rax
    mov  rdx, clear
    mov  r8d, clearlen
    xor  r9, r9
    mov  qword [rsp + 32], 0
    call WriteFile
    add  rsp, 40
    ret

Outras Sequências de Limpeza Comuns:

SequênciaAção
ESC[JLimpa do cursor até o final da tela.
ESC[0JIgual a ESC[J.
ESC[1JLimpa do início da tela até o cursor.
ESC[2JLimpa a tela inteira.
ESC[KLimpa do cursor até o final da linha.
ESC[0KIgual a ESC[K.
ESC[1KLimpa do início da linha até o cursor.
ESC[2KLimpa a linha inteira.

Controle do Cursor

As sequências de escape também nos permitem posicionar o cursor em qualquer lugar no console. A sequência ESC[{linha};{coluna}H move o cursor para a linha e coluna especificadas.

O programa a seguir para Linux primeiro limpa a tela e depois imprime uma mensagem na linha 2, coluna 20.

global _start

section .data
    clear    db 27, "[2J"
    clearlen equ $-clear
    pos      db 27, "[02;20H"  ; Move o cursor para a linha 2, coluna 20
    poslen   equ $-pos
    msg      db "Hello programicio.com", 10
    msglen   equ $-msg

section .text
_start:
    ; Limpa a tela
    mov rsi, clear
    mov rdx, clearlen
    call writeConsole

    ; Posiciona o cursor
    mov rsi, pos
    mov rdx, poslen
    call writeConsole

    ; Imprime a mensagem na nova posição
    mov rsi, msg
    mov rdx, msglen
    call writeConsole

    mov rax, 60
    syscall

; Função auxiliar para escrever no console
; Parâmetros: RSI (endereço), RDX (tamanho)
writeConsole:
    mov rax, 1
    mov rdi, 1
    syscall
    ret

Primeiro, enviamos a sequência de limpeza. Em seguida, enviamos a sequência de posicionamento ESC[02;20H, que move o cursor. Finalmente, imprimimos a mensagem, que aparecerá na nova posição do cursor.

Outras Sequências de Controle do Cursor:

SequênciaAção
ESC[HMove o cursor para o canto superior esquerdo (0,0).
ESC[{L};{C}H ou fMove o cursor para a linha L, coluna C.
ESC[#AMove o cursor # linhas para cima.
ESC[#BMove o cursor # linhas para baixo.
ESC[#CMove o cursor # colunas para a direita.
ESC[#DMove o cursor # colunas para a esquerda.
ESC[7Salva a posição atual do cursor.
ESC[8Restaura a posição do cursor salva anteriormente.

Resumo

  • Sequências de escape ANSI são comandos especiais que, quando enviados para o terminal, executam ações em vez de serem impressos.
  • Elas geralmente começam com o caractere ESC (ASCII 27) seguido por [.
  • É possível usar essas sequências para limpar a tela (total ou parcialmente) com comandos como ESC[2J.
  • Também é possível controlar a posição do cursor com comandos como ESC[{linha};{coluna}H.
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