۸
کار با آرایهها
چگونه در حافظه به صورت متوالی حرکت کنیم و روی آرایهها بچرخیم.
تعریف و دسترسی به آرایهها
آرایه در اسمبلی چیزی نیست جز یه سری خونه حافظه پشت سر هم. ما آدرس خونه اول رو داریم و با اضافه کردن به اون آدرس، میتونیم به بقیه خونهها برسیم.
section .data
my_array dd 10, 20, 30, 40, 50 ; آرایهای از ۵ عدد ۳۲ بیتی (doubleword)
section .text
global _start
_start:
mov eax, [my_array] ; دسترسی به اولین عنصر (۱۰)
mov ebx, [my_array + 4] ; دسترسی به دومین عنصر (۲۰) - چون هر عدد ۴ بایته
mov ecx, [my_array + 8] ; دسترسی به سومین عنصر (۳۰)
; ...
; خروج از برنامه
mov eax, 1
int 0x80
پیمایش آرایه با حلقه
برای چرخیدن روی همه اعضای آرایه، از یه حلقه و یه رجیستر به عنوان اشارهگر (Pointer) استفاده میکنیم.
section .data
my_array dd 10, 20, 30
array_len equ 3
section .text
global _start
_start:
mov edi, my_array ; EDI حالا به اولین عنصر آرایه اشاره میکنه
mov ecx, array_len ; ECX شمارنده حلقه ماست
xor eax, eax ; EAX رو صفر میکنیم تا جمع رو توش نگه داریم
sum_loop:
add eax, [edi] ; مقدار عنصری که EDI بهش اشاره داره رو به EAX اضافه کن
add edi, 4 ; اشارهگر رو ۴ بایت ببر جلو (برای رفتن به عنصر بعدی)
dec ecx ; یکی از شمارنده کم کن
jnz sum_loop ; اگه شمارنده صفر نشده، برگرد به اول حلقه
; حالا مجموع اعداد (۶۰) در رجیستر EAX قرار داره
; ... خروج از برنامه
mov eax, 1
int 0x80