PDA

View Full Version : دسترسی به عناصر ارایه در اسمبلی؟



one hacker alone
چهارشنبه 13 بهمن 1389, 17:22 عصر
با یاد خدا
با سلام خدمت دوستان عزیز
من در مورد آرایه ها سوالی داشتم
من برای دسترسی به عناصر آرایه مشکل دارم کسی میتونه بگه کد زیر رو تو سی چجوری میتونم تو اسمبلی بنویسم
tmp=a[0]
a[0]=a[1]
a[1]=tmp

مشکل من در دسترسی به عناصر ارایه هست

amir001
چهارشنبه 13 بهمن 1389, 17:44 عصر
چیزی که یادم میاد :


mov si,offset a
mov ax,[si]
mov temp ,ax
mov ax,[si+2]
mov [si],ax
mov ax,temp
mov [si+2],ax

فکر کنم این جواب بده اما من با جوانب احتیاط این را نوشتم. شاید خلاصه تر هم بشه نوشتش.
یک نکته دیگه: این برای 8086 بود که من نوشتم. فکر کنم رجیسترها در پنتیوم فرق کنه. شاید...

xman_1365_x
چهارشنبه 13 بهمن 1389, 18:19 عصر
كد بالا درسته البته به اين شكل هم ميشه نوشت

mov ax,a
mov bx,a+2
xchg ax,bx
mov a,ax
mov a+2,bx

یک نکته دیگه: این برای 8086 بود که من نوشتم. فکر کنم رجیسترها در پنتیوم فرق کنه. شاید...
بله ثبات ها فرق دارند اما دستورات پردازنده هاي قبل پشتيباني ميشن بدليل معماري backward compatible (چون فقط قبلي ها ارتقاع پيدا كردند )
مثلا al-ah-ax--eax-rax
eax براي 32بيت
rax براي 64 بيت
بقيه ثبات ها هم ارتقاع يافتند يا بعضا ثباتهايي اضافه شده كه بهتره به معماري پردازنده ها مراجعه كنيد.

asadegha
جمعه 15 بهمن 1389, 16:24 عصر
اگه با پشته كار كني راحت تره.

push a
push a+2
pop a
pop a+2

xman_1365_x
جمعه 15 بهمن 1389, 19:13 عصر
حالا كه چند مدل مختلف ذكر شد بخوايم بگيم كدوم دستورات بهتره استفاده كنيم
آيا صرف راحتي كه asadegha گفته خوبه يا ملاك هاي ديگه اي هم هست مثل زمان اجرا و بهينه بودن كد
جواب در كامنت اولي كه داده شد حد اقل 24 clocks پردازنده رو درگير ميكنه
كامنت بعدي 19 clocks و كامنت بعدي كه با push و pop هست 20 clocks زمان ميگيره اجراش
و دستور زير كه الان نوشتم بازم همون كارو انجام ميده اما با 13 clocks

mov ax,a
xchg ax,[a+2]
mov a,ax
در اين چند دستور مسئله خاصي نيست چون براي ما ملموس نيست، اونم در پردازنده هاي امروزي كه ميليون ها دستورالعمل مثل اينارو در يك ثانيه انجام ميدن،اما اين وقتي خودشو نشون ميده كه برنامه طولاني باشه يا كار هايي كه زمان اجرا و حجم كد مهم باشه(مثل ويروس و يا كار هاي گرافيكي و ...)
پس ميبينيد جداي از اينكه بايد الگوريتم ما از لحاظ زمان اجرا بهينه شه نوع دستوراتي كه بكار ميبريم هم مهم هست، براي همين هست كه در اسمبلي ميگن سعي كنيد بيشتر كارهارو با رجيستر ها انجام بدين كه سرعت بالايي دارند و حتي در دستورات درون پردازنده بعضي دستورات باز سريعتر هستند مثل دستورات بيتي!

one hacker alone
شنبه 16 بهمن 1389, 01:27 صبح
ممنون از جوابتون مشکل حل شد اما موضوعی
اگه من به 3 تا ثبات ایندکس نیاز داشته باشم چکار کنم؟
si,di دیگه نیست؟؟؟؟؟/

xman_1365_x
شنبه 16 بهمن 1389, 02:39 صبح
از bx هم ميتوني استفاده كني بشه 3 تا
در اسمبلي 32 همه ثباتها ميتونند اين نقشم داشته باشن توي 16 فقط bx,si,di