Сборка - Константы
NASM предоставляет несколько директив, определяющих константы. Мы уже использовали директиву EQU в предыдущих главах. В частности, мы обсудим три директивы -
- EQU
- %assign
- %define
Директива 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
Вышеуказанный сегмент кода определил бы ОБЛАСТЬ как 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Директива позволяет определять как числовые, так и строковые константы. Эта директива похожа на #define в C. Например, вы можете определить константу PTR как -
%define PTR [EBP+4]
Приведенный выше код заменяет PTR на [EBP + 4].
Эта директива также позволяет переопределить, и она чувствительна к регистру.