از آرایه ها برای تعریف یک مجموعه منظم از عناصر داده ای مشابه استفاده می شود.
بد افزارها گاهی اوقات از آرایه برای اشاره به رشته هایی که محتوی چندین hostname که بعنوان گزینه هایی برای ارتباط استفاده می شود, استفاده می کنند.
دو آرایه در مثال زیر تعریف شده که هر دو در هنگام تکرار حلقه تنظیم می شوند.
آرایه a بصورت محلی و آرایه b بصورت عمومی تعریف شده که این تفاوت را در کد دیس اسمبل شده مشاهده خواهید کرد.
int
b[5] = {123,87,487,7,978};
void
main()
{
int i;
int a[5];
for(i = 0; i<5; i++)
{
a[i] = i;
b[i] = i;
}
}
توی اسمبلی آرایه ها
با استفاده از آدرس مبنا بعنوان یک نقطه ی شروع قابل دستیابی هستند.سازه هر عنصر
همیشه واضع نیست اما آنرا میتوان با توجه به چگونگی تنظیم شدن اندیس آرایه متوجه
شد.
00401006 mov
[ebp+var_18], 0
0040100D jmp
short loc_401018
0040100F
loc_40100F:
0040100F mov
eax, [ebp+var_18]
00401012 add
eax, 1
00401015 mov
[ebp+var_18], eax
00401018
loc_401018:
00401018 cmp
[ebp+var_18], 5
0040101C jge
short loc_401037
0040101E mov
ecx, [ebp+var_18]
00401021 mov
edx, [ebp+var_18]
00401024 mov
[ebp+ecx*4+var_14], edx 1(1)
00401028 mov
eax, [ebp+var_18]
0040102B mov
ecx, [ebp+var_18]
0040102E mov
dword_40A000[ecx*4], eax 2(2)
00401035 jmp
short loc_40100F
در اینجا آدرس مبنای آرایه b برابر است با dword_40A000
و آدرس مبنای آرایه a برابر با var_14 میباشد.بخاطر
اینکه هر دو آرایه عددی هستند, هر عنصر 4 بایت سایز دارد.
هر چند دستورات (1) و (2) برای دسترسی به دو آرایه متفاوت هستند در هر دو مورد
ecx
بعنوان اندیس استفاده شده است, که در 4 ضرب می شود تا سایز هر عنصر حساب شود.
مقدار نتیجه به آدرس مبنای آرایه برای دسترسی به عنصر آرایه مدنظر جمع می شود.