Структура программы
Структура программы
section .data
msg db "hello, world", 0
section .bss
section .text
global main
main:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, 12
syscall
mov rax, 60
mov rdi, 0
syscall
Страницы:
- .data
- .bss
- .txt
.data
Переменные: <varname> <type> <value>
Константы: <constant_name> equ <value>
.bss
Неинициализированные данные. resb - байт, resw - слово, resd - двойное слово, resq - двойное длинное слово
.txt Программа.
Регистры
rip - счетчик команд
rflags - флаги, статус выполнения предыдущей команды
Syscall
Инструкция процессора, мост между ядром и непривилегированными программами. Для еговызова использования необходимо правильно заполнитьзаполняются регистры в соответствии с соглашениями ABI (Application Binary Interface). Есть обновляемая таблица системных вызовов Номер функции размещается в регистре rax, Аргументы функции последовательно в регистрах rdi, rsi, rdx, r10, r8, r9.
syscall дляизменяет регистры rcx и r11. В регистр RCX сохраняется предыдущее значение регистра RIP - адрес следующей инструкции, которую будут выполнять приложение после завершения системного вызова, а в RIP помещается адрес обработчика системного вызова. Также syscall изменяет регистр флагов RFLAGS в соответствии с системным вызовом, а старое значение RFLAGS сохраняется в регистр r11. Поэтому, если программа использует регистры rcx и r11, то перед выполнением системного вызова функцииэти регистры следует сохранить, например, в стек, чтобы не потерять их содержимое.
Кроме того, системный вызов может возвращать некоторый результат, который помещается в регистр rax.