Caracteres
Assim como qualquer outro dado, os caracteres em memória são representados por sequências de bits — zeros e uns organizados em uma ordem específica. Na maioria dos sistemas, um caractere ocupa 1 ou 2 bytes, e a conversão entre números e símbolos é feita por meio de tabelas de codificação, como ASCII ou Unicode.
Conversão entre Números e Caracteres
A tabela ASCII (American Standard Code for Information Interchange) é um dos métodos mais simples e difundidos para representar caracteres. Cada símbolo possui um número associado: por exemplo, a letra A corresponde a 65, e a letra B a 66. Os dígitos também possuem códigos próprios — 0 equivale a 48, 1 a 49, e assim por diante. Cada caractere ASCII ocupa 1 byte.
Tabela ASCII Completa
A tabela a seguir mostra todos os códigos decimais, hexadecimais e binários para os caracteres ASCII padrão (0–127).
Símbolos de Controle (0–31)
| DEC | HEX | BIN | Símbolo | Descrição |
|---|---|---|---|---|
| 0 | 00 | 00000000 | NUL | Byte nulo |
| 1 | 01 | 00000001 | SOH | Início de cabeçalho |
| 2 | 02 | 00000010 | STX | Início de texto |
| 3 | 03 | 00000011 | ETX | Fim de texto |
| 4 | 04 | 00000100 | EOT | Fim de transmissão |
| 5 | 05 | 00000101 | ENQ | Pedido |
| 6 | 06 | 00000110 | ACK | Confirmação |
| 7 | 07 | 00000111 | BEL | Sinal / Campainha |
| 8 | 08 | 00001000 | BS | Retrocesso |
| 9 | 09 | 00001001 | HT | Tabulação horizontal |
| 10 | 0A | 00001010 | LF | Nova linha |
| 11 | 0B | 00001011 | VT | Tabulação vertical |
| 12 | 0C | 00001100 | FF | Nova página |
| 13 | 0D | 00001101 | CR | Retorno de carro |
| 14 | 0E | 00001110 | SO | Desligar alternância |
| 15 | 0F | 00001111 | SI | Ligar alternância |
| 16 | 10 | 00010000 | DLE | Controle de enlace |
| 17 | 11 | 00010001 | DC1 | Controle de dispositivo 1 |
| 18 | 12 | 00010010 | DC2 | Controle de dispositivo 2 |
| 19 | 13 | 00010011 | DC3 | Controle de dispositivo 3 |
| 20 | 14 | 00010100 | DC4 | Controle de dispositivo 4 |
| 21 | 15 | 00010101 | NAK | Confirmação negativa |
| 22 | 16 | 00010110 | SYN | Sincronização |
| 23 | 17 | 00010111 | ETB | Fim de bloco de transmissão |
| 24 | 18 | 00011000 | CAN | Cancelamento |
| 25 | 19 | 00011001 | EM | Fim de mídia |
| 26 | 1A | 00011010 | SUB | Substituição |
| 27 | 1B | 00011011 | ESC | Escape |
| 28 | 1C | 00011100 | FS | Separador de arquivo |
| 29 | 1D | 00011101 | GS | Separador de grupo |
| 30 | 1E | 00011110 | RS | Separador de registro |
| 31 | 1F | 00011111 | US | Separador de unidade |
Símbolos Imprimíveis (32–127)
| DEC | HEX | BIN | Símbolo | Descrição |
|---|---|---|---|---|
| 32 | 20 | 00100000 | (espaço) | Espaço |
| 33 | 21 | 00100001 | ! | Exclamação |
| 34 | 22 | 00100010 | " | Aspas duplas |
| 35 | 23 | 00100011 | # | Cerquilha |
| 36 | 24 | 00100100 | $ | Cifrão |
| 37 | 25 | 00100101 | % | Porcentagem |
| 38 | 26 | 00100110 | & | E comercial |
| 39 | 27 | 00100111 | ' | Apóstrofo |
| 40 | 28 | 00101000 | ( | Parêntese esquerdo |
| 41 | 29 | 00101001 | ) | Parêntese direito |
| 42 | 2A | 00101010 | * | Asterisco |
| 43 | 2B | 00101011 | + | Sinal de mais |
| 44 | 2C | 00101100 | , | Vírgula |
| 45 | 2D | 00101101 | - | Hífen |
| 46 | 2E | 00101110 | . | Ponto |
| 47 | 2F | 00101111 | / | Barra |
| 48 | 30 | 00110000 | 0 | Dígito zero |
| 49 | 31 | 00110001 | 1 | Dígito um |
| 50 | 32 | 00110010 | 2 | Dígito dois |
| 51 | 33 | 00110011 | 3 | Dígito três |
| 52 | 34 | 00110100 | 4 | Dígito quatro |
| 53 | 35 | 00110101 | 5 | Dígito cinco |
| 54 | 36 | 00110110 | 6 | Dígito seis |
| 55 | 37 | 00110111 | 7 | Dígito sete |
| 56 | 38 | 00111000 | 8 | Dígito oito |
| 57 | 39 | 00111001 | 9 | Dígito nove |
| 58 | 3A | 00111010 | : | Dois-pontos |
| 59 | 3B | 00111011 | ; | Ponto e vírgula |
| 60 | 3C | 00111100 | < | Menor que |
| 61 | 3D | 00111101 | = | Igual |
| 62 | 3E | 00111110 | > | Maior que |
| 63 | 3F | 00111111 | ? | Interrogação |
| 64 | 40 | 01000000 | @ | Arroba |
| 65 | 41 | 01000001 | A | Letra A |
| 66 | 42 | 01000010 | B | Letra B |
| 67 | 43 | 01000011 | C | Letra C |
| 68 | 44 | 01000100 | D | Letra D |
| 69 | 45 | 01000101 | E | Letra E |
| 70 | 46 | 01000110 | F | Letra F |
| 71 | 47 | 01000111 | G | Letra G |
| 72 | 48 | 01001000 | H | Letra H |
| 73 | 49 | 01001001 | I | Letra I |
| 74 | 4A | 01001010 | J | Letra J |
| 75 | 4B | 01001011 | K | Letra K |
| 76 | 4C | 01001100 | L | Letra L |
| 77 | 4D | 01001101 | M | Letra M |
| 78 | 4E | 01001110 | N | Letra N |
| 79 | 4F | 01001111 | O | Letra O |
| 80 | 50 | 01010000 | P | Letra P |
| 81 | 51 | 01010001 | Q | Letra Q |
| 82 | 52 | 01010010 | R | Letra R |
| 83 | 53 | 01010011 | S | Letra S |
| 84 | 54 | 01010100 | T | Letra T |
| 85 | 55 | 01010101 | U | Letra U |
| 86 | 56 | 01010110 | V | Letra V |
| 87 | 57 | 01010111 | W | Letra W |
| 88 | 58 | 01011000 | X | Letra X |
| 89 | 59 | 01011001 | Y | Letra Y |
| 90 | 5A | 01011010 | Z | Letra Z |
| 91 | 5B | 01011011 | [ | Colchete esquerdo |
| 92 | 5C | 01011100 | \ | Barra invertida |
| 93 | 5D | 01011101 | ] | Colchete direito |
| 94 | 5E | 01011110 | ^ | Circunflexo |
| 95 | 5F | 01011111 | _ | Sublinhado |
| 96 | 60 | 01100000 | ` | Acento grave |
| 97 | 61 | 01100001 | a | Letra a |
| 98 | 62 | 01100010 | b | Letra b |
| 99 | 63 | 01100011 | c | Letra c |
| 100 | 64 | 01100100 | d | Letra d |
| 101 | 65 | 01100101 | e | Letra e |
| 102 | 66 | 01100110 | f | Letra f |
| 103 | 67 | 01100111 | g | Letra g |
| 104 | 68 | 01101000 | h | Letra h |
| 105 | 69 | 01101001 | i | Letra i |
| 106 | 6A | 01101010 | j | Letra j |
| 107 | 6B | 01101011 | k | Letra k |
| 108 | 6C | 01101100 | l | Letra l |
| 109 | 6D | 01101101 | m | Letra m |
| 110 | 6E | 01101110 | n | Letra n |
| 111 | 6F | 01101111 | o | Letra o |
| 112 | 70 | 01110000 | p | Letra p |
| 113 | 71 | 01110001 | q | Letra q |
| 114 | 72 | 01110010 | r | Letra r |
| 115 | 73 | 01110011 | s | Letra s |
| 116 | 74 | 01110100 | t | Letra t |
| 117 | 75 | 01110101 | u | Letra u |
| 118 | 76 | 01110110 | v | Letra v |
| 119 | 77 | 01110111 | w | Letra w |
| 120 | 78 | 01111000 | x | Letra x |
| 121 | 79 | 01111001 | y | Letra y |
| 122 | 7A | 01111010 | z | Letra z |
| 123 | 7B | 01111011 | { | Chave esquerda |
| 124 | 7C | 01111100 | | | Barra vertical |
| 125 | 7D | 01111101 | } | Chave direita |
| 126 | 7E | 01111110 | ~ | Til |
| 127 | 7F | 01111111 | DEL | Delete |
Conversão de Caracteres
A tabela ASCII facilita certas manipulações binárias. Por exemplo, as letras maiúsculas e minúsculas diferem apenas no 6º bit:
A = 01000001 a = 01100001
Para converter minúsculas em maiúsculas, basta limpar o 6º bit; para converter maiúsculas em minúsculas, basta defini-lo.
Isso pode ser feito adicionando ou subtraindo 32 do código do caractere.
Além disso, os códigos dos dígitos começam em 48 (ou 0x30). Assim, para converter entre número e caractere numérico, basta somar ou subtrair 48.
Exemplo: Converter Caractere em Número
Podemos transformar um símbolo ASCII numérico em seu valor binário real com uma operação lógica AND.
Linux:
global _start
section .text
_start:
mov rdi, "2" ; código ASCII de '2' = 50 (00110010)
and rdi, 0xF ; zera o nibble alto (00001111)
mov rax, 60
syscallO valor binário resultante é 00000010, equivalente ao número 2.
A máscara 0x0F (00001111) funciona para todos os dígitos.
Windows:
global _start
section .text
_start:
mov rax, "2"
and rax, 0xF
retExemplo: Converter Número em Caractere
Para o caminho inverso, aplica-se a operação OR com a máscara 0x30:
Linux:
global _start
section .text
_start:
mov rdi, 2 ; número 2 = 00000010
or rdi, 0x30 ; define o nibble alto em 0011 = 00110010
mov rax, 60
syscallO resultado é 50, que corresponde ao caractere “2”.
Windows:
global _start
section .text
_start:
mov rax, 2
or rax, 0x30
retConverter Letras entre Maiúsculas e Minúsculas
Para converter maiúsculas em minúsculas, define-se o 6º bit com OR 0x20:
Linux:
global _start
section .text
_start:
mov rdi, "A" ; código 65 = 01000001
or rdi, 0x20 ; 01000001 + 00100000 = 97 (a)
mov rax, 60
syscallPara o inverso, usa-se AND 0xDF (11011111):
Linux:
global _start
section .text
_start:
mov rdi, "a" ; código 97 = 01100001
and rdi, 0xDF ; 01100001 * 11011111 = 01000001 (A)
mov rax, 60
syscallOutra forma é adicionar ou subtrair 32 do valor ASCII:
global _start
section .text
_start:
mov rdi, "A" ; RDI = 65
add rdi, 32 ; 65 + 32 = 97 (a)
mov rax, 60
syscallResumo
- Cada caractere é armazenado como um número binário correspondente ao seu código ASCII.
- Aspas simples ou duplas podem ser usadas para representar caracteres.
- A diretiva
dbdefine variáveis do tipo byte. - As letras diferem pelo 6º bit:
OR 0x20converte para minúscula;AND 0xDFpara maiúscula. +48e-48permitem converter entre números e caracteres numéricos.- As máscaras
0x0Fe0x30facilitam a manipulação direta de códigos ASCII.