NASM предоставляет несколько директив, определяющих константы. Мы уже использовали директиву EQU в предыдущих главах. Мы будем особенно обсуждать три директивы —
- EQU
- % правопреемник
- % определяют
Директива EQU
Директива EQU используется для определения констант. Синтаксис директивы EQU следующий:
CONSTANT_NAME EQU expression
Например,
TOTAL_STUDENTS equ 50
Затем вы можете использовать это постоянное значение в вашем коде, например:
mov ecx, TOTAL_STUDENTS cmp eax, TOTAL_STUDENTS
Операндом оператора EQU может быть выражение —
LENGTH equ 20 WIDTH equ 10 AREA equ length * width
Выше сегмент кода будет определять AREA как 200.
пример
Следующий пример иллюстрирует использование директивы EQU —
SYS_EXIT equ 1 SYS_WRITE equ 4 STDIN equ 0 STDOUT equ 1 section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, msg1 mov edx, len1 int 0x80 mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, msg2 mov edx, len2 int 0x80 mov eax, SYS_WRITE mov ebx, STDOUT mov ecx, msg3 mov edx, len3 int 0x80 mov eax,SYS_EXIT ;system call number (sys_exit) int 0x80 ;call kernel section .data msg1 db 'Hello, programmers!',0xA,0xD len1 equ $ - msg1 msg2 db 'Welcome to the world of,', 0xA,0xD len2 equ $ - msg2 msg3 db 'Linux assembly programming! ' len3 equ $- msg3
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —
Hello, programmers! Welcome to the world of, Linux assembly programming!
Директива% assign
Директива % assign может использоваться для определения числовых констант, таких как директива EQU. Эта директива допускает переопределение. Например, вы можете определить постоянную ВСЕГО как
%assign TOTAL 10
Позже в коде вы можете переопределить его как —
%assign TOTAL 20
Эта директива чувствительна к регистру.
% Определяет директиву
Директива % define позволяет определять как числовые, так и строковые константы. Эта директива похожа на #define в C. Например, вы можете определить постоянную PTR как —
%define PTR [EBP+4]
Приведенный выше код заменяет PTR на [EBP + 4].
Эта директива также допускает переопределение и учитывает регистр.