PDA

View Full Version : آموزش: ASSEMBLY 64 BIT



darknes666
یک شنبه 27 مرداد 1392, 00:31 صبح
سلام خدمت همه ی دوستان.:لبخندساده:
تالار اسمبلی یکی از تالار هایی هست که فکر میکنم کمتر بهش سر بزنن.
چون بهر حال وضع برنامه نویسی تحت وب و برنامه نویسی با زبان های سطح بالا رونق خیلی زیادی
گرفته.
منم خودم c++ و c رو اول ترجیح میدادم ولی کم کم از اسمبلی هم خوشم اومد و حالا...

نوشته های من از اشکال و ضعف پاک نیستن.پس اگر جایی اشتباه نوشتم لطفا بهم پیام خصوصی بدین تا ویرایشش کنم.:لبخندساده:
این اشکالات ممکنه از خستگی و یا اشتباه درک کردن مطالب و یا ... باشه.

و اما بریم سر اصل ماجرا:
برای سالهاست که برنامه نویسای کامپیوتر از assembly x86 برای نوشتن کد های حیاتی استفاده میکنن.
اگر چه جای کامپیوتر های 32 بیتی با کامپیوتر های 64 بیتی عوض شده و ساختار کد ها تغییر اساسی کرده.
به طور خلاصه مفهوم اسمبلی 64 بیتی اینه که ما یک سری رجیستر های اضافی تو معماری cpu ها داریم.
اگر چه بین cpu های اینتل و AMD کمی تفاوت هست ولی عملکردشون نسبتا شبیه هم دیگست.
حتما کسانی که از دانش اسمبلی برخوردار هستن میدونن که این دانش چقدر سودمنده.
در کل اگر کسی از اسمبلی سر در بیاره کامپیوتر رو به خوبی درک میکنه.
وقتی زبان اسمبلی رو برای یک پلتفرم یاد میگیریم اولین چیز اشنایی با رجیستر هاست.
و برای جلوگیری از طولانی شدن پست رجیستر ها رو تو پست بعدی توضیح میدم.:چشمک:
پایان بخش اول.

darknes666
یک شنبه 27 مرداد 1392, 00:59 صبح
رجیستر ها

همه ی شما ax-bx-cx-al-bl-cl-... میشناسین.رجیستر های 8 بیتی و 16 بیتی.

خب کار با این ثبات ها یکم ادم محدود میکنه :لبخند:
خب عوضش ما EAX-EBX-ECX-EDX رو داریم.ثبات های 32 بیتی که از 0 تا 4294967295 میوتونین مقداردهی کنین.خب اینا دست آدمو بیشتر باز میکنه.
و ادم راحت تر میتونه بر نامه هاشو بنویسه و الگوریتم ها رو کوتاه تر کنه.

و اما 64 بیتی از 0 تا 18446744073709551615 میتونین مقدار دهی کنین :لبخندساده:.دیگه دستمون خیلی آزاد تر شده.

و اما بریم سراغ رجیستر های 64 بیتی :
RAX
RBX
RCX
RDX
RBP
RSI
RDI
RSP
R8
R9
R10
R11
R12
R13
R14
R15
خیلی خوب.حالا دیگه خیلی بهتر شده :لبخند:

ولی یه سری رجیسترای دیگه هم مونده :چشمک:

XMM registers 128 bit
خب اینا دیگه واقعا ....
از 0 تا 340282366920938463463374607431768211455
قابل مقدار دهی هستن :لبخندساده:.
که عبارتند از:
XMM1
XMM2
XMM3
XMM4
XMM5
XMM6
XMM7
XMM8
XMM9
XMM10
XMM11
XMM12
XMM13
XMM14
XMM15.
پایان بخش دوم.:چشمک:

darknes666
یک شنبه 27 مرداد 1392, 01:19 صبح
پاسخ به یکسری سوالات

خب حالا ممکنه یک سری سوال پیش بیاد که من جوابشونو میدم.

1-آیا میشه از تمام امکانات رجیستر ها استفاده کرد؟
باید بگم نه.CHIP های امروزی این اجازه رو بما نمیدن.برای مثال معماری AMD فقط از 48 بیت کم ارزش میتونه بهره ببره.
2- از چه ابزار هایی میتونم برای نوشتن برنامه های اسمبلی 64 بیت استفاده کنم؟
جدیدترین نسخه ی FASM,NASM میتونن خواسته های شما رو بر آورده کنن :لبخندساده:
3- میتونم از اسمبلی 64 بیت تو C/C++‎‎‎‎ استفاده کنم؟asm__
به احتمال زیاد تو vC++‎‎‎‎ برای بهینه شدن کدها این امکان حذف شده.
برای این کار دو انتخاب دارین.استفاده از فایل های اسمبلی و اسمبلر جداگونه.
و یا استفاده از هدر فایل intrn.h
انیجا رو نگاه کنین:
http://msdn.microsoft.com/en-us/library/hh977022.aspx

پایان بخش سوم.:چشمک:

darknes666
یک شنبه 10 شهریور 1392, 21:43 عصر
مدتی بود پست نمیزاشتم و شاید از هفته ی بعد خیلی کمتر پست بزارم.(از فرت خستگی و یه سری مسایل دیگه :ناراحت:)

خب بریم سر ادامه ی مطلب.

تفاوت های اساس 32bit و 64bit چیست؟:چشمک:
خب دوستان ممکنه یکی بیاد بگه 64 بهتره دیگه کلا بیخیال 32 بیت بشیم.
باید بگم اشتباهه.
چرا که ثبات های 32 بیتی سریعتر و با استقامت تر از ثبات های 64 بیتی هستند.
از طرفی در برنامه های سنگین ثبات های 64 بیتی بعضی از مقادیر رو گم میکنن.
ولی خوبیه 64 بیتی اینه که الگوریتم هاتون ساده تر و خطوط برنامه کمتر میشه.

و اما بریم سراغ دستور های جدید برای ثبات های 128 بیتی.
MOVSS:
خب از این دستور برای انتقال از ثبات به ثبات-حافظه به ثبات-ثبات به حافظه استفاده میشه.
MOVSS XMM0,[ECX]
نکته:MOVAPS, MOVUPS, MOVLPS, MOVHPS, MOVLHPS, MOVHLPS هم مثل بالا هستن ولی یه تفاوت هایی باهم دارن که بعدا میگم.

دستور CMPSS:
مشخصه چیکار میکنه.CMPSS, COMISS, UCOMISS,CMPPS هم مثل بالا هستن ولی یه تفاوت هایی باهم دارن که بعدا میگم.

دستورات محاسباتی جدید:
ADDSS, SUBSS, MULSS, DIVSS, RCPSS, SQRTSS, MAXSS, MINSS, RSQRTSSوADDPS, SUBPS, MULPS, DIVPS, RCPPS, SQRTPS, MAXPS, MINPS, RSQRTPS

تبدیل داده ها به هم(کاربرد نسبتا زیادی دارن که اونارم میگم):
CVTSI2SS, CVTSS2SI, CVTTSS2SIوCVTPI2PS, CVTPS2PI, CVTTPS2PI

خیلی خوب این دستورات FLOATING POINT بود.

حالا دستورات INTEGER:
دستورات محاسباتی:
PMULHUW, PSADBW, PAVGB, PAVGW, PMAXUB, PMINUB, PMAXSW, PMINSW

دستورات انتقالی:
PEXTRW, PINSRW

دستورات MXCSR:
LDMXCSR, STMXCSR

دستورات اداره ی حافظه و cache:
MOVNTQ, MOVNTPS, MASKMOVQ, PREFETCH0, PREFETCH1, PREFETCH2, PREFETCHNTA, SFENCE

به مرور زمان دستورات بالا رو کار میکنیم. ولی اینا دستورات جدیدن و مثل اسمبلی 32 بیتی ساده نیستن و به ابزار نسبتا جدیدی نیاز دارن.
منظورم cpu های جدید برای پشتیبانی از این دستوراته.
این رو میتونین با برنامه ی CPU-Z تشخیص بدین.

:متفکر: پایان بخش چهار.

p3m4ni
شنبه 16 شهریور 1392, 02:52 صبح
سلام و خسته نباشید..
اگه راجع به inline نوشتن داخل x64 platform بیشتر توضیح بدید ممنون میشم

darknes666
شنبه 02 فروردین 1393, 02:40 صبح
سلام خدمت همه ی دوستان.
پس از یه مدت طولانی برگشتم.
و اما ادامه ی ماجرا
حالا میخوام یک سری مبانیه پایه که لازم هست رو بگم.
MOV R8W, 1234[8*RAX+RCX]
کد بالا رو در نظر بگیرین.این کد عددی که تو آدرس ( RCX+1234+(8*RAX قرار داره توی R8W قرار میده.مشابه این دستور رو به شکل های زیر هم میشه نوشت.
MOV ECX, dword ptr table[RBX][RDI]
MOV ECX, dword ptr table[RDI][RBX]
MOV ECX, dword ptr table[RBX+RDI]
MOV ECX, dword ptr [table+RBX+RDI]

کلمه ی DWORD PTR به اسمبلر میگه که چجوری دستور MOV رو ENCODE کنه.
متاسفانه MASM اینا رو قبول نمیکنه ولی YASM و FASM قبول میکنه.

حالا میرم سراغ انواع داده ها در ASM.
خب اولیش db هست که یعنی بایت خالی مثل 0x55
dw میشه دو بایت مثلا 0x1234
dd میشه هشت تا db یا دوتا dw مثلا 0x12345678
و.....
البته داده ها یکسری جزیات دارن که بعدا راجبش صحبت میکنیم.

zh00bin
پنج شنبه 07 فروردین 1393, 23:57 عصر
دوستان سلام
چرا این مبحث ادامه پیدا نمیکنه؟

typeman9
یک شنبه 13 اسفند 1396, 15:33 عصر
دوستان سلام
چرا این مبحث ادامه پیدا نمیکنه؟


سلام:
برای اسمبلی 64 بیت تحت ویندوز یا لینوکس به سایت اسمبلر Fasm مراجعه کن.
ادرس اسمبلر Fasm

https://flatassembler.net

وارد سایت که شدی روی گزینه ی Message Board کلیک کن تا وارد انجمن برنامه نویسان اسمبلی بشوی . هر سوالی که داری باید عضو بشی . برای عضویت اول اسمبلر Fasm رو دانلود کن بعد اجرا کن و بعد ماشین حسابش را فعال کن تا کد مربوط به فعالسازی عضویتت را بتونی وارد کنی .

هرچیزی از اسمبلی که دوست داری بدونی به این سایت مراجعه کن . Fasm اسمبلر جاودانه و همیشگی است و برای همه ی سیستم عاملها نسخه دارد . برای معماریهای مختلف هم از ماکرو استفاده می کند .