Собираем всё вместе
Часть раздела Основы путешествия по Assembly на Coddy — урок 39 из 45.
Вы изучили все четыре части системного вызова write:
| Регистр | Что он содержит | Значение для вывода на экран |
|---|---|---|
rax | Номер системного вызова | 1 (write) |
rdi | Файловый дескриптор | 1 (stdout) |
rsi | Адрес буфера | Адрес вашей строки |
rdx | Количество байт | Длина вашей строки |
Теперь пришло время собрать всё это воедино.
Полный шаблон системного вызова write:
mov rax, 1 ; номер системного вызова для write
mov rdi, 1 ; дескриптор файла (stdout)
mov rsi, msg ; адрес строки
mov rdx, msgLen ; количество байт для вывода
syscall ; запрос к ОС на выводПолная рабочая программа:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallЧто делает эта программа:
| Шаг | Что происходит |
|---|---|
| 1 | Выводит "Hello, World!" на экран |
| 2 | Переходит на новую строку |
| 3 | Успешно завершается с кодом 0 |
Порядок имеет значение:
Вы должны настроить регистры перед выполнением syscall. Порядок инструкций mov не имеет значения, при условии, что все четыре установлены перед syscall.
Задание
Напишите полную программу, которая выводит сообщение "Assembly is fun", сопровождаемое символом новой строки, а затем корректно завершает работу.
Строка и её длина уже определены. Вам нужно только написать код внутри _start:.
Попробуйте сами
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Настроить и вызвать системный вызов write
; Используйте rax=1, rdi=1, rsi=msg, rdx=msgLen
; TODO: Корректно завершить работу с кодом 0
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
1Машина
Что такое CPUПамятьРегистры против памятиКак работают инструкцииПаттерн двух файловАрхитектура x86-643Первая инструкция — MOV
Что такое MOV?MOV: непосредственные значенияMOV: из регистра в регистрMOV: из памяти в регистрMOV: из регистра в памятьLEA — загрузка адресаMOV с операндами разных размеровПрактика: обмен значениями регистровИтоги: испытание MOV6Системный вызов write
Системный вызов write (1)Дескриптор файла (rdi)Адрес буфера (rsi)Количество байт (rdx)Собираем всё вместеПечать двух строкВажность новой строкиИтоги: Настройка write