Печать двух строк
Часть раздела Основы путешествия по 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
Секция данных и системный вызов exit уже предоставлены. Вам нужно только написать два системных вызова 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