Montagem - Constantes
Existem várias diretivas fornecidas pelo NASM que definem constantes. Já usamos a diretiva EQU em capítulos anteriores. Vamos discutir particularmente três diretivas -
- EQU
- %assign
- %define
A Diretiva EQU
o EQUdiretiva é usada para definir constantes. A sintaxe da diretiva EQU é a seguinte -
CONSTANT_NAME EQU expression
Por exemplo,
TOTAL_STUDENTS equ 50
Você pode então usar este valor constante em seu código, como -
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
O operando de uma instrução EQU pode ser uma expressão -
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
O segmento de código acima definiria ÁREA como 200.
Exemplo
O exemplo a seguir ilustra o uso da diretiva 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
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Hello, programmers!
Welcome to the world of,
Linux assembly programming!
A% designar diretiva
o %assignpode ser usada para definir constantes numéricas como a diretiva EQU. Esta diretiva permite redefinição. Por exemplo, você pode definir o TOTAL constante como -
%assign TOTAL 10
Posteriormente no código, você pode redefini-lo como -
%assign TOTAL 20
Esta diretiva diferencia maiúsculas de minúsculas.
A% define a diretiva
o %definediretiva permite definir constantes numéricas e de string. Esta diretiva é semelhante a #define em C. Por exemplo, você pode definir o PTR constante como -
%define PTR [EBP+4]
O código acima substitui PTR por [EBP + 4].
Essa diretiva também permite a redefinição e faz distinção entre maiúsculas e minúsculas.