Menu
Coddy logo textTech

Важность новой строки

Часть раздела Основы путешествия по Assembly на Coddy — урок 41 из 45.

Вы добавляли 0x0a (символ новой строки) в конце ваших строк. Но что произойдет, если вы забудете об этом?

Без новой строки:

Текст выводится, но курсор остается на той же строке. Любой последующий вывод появится сразу после него.

Пример без новой строки:

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

Каждая строка выводится на отдельной строке.

Что делает символ новой строки:

СимволASCIIЭффект
0x0a10Перемещает курсор в начало следующей строки

Распространенные ошибки при использовании символа новой строки:

ОшибкаРезультат
Символ новой строки полностью отсутствуетТекст сливается в одну строку
Перенос строки только в конце последней строкиПредыдущие строки сливаются, последняя переносится на новую строку
Перенос строки в середине строкиРазрывы строк в неожиданных местах

Безопасное правило:

Всегда добавляйте 0x0a в конце каждой строки, которую вы хотите разместить на отдельной строке.

challenge icon

Задание

Вам даны три строки без символов новой строки. Ваша задача — вывести их так, чтобы они отображались на трех отдельных строках.

Строки следующие:

СтрокаЗначение
word1'Apple'
word2'Banana'
word3'Cherry'

Требования:

  • Определите каждую строку с символом новой строки (0x0a) в конце
  • Вычислите длину каждой строки автоматически
  • Выведите все три строки, используя системный вызов write
  • Завершите выполнение корректно с кодом 0

Попробуйте сами

section .data
    ; TODO: Определить word1 со значением 'Apple' и символом новой строки
    ; TODO: Определить word2 со значением 'Banana' и символом новой строки
    ; TODO: Определить word3 со значением 'Cherry' и символом новой строки
    ; 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы