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
syscallA 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
retOutras Sequências de Limpeza Comuns:
| Sequência | Ação |
|---|---|
ESC[J | Limpa do cursor até o final da tela. |
ESC[0J | Igual a ESC[J. |
ESC[1J | Limpa do início da tela até o cursor. |
ESC[2J | Limpa a tela inteira. |
ESC[K | Limpa do cursor até o final da linha. |
ESC[0K | Igual a ESC[K. |
ESC[1K | Limpa do início da linha até o cursor. |
ESC[2K | Limpa 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
retPrimeiro, 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ência | Ação |
|---|---|
ESC[H | Move o cursor para o canto superior esquerdo (0,0). |
ESC[{L};{C}H ou f | Move o cursor para a linha L, coluna C. |
ESC[#A | Move o cursor # linhas para cima. |
ESC[#B | Move o cursor # linhas para baixo. |
ESC[#C | Move o cursor # colunas para a direita. |
ESC[#D | Move o cursor # colunas para a esquerda. |
ESC[7 | Salva a posição atual do cursor. |
ESC[8 | Restaura 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.