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