Важность новой строки
Часть раздела Основы путешествия по Assembly на Coddy — урок 41 из 45.
Вы добавляли 0x0a (newline) в конец своих строк. Но что произойдет, если вы его забудете?
Без символа новой строки:
Текст выводится, но курсор остается на той же строке. Любой последующий вывод появится сразу за ним.
Пример без символа новой строки:
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
syscallВывод:
HelloWorld
Никаких пробелов. Никаких новых строк. Всё слито воедино.
С newline:
section .data
first db 'Hello', 0x0a
firstLen equ $ - first
second db 'World', 0x0a
secondLen equ $ - secondВывод:
Hello
World
Каждая строка выводится на отдельной строке.
Что делает newline:
| Символ | ASCII | Действие |
|---|---|---|
0x0a | 10 | Перемещает курсор в начало следующей строки |
Распространенные ошибки с newline:
| Ошибка | Результат |
|---|---|
| Вообще нет newline | Текст сливается в одну строку |
| Newline только в конце последней строки | Предыдущие строки сливаются, последняя переходит на следующую строку |
| Newline в середине строки | Переносы строк происходят в неожиданных местах |
Надёжное правило:
Всегда добавляйте 0x0a в конец каждой строки, которую вы хотите разместить на отдельной строке.
Задание
Вам даны три строки без символов перевода строки. Ваша задача — вывести их так, чтобы они отображались на трех отдельных строках.
Строки:
| Строка | Значение |
|---|---|
word1 | 'Apple' |
word2 | 'Banana' |
word3 | 'Cherry' |
Требования:
- Определите каждую строку с символом новой строки (
0x0a) на конце - Вычислите длину каждой строки автоматически
- Выведите все три строки с помощью системного вызова write
- Завершите программу корректно с кодом 0
Попробуйте сами
section .data
; TODO: Определите word1 с 1-м текстом, указанным в инструкциях, и символом новой строки
; TODO: Определите word2 со 2-м текстом, указанным в инструкциях, и символом новой строки
; TODO: Определите word3 с 3-м текстом, указанным в инструкциях, и символом новой строки
; TODO: Вычислите длины для каждой строки
section .text
global _start
_start:
; TODO: Выведите word1
; TODO: Выведите word2
; TODO: Выведите word3
; TODO: Выйдите корректноsection .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
syscallВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-643Первая инструкция — MOV
Что такое MOV?MOV: непосредственные значенияMOV: из регистра в регистрMOV: из памяти в регистрMOV: из регистра в памятьLEA — загрузка адресаMOV с операндами разных размеровПрактика: обмен значениями регистровИтоги: испытание MOV6Системный вызов write
Системный вызов write (1)Дескриптор файла (rdi)Адрес буфера (rsi)Количество байт (rdx)Собираем всё вместеПечать двух строкВажность новой строкиИтоги: Настройка write