Андрей Ипполитов – Ассемблер ARM64 (страница 10)
NZCV
– можно получить через
MRS/MRS instructions
в привилегированных контекстах или специальные псевдоинструкции ассемблера.
Регистры находятся внутри процессорного ядра, поэтому доступ к ним происходит быстрее, чем к любой памяти (кеш, ОЗУ). Именно благодаря регистрами процессор может выполнять инструкции за несколько тактов, а не за десятки, как при работе с внешней памятью.
Команды
Каждая команда (инструкция) представлена фиксированным 32‑битным машинным кодом, но в исходном тексте она записывается в более читаемом виде:
<операция> <операнд1>, <операнд2>, <операнд3> ; комментарий
•
операция – мнемоника (например
, ADD, LDR, B).
•
операнды – регистры, константы, метки, смещения и т.п.
•
комментарий – начинается с ; и игнорируется компилятором.
Директивы
Директивы – это команды, которые обрабатываются только на этапе ассемблирования. Они не попадают в машинный код, а управляют размещением данных, определяют символы, задают параметры сборки и т.п.
ДИРЕКТИВА
НАЗНАЧЕНИЕ
ПРИМЕР ИСПОЛЬЗОВАНИЯ
.text
Открывает секцию кода (инструкций). По умолчанию размещается в исполняемой памяти.
.text
.data
Открывает секцию данных (инициализированных).
.data
.bss
Открывает секцию неинициализированных данных (выделяется в памяти, но не хранится в объектном файле).
.bss
.global / .globl
Делает символ (метку) видимым за пределами текущего файла (экспорт).
.global _start
.type
Указывает тип символа (функция, объект). Требуется для некоторых линкеров.
.type _start, %function
.size
Задает размер функции/объекта (используется при отладке).
.size _start, . – _start
.align
Выравнивает следующую секцию/данные по указанному границе (в байтах или степеням двойки).
.align 4
;выравнивание по 16 байт
.org
Устанавливает текущий смещение (адрес) внутри секции.
.org 0x1000
.equ / .set
Определяет константу (символ‑замену).
.equ BUFFER_SIZE, 256
.macro / .endm
Объявление макроса, который может принимать параметры.
.macro push_regs regliststp \reglist, [sp, #-16]!.endm
.if / .else / .endif
Условная ассемблирование (компиляция части кода только при выполнении условия).
.if __ARM_FEATURE_CRYPTO__ .inst 0xd503201f.endif
.include
Включает внешний файл (аналог #include).
.include "constants.inc"
.byte, .hword, .word, .dword
Вставка данных фиксированного размера (8, 16, 32, 64 бит).
.word 0xDEADBEEF
.ascii / .asciz
Вставка строк без/с нулевым терминатором.
.asciz "Hello, world\n"
.skip / .space
Заполняет область нулями (или другим значением) заданного размера.