реклама
Бургер менюБургер меню

Андрей Ипполитов – Ассемблер ARM64 (страница 10)

18

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

Заполняет область нулями (или другим значением) заданного размера.