Директива .EQU. Определение констант

Последнее обновление: 30.07.2023

Директива .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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850