Zespół - stałe
Istnieje kilka dyrektyw dostarczonych przez NASM, które definiują stałe. Korzystaliśmy już z dyrektywy EQU w poprzednich rozdziałach. Omówimy w szczególności trzy dyrektywy -
- EQU
- %assign
- %define
Dyrektywa EQU
Plik EQUDyrektywa służy do definiowania stałych. Składnia dyrektywy EQU jest następująca -
CONSTANT_NAME EQU expression
Na przykład,
TOTAL_STUDENTS equ 50
Następnie możesz użyć tej stałej wartości w swoim kodzie, na przykład -
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
Operand instrukcji EQU może być wyrażeniem -
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
Powyższy segment kodu zdefiniowałby OBSZAR jako 200.
Przykład
Poniższy przykład ilustruje zastosowanie dyrektywy 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
Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -
Hello, programmers!
Welcome to the world of,
Linux assembly programming!
Dyrektywa% assign
Plik %assigndyrektywy można używać do definiowania stałych numerycznych, takich jak dyrektywa EQU. Ta dyrektywa pozwala na przedefiniowanie. Na przykład można zdefiniować stałą TOTAL jako -
%assign TOTAL 10
W dalszej części kodu możesz przedefiniować go jako -
%assign TOTAL 20
W tej dyrektywie rozróżniana jest wielkość liter.
% Definiuje dyrektywę
Plik %defineDyrektywa pozwala na zdefiniowanie stałych numerycznych i łańcuchowych. Ta dyrektywa jest podobna do #define w C. Na przykład można zdefiniować stałą PTR jako -
%define PTR [EBP+4]
Powyższy kod zastępuje PTR przez [EBP + 4].
Dyrektywa ta pozwala również na przedefiniowanie i rozróżnia wielkość liter.