Assembly - Costanti
Esistono diverse direttive fornite da NASM che definiscono le costanti. Abbiamo già utilizzato la direttiva EQU nei capitoli precedenti. Discuteremo in particolare tre direttive:
- EQU
- %assign
- %define
La direttiva EQU
Il EQUviene utilizzata per definire le costanti. La sintassi della direttiva EQU è la seguente:
CONSTANT_NAME EQU expression
Per esempio,
TOTAL_STUDENTS equ 50
È quindi possibile utilizzare questo valore costante nel codice, ad esempio:
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
L'operando di un'istruzione EQU può essere un'espressione -
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
Il segmento di codice sopra definirà AREA come 200.
Esempio
Il seguente esempio illustra l'uso della direttiva 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 il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Hello, programmers!
Welcome to the world of,
Linux assembly programming!
La direttiva% assign
Il %assigndirettiva può essere utilizzata per definire costanti numeriche come la direttiva EQU. Questa direttiva consente la ridefinizione. Ad esempio, puoi definire la costante TOTALE come -
%assign TOTAL 10
Più avanti nel codice, puoi ridefinirlo come:
%assign TOTAL 20
Questa direttiva fa distinzione tra maiuscole e minuscole.
La% definisce la direttiva
Il %definela direttiva consente di definire costanti sia numeriche che stringa. Questa direttiva è simile alla #define in C. Ad esempio, puoi definire la costante PTR come -
%define PTR [EBP+4]
Il codice precedente sostituisce PTR con [EBP + 4].
Questa direttiva consente anche la ridefinizione e distingue tra maiuscole e minuscole.