تشخیص ساختارهای برنامه نویسی در اسمبلی - قسمت نهم
لیست های پیوندی ساختارهای داده ای هستند که محتوی یک زنجیره ای از رکوردهای داده هستند, و هر رکورد شامل یک فیلد هستش که محتوی یک ارجاع (پیوند) به رکورد بعدی در این زنجیره هستش.
عمده اصلی استفاده از لیست های پیوندی نسبت به آرایه این است که ترتیب آیتم های پیوندی می تواند متفاوت از ترتیبش در آیتم های داده ای نگهداری شده در حافظه یا دیسک باشد.
ازینرو لیست های پیوندی اجازه قرار دادن یا حذف کردن یک گره رو در هر نقطه از لیست را می دهند.
struct
node { int x; struct node * next; }; typedef
struct node pnode; void
main() { pnode * curr, * head; int i; head = NULL; for(i=1;i<=10;i++) (1) { curr = (pnode *)malloc(sizeof(pnode)); curr->x = i; curr->next = head; head = curr; } curr = head; while(curr) (2) { printf("%d\n", curr->x); curr = curr->next ; }
توی این مثال ما یک لیست پیوندی و پیمایش اونرو تعریف کردیم. این لیست پیوندی
محتوی سری از ساختارهای گره به نام pnode هستش که با دو حلقه دستکاری
میشه.اولین حلقه 10 تا گره ایجاد میکنه (1) و آنهارو با داده پر میکنه, حلقه دوم
(2) روی همه ی این رکوردها تکرار میشه و محتویاتشون رو چاپ میکنه. کد دیس اسمبل شده : 0040106A mov
[ebp+var_8], 0 00401071 mov
[ebp+var_C], 1 00401078 00401078
loc_401078: 00401078 cmp
[ebp+var_C], 0Ah 0040107C jg
short loc_4010AB 0040107E mov
[esp+18h+var_18], 8 00401085 call
malloc 0040108A mov
[ebp+var_4], eax 0040108D mov
edx, [ebp+var_4] 00401090 mov
eax, [ebp+var_C] 00401093 mov
[edx], eax (1) 00401095 mov
edx, [ebp+var_4] 00401098 mov
eax, [ebp+var_8] 0040109B mov
[edx+4], eax (2) 0040109E mov
eax, [ebp+var_4] 004010A1 mov
[ebp+var_8], eax 004010A4 lea
eax, [ebp+var_C] 004010A7 inc
dword ptr [eax] 004010A9 jmp
short loc_401078 004010AB
loc_4010AB: 004010AB mov
eax, [ebp+var_8] 004010AE mov
[ebp+var_4], eax 004010B1 004010B1
loc_4010B1: 004010B1 cmp
[ebp+var_4], 0 (3) 004010B5 jz
short locret_4010D7 004010B7 mov
eax, [ebp+var_4] 004010BA mov
eax, [eax] 004010BC mov
[esp+18h+var_14], eax 004010C0 mov
[esp+18h+var_18], offset aD ; "%d\n" 004010C7 call
printf 004010CC mov
eax, [ebp+var_4] 004010CF mov
eax, [eax+4] 004010D2 mov
[ebp+var_4], eax (4) 004010D5 jmp
short loc_4010B1 (5) چیزهایی که ما متوجه شدیم شامل: اول حلقه for را تشخیص دادیم. Var_C همون متغیر i هستش که شمارنده ی حلقه هست. Var_8 همون متغیر head هستش و var_4
هم متغیر curr هستش که اشاره گری به یه ساختاره. حلقه while (از (3) تا (5) ) هم این لیست پیوندی رو تکرار میکنه و داخلش var_4
به رکورد در این لیست تنظیم میشه (4) برای تشخیص لیست های پیوندی, شما ابتدا میبایست برخی آبجکتهایی که محتوی یک
اشاره گر به یه آبجکت دیگه از همون نوع اشاره می کنند تشخیص بدید.