A Importância do Newline
Parte da seção Fundamentos do Journey de Assembly da Coddy — lição 41 de 45.
Você tem adicionado 0x0a (nova linha) ao final das suas strings. Mas o que acontece se você esquecer?
Sem nova linha:
O texto é impresso, mas o cursor permanece na mesma linha. Qualquer saída futura aparecerá logo ao lado dele.
Exemplo sem nova linha:
section .data
first db 'Hello'
firstLen equ $ - first
second db 'World'
secondLen equ $ - second
section .text
mov rax, 1
mov rdi, 1
mov rsi, first
mov rdx, firstLen
syscall
mov rax, 1
mov rdi, 1
mov rsi, second
mov rdx, secondLen
syscallSaída:
HelloWorld
Sem espaço. Sem nova linha. Tudo está grudado.
Com quebra de linha:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondSaída:
Hello
World
Cada string é impressa em sua própria linha.
O que a quebra de linha faz:
| Caractere | ASCII | Efeito |
|---|---|---|
0x0a | 10 | Move o cursor para o início da próxima linha |
Erros comuns de quebra de linha:
| Erro | Resultado |
|---|---|
| Nenhuma quebra de linha | O texto fica todo em uma única linha |
| Quebra de linha apenas no final da última string | As strings anteriores ficam juntas, a última vai para a próxima linha |
| Quebra de linha no meio de uma string | Quebras de linha em lugares inesperados |
A regra de segurança:
Sempre adicione 0x0a ao final de cada string que você deseja em sua própria linha.
Desafio
Você recebe três strings sem quebras de linha. Sua tarefa é imprimi-las para que apareçam em três linhas separadas.
As strings são:
| String | Valor |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Requisitos:
- Defina cada string com uma nova linha (
0x0a) ao final - Calcule o comprimento de cada string automaticamente
- Imprima todas as três strings usando a syscall write
- Saia de forma limpa com o código 0
Experimente você mesmo
section .data
; TODO: Definir word1 com 'Apple' e nova linha
; TODO: Definir word2 com 'Banana' e nova linha
; TODO: Definir word3 com 'Cherry' e nova linha
; TODO: Calcular comprimentos para cada string
section .text
global _start
_start:
; TODO: Imprimir word1
; TODO: Imprimir word2
; TODO: Imprimir word3
; TODO: Sair de forma limpasection .data
word1 db 'Apple', 0x0a
word1Len equ $ - word1
word2 db 'Banana', 0x0a
word2Len equ $ - word2
word3 db 'Cherry', 0x0a
word3Len equ $ - word3
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, word1
mov rdx, word1Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word2
mov rdx, word2Len
syscall
mov rax, 1
mov rdi, 1
mov rsi, word3
mov rdx, word3Len
syscall
mov rax, 60
mov rdi, 0
syscallEsta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Fundamentos
1A Máquina
O que é CPUMemóriaRegistradores vs MemóriaComo as instruções funcionamPadrão de Dois ArquivosA Arquitetura x86-64