msg db "hello, world",0
section .bss
section .text
global main main:
mov rax, 1 ; 1 = запись.
mov rdi, 1 ; 1 = в поток стандартного вывода stdout.
mov rsi, msg ; Выводимая строка в регистре rsi.
mov rdx, 12 ; Длина строки без конечного 0.
syscall ; Вывод строки.
mov rax, 60 ; 60 = код выхода из программы.
mov rdi, 0 ; 0 = код успешного завершения программы.
syscall ; Выход из программы.
А вот вопрос:
Интересно, а зачем два раза указывать код выхода: один успешный, а другой просто?
rax = 60 это подфункция для syscall. 60 это номер функции завершения программы (точно название не помню) rdi = аргумент, в данном случае "0" - обозначает, что программа завершилась успешно. Можешь положить в rdi что угодно, это в принципе чисто для себя. Чтобы понять, с каким кодом завершилась программа (ошибка была, или нет)
И это... Как система не путается? Там же два одинаковых символа в регистрах: один в rdi, другой в rax. У всех по 1. Как ОС знает, что одна единичка - это stdout, а другая - write-код?
Так ты сам ей передаёшь в регистрах
Это параметры, вызывающий код знает какой параметр в каком регистре
Т.е. для stdout есть специальный регистр, как и для write-кода? Или вообще пофиг в какой регистр какой код ложить?
После syscall ты передаёшь управление ядру. Ядро видит, что ты ей передал(положил) в RAX, RBX, RCX, и т.д И обрабатывает
Есть соглашение о передаче параметров. В какой регистр класть определяет вызываемая сторона, в данном случае сискол из ядра
Обсуждают сегодня