۸

کار با آرایه‌ها

چگونه در حافظه به صورت متوالی حرکت کنیم و روی آرایه‌ها بچرخیم.

تعریف و دسترسی به آرایه‌ها

آرایه در اسمبلی چیزی نیست جز یه سری خونه حافظه پشت سر هم. ما آدرس خونه اول رو داریم و با اضافه کردن به اون آدرس، می‌تونیم به بقیه خونه‌ها برسیم.

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