Директива .EQU позволяет определить константы, которые будут заменяться ассемблером на из значения при компиляции программы. Синтаксис данной инструкции:
.EQU название, значение
В качестве названия константы используется набор символов, обычно некоторое описательное название, которое указывает на предназначение данной константы.
В качестве значения используется некоторое число.
Например:
.global _start .equ var1, 1 .equ var2, 2 .equ var3, 3 _start: mov x0, var1 // X0 = 1 add x0, x0, var2 // X0 = X0 + 2 = 3 add x0, x0, var3 // X0 = X0 + 3 = 6 // выход из программы mov x8, #93 // функция Linux для выхода из программы svc 0 // вызываем функцию Linux
В данном случае с помощью директивы .EQU определяются три контанты: VAR1, VAR2, VAR3. Каждой из них сопоставляется числовое значение 1, 2, 3.
Далее мы можем использовать эти константы как стандартные числа, и ассемблер при компиляции заменит эти константы на их значения. То есть предыдущий код фактически эквивалентен следующему:
.global _start _start: mov x0, #1 // X0 = 1 add x0, x0, #2 // X0 = X0 + 2 = 3 add x0, x0, #3 // X0 = X0 + 3 = 6 // выход из программы mov x8, #93 // функция Linux для выхода из программы svc 0 // вызываем функцию Linux
Но использование описательных имен вместо их значений в тексте программы позволяет легче ориентироваться в коде программы, быстрее понять предназначение тех или иных значений.
Константы могут динамически вычисляться
.global _start .equ var1, 2 * 8 // var1 = 16 .equ var2, 4 + var1 // var2 = 20 _start: mov x0, var2 // X0 = 20 // выход из программы mov x8, #93 // функция Linux для выхода из программы svc 0 // вызываем функцию Linux
Выражения, которые возвращают значение констант, могут применять стандартные арифметические операции, как сложение, вычитание, умножение, где операндами могут быть в том числе и другие константы. Так, в данном случае значение константы VAR2 зависит от константы VAR1. Но в любом случае значения этих констант вычисляется на этапе компиляции.
Также константы могут применяться для определения значений переменных:
.global _start .equ intSize, 4 .equ longSize, 8 _start: ldr x0, num1 // X0 = 4 // выход из программы mov x8, #93 // функция Linux для выхода из программы svc 0 // вызываем функцию Linux .data num1: .quad intSize num2: .quad longSize
В данном случае переменные num1 и num2 получают соответственно значения констант intSize и longSize.