Печать двух строк
Часть раздела Основы путешествия по Assembly на Coddy. Урок 40 из 45.
Вы уже знаете, как вывести одну строку. Но что, если вы хотите вывести две отдельные строки? Например, «Hello » , а затем «World!»?
Вы просто дважды вызываете системный вызов write — по одному разу для каждой строки.
Как это работает:
; Первая печать
mov rax, 1
mov rdi, 1
mov rsi, firstMsg
mov rdx, firstLen
syscall
; Вторая печать
mov rax, 1
mov rdi, 1
mov rsi, secondMsg
mov rdx, secondLen
syscallПример:
section .data
first db 'Hello ', 0x0a
firstLen equ $-first
second db 'World!', 0x0a
secondLen equ $-second
section .text
global _start
_start:
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
mov rax, 60
mov rdi, 0
syscallВывод:
Hello World!
Зачем выводить две строки вместо одной?
| Причина | Пример |
|---|---|
| Повторное использование | Выводить одно и то же приветствие с разными именами |
| Гибкость | Выводить разные сообщения в зависимости от условий |
| Организация | Хранить разные сообщения отдельно в памяти |
Вы можете вывести столько строк, сколько захотите:
Просто повторите системный вызов write для каждой строки.
Задание
Вам даны две строки: partOne со значением 'Good' и partTwo со значением 'bye'. В конце обеих уже есть символ новой строки.
Напишите код, который выведет partOne, а затем partTwo, чтобы результат выглядел так:
Good
bye
section данных и syscall выхода уже предоставлены. Вам нужно написать только два syscall write.
Попробуйте сами
section .data
partOne db 'Good', 0x0a
partOneLen equ $-partOne
partTwo db 'bye', 0x0a
partTwoLen equ $-partTwo
section .text
global _start
_start:
; TODO: Вывести partOne с помощью системного вызова write
; TODO: Вывести partTwo с помощью системного вызова write
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Потренируйтесь самостоятельно: Песочница Assembly