آموزش اسمبلی - Assembly

وضعیت
موضوع بسته شده است.

MnavidM

Active Member
سلام.

در این تاپیک قصد داریم با کمک aira و دیگر دوستان داریم به آموزش اسمبلی بپردازیم.

ما را در هر چه بهتر نمودن این آموزش رهنمایی فرمایید.

شروع : سه شنبه 05-07-84
 

aira

Member
شروع

دوستان عزيز سلام
من ميخوام به كمك شما عزيزان در اين تاپيك باهم اسمبلي رو ياد بگيريم
در ابتدا اين سوال مطرح ميشود اسمبلي چيست ؟
زبانهاي برنامه نويسي كامپيوتر عموما به دو دسته زبانهاي سطح بالا و زبانهاي سطح پايين تقسيم ميشوند . برخي اين زبانها را به صه دسته تقسيم بندي كرده اند . زبانهاي سطح بالا و زبانهاي سطح پايين و زبانهاي سطح مياني . زبان برنامه نويسي اسمبلي جز زبانهاي سطح پايين است .
زبان سطح پايين به زباني گفته ميشود كه از لحاض ساختاري و ترجمه بسيار به زبان ماشين نزديك است . يعني قابليت فهم ان براي ماشين بهتر و راحتتر است . اما زبانهاي سطح بالا با كاربر رابطه بهتري دارند و كاربر يا برنامه نويس با اين زبان راحتتر ارتباط برقرار ميكند .
در زبان اسمبلي به سبب پايين بودن سطح ان ويژگيهايي نهفته است كه در هيچ يك از زبانهاي ديگر اين ويژگيها را نميتوان يافت : يكي از ويژگيهاي مهم اين زبان باز گذاشتن دست كاربر در كنترل سخت افزار بويژه CPU است . در واقع كاربر ميتواند با جز به جز پردازشگر و سخت افزار كامپيوتر ارتباط برقرار كند . بنابراين سرعت اينگونه برنامه ها نسبت به زبانهاي سطح بالا بسيار بالاتر است .
البته اين زبان داراي مشكلاتي نيز هست . كه از جمله مهمترين انها زياد بودن تعداد دستوراتي است كه كاربر بايد براي انجام عملي خاص از انها استفاده كند .
برنامه نويس براي برنامه نويسي بايد بر ارشيتكت ساخت CPU ‌مسلط باشد .
سورس اين برنامه ها اصولا خطوط زيادي دارد .
اين برنامه ها بسته به ماشين عمل ميكنند . يعني اگر ساختار اصلي ماشين تغيير كند . اين برنامه ها قابليت اجرا ندارند .
اسمبلر چيست ؟
براي تبديل زبان اسمبلي به زبان ماشين بايد از اين مترجم استفاده كرد . در واقع زبان اسمبلي از طريق اسمبلر به زبان ماشين كه صفر و يك است ترجمه ميشود .
هر خط از زبان اسمبلي معادل يك خط است در زبان ماشين . اين ويژگي خاص دستورات اسمبلي است و در زبانها سطح بالا چنين اتفاقي نمي افتد .
نحوه اسمبل شدن برنامه را در شكل زير ميبينيد :
asm_1.gif


براي اسمبل كردن يك برنامه توسط اسمبلي بايد به يك اسمبلر دسترسي داشت . كه اين كار را ميتوان توسط يك نرم افزار ويژه انجام داد كه عموما از اسمبلرهاي TASM ‌يا MASM استفاده ميكنند . كه اولي محصول شركت turbo و دومي محصول مايكروسافت است . كه نسخه جديد MASM نرم افزاري است به نام ML ‌كه كار كردن با ان نسبت به دو نرم افزار بالايي بسيار ساده تر است .
با استفاده از TASM ‌يا MASM سورس برنامه اي كه در فايلي با پسوند asm نوشته ايد را به يك فايل obj تبديل ميكنيد . سپس با يك لينكر TLINK ميتوانيد فايل را به فايل اجرايي تسوط كامپيوتر تبديل كنيد كه پسوند exe دارد .
براي نوشتن سورس برنامه كافيست يك ويرايشگر متن داشته باشيد كه تمامي كامپيوتر ها چنين چيزي را اصولا دارند . اگر از سيتسم عامل ويندوز استفاده ميكنيد ميتوانيد از notepad استفاده كنيد اگر از word استفاده ميكنيد يادتان باشد كه تغييرات اتوماتيك انرا براي تصحيح كلمات از كار بياندازيد . پس از انكه سورس برنامه را نوشتيد كافيست انرا با پسوند asm ذخيره كنيد براي اينكار از منوي file ميتوانيد گزينه save as ‌را انتخاب كنيد و نام فايل را با پسوند asm در دو جفت كوتيشن قرار ميدهيد :
“parsx.asm” سپس به پرامپت داس ميرويد .
براي رفتن به محيط داس اگر از سيستم عامل win98 ‌ و نسخه هاي 9X استفاده ميكنيد كافيست در منوي استارت گزينه run را انتخاب كنيد و سپس بنويسيد command و اگر از ويندوزهاي با نسخه بالاتر استفاده ميكنيد ميتوانيد در منوي run بنويسيد cmd و ازانجا به محيط داس برويد و به ادرسي كه اسمبلر شما و فايل asm شما قرار دارد برويد . براي رفتن به اين مسير ها بايد كمي بر داس مسلط باشيد .
اما براي تغيير دايركتوري بدانيد كه ميزنيد cd namefolder و براي بيرون رفتن از ان ميزنيد cd\ و براي تغيير درايو نام درايو را بهمراه دو نقطه مينويسيد : c: به همين سادگي .
اگر از نرم افزار MASM استفاده ميكنيد . كافيست تايپ كنيد MASM ‌و سپس نام فايل سورس را بنويسيد و ترتيب را ادامه دهيد تا فايل obj ‌شما ساخته شود . سپس LINK ‌را مينويسيد و نام فايلي كه ساخته ايد و پسوند obj ‌بان اختصاص داده شده است را مينويسيد . مراتب را ادام ميدهيد .
اگر از ml استفاده ميكنيد . كافيست نام فايل asm ‌را جلوي ml بنويسيد . يعني مينويسيد ml parsx.asm و سپس برنامه شما به exe تبديل ميشود .
براي استفاده از turbo assembler هم كافيست نام فايل را جلوي tasm بنويسيد تا obj شما ساخته شود و سپس با tlink نام فايل با پسوند obj فايل exe رابسازيد .

tasm parsx.asm
tlink parsx.obj


و بدين ترتيب فايل شما ساخته ميشود .
البته روش ديگري براي ساخت فايلهاي اسمبلي نيز وجود دارد . كه داراي محدوديتهاي زيادي است . كافيست در اعلان داس در هر مسيري كه هستيد تايپ كنيد debug تا وارد محيط debug ‌شويد .
براي ورود دستورات اسمبلي كليد a ‌را ميزنيد و enter ميزنيد و براي خروج از محيط دستورات كافيست بدون نوشتن چيزي دكمه اينتر را بزنيد . براي خروج از محيط ديباگ نيز كافيست دكمه q را بزنيد و اينتر را بعد از ان بزنيد . و براي اجراي دستورات g را بزنيد . كه كار كردن با اين محيط اموزش ويژه اي را ميطلبد
 

aira

Member
شروع

اميدوارم به مبناها تسلط داشته باشيد ولي براي اونايي كه بلد نيستن مقداري توضيح ميدم
از اونجايي كه زبان ماشين 0و1 هست هر عددي كه به ما ميدن بايد به اين دوعدد تبديل بشه.
مبناي اعداد:2-8-10-16
كه معمولاً اعداد رو در مبناي 10 به كار ميبريم.مثل 12؛45,67895
حالا ميخوايم يك عدد مبناي 10 رو به مبناي 2 تبديل كنيم:-?
1-تقسيمهاي متوالي كه همتون بلدين ديگه؟؟؟:wink:
taghsim.jpg

35=(100011) ‌‌‌‹در مبناي دو›

2-اين راه خيلي آسونتره و اگه يك عدد بزرگ دادن خيلي زودتر ميشه به جواب رسيد(عدد مورد نظر را به توانهاي 2 عدد تجزيه ميكنيم تا عدد مورد نظر يا استفاده از توانهاي 2 ساخته شود.به جاي عددهايي كه داريم 1 ميگذاريم)
35=32(5^2)+3
0^2 1^2 2^2 3^2 4^2 5^2
1 1 0 0 0 1 = 35

حالا اين سوال پيش مياد كه اعداد منفي رو چه جوري بايد به مبناي 2 برد؟؟؟
ابتدا توضيح مختصري درباره ي Bit وByte بدم.
bit.jpg


به هر كدام از اين مربع ها يك بيت گفته ميشود با 0 و 1 پر ميشود.پس 8^2=256 حالت براي پر شدن اين مربع ها وجود دارد.
8bit=1byte 16bit=1Word
32bit=1Dw 64bit=Qw

پس باتوجه به اين جدول بازه بايت(براي اعداد مثبت)‍[0,255]=
براي اعداد منفي اين مقادير قرينه نميشود بلكه با استفاده از قانون مكمل2 اعداد رو منفي ميكنيم.
byte.jpg


نكته:با عوض كردن بيت علامت عدد منفي نميشود
Byte= [-128,127]
مكمل1 = جاي 1و0 عوض ميشود (0به جاي1 و برعكس)
مكمل2 = از سمت راست به اولين يك رسيديم بدون تغيير مينويسيم ولي بقيه 0و1 ها عوض ميشود.
براي اينكه بيشتر متوجه بشيد يك مثال ميزنم
عدد 10- را به مبناي 2 ببريد؟
حل:ابتدا عدد 10 را به مبناي دو ميبريم (00001010)= 10
توجه كنيد كه اين مسئله در 8بيت حل ميشود و بايد صفرهاي پشت عدد حتماً نوشته شود
طبق قانون مكمل2 از سمت راست عددها را ميخونيم.0 و1 (به يك رسيد اعداد عوض ميشود)1و0و1و1و1و1.
(11110110)=10- در مبناي دو
با يك سوال اين مبحث رو تموم ميكنم
10000000 در مبناي دو برابر چه عدد يا عددهايي است؟
سلامت و موفق باشيد
 
آخرین ویرایش:

aira

Member
در ابتدا جواب سوالي رو كه در پست قبلي كرده بودم و افراد زيادي :shock: به اون پاسخ نداده بودند رو بدم
عدد 10000000=128- يا 128+ است.اين عدد تنها عددي است كه اگر بيت علامت عوض شود عدد قرينه ميشود.
ادامه درس:
در ادامه مبحث مبناها به بررسي مبناي 8 و 16 ميپردازيم.
مبناي 8:
اعداد 0و1و...و7 را قبول ميكند.
111=2^8*1+1^8*5+0^8*7=157(در مبناي 8)

تبديل مبناي 10 يه 8:
روش تقسيمهاي متوالي
Capture.jpg


مبناي 16:
اعداد 0و1و2و...و9وF=15,14=E,13=D,12=C,11=B,10=A
3A(در مبناي 16)=1^16*3+0^16*10=58

تبديل مبناي 10 به 16:
استفاده از تقسيمهاي متوالي.فكر نكنم ديگه لازم باشه توضيح بدم.

براي اينكه مبناي اعداد را نشان بدهند؛راه ديگري هم وجود داره.يعني به جاي اينكه مبنا رو در زير پرانتز در كنير اعداد بنويسند.ميتوانيم از حروف استفاده كنيم:
B: مبناي2
O: مبناي 8
D: مبناي 10
H: مبناي 16

تا اينجا هر تبديلي كه خونده بوديم براي مبناي 10 بود حالا تبديل اعداد به مبناي 2 رو ميگم كه كاربرد بيشتري داره
تبديل از مبناي 8 به 2 و برعكس:
براي تبديل اعداد از مبناي 8 به مبناي 2 در هررقم مبناي8 معادل سه رقم در مبناي2 ميشود.
52O=5(101),2(010( پس 52O=101010
از مبناي 2 به 8:
از سمت راست رقمها را سه تا سه تا جدا ميكنيم.هر سه رقم درمبناي2 معادل يك رقم در مبناي8 است.
011 011 101=
335
تبديل از مبناي 16 به2 و برعكس:
مانند مبناي8 است فقط ارقام به چهار دسته تقسيم ميشود.

سوال:2003H-5 معادل چه عددي است؟
 

aira

Member
يكي ديگر از مبحث هايي كه در زبان اسمبلي شما خيلي استفاده ميكنيد جمع و تفريق مبناها است.

جمع:
مثل جمع كردن معمولي هست وزياد فرق نميكنه.
0+0=0 1+0=1 1+1=10 0+1=1
مثال:23O+110111B=?H
حل:23 در مبناي 8=010011
010011+110111=1001010=4AH

تفريق:
0-1=1 0-0=0 1-1=0 1-0=2(تو تفريق معمولي وقتي يه عدد كوچكتر رو ميخواستيم از يه عدد بزرگتر كم كنيم از عدد بعديش غرض ميگرفتيم.در اينجا هم به همين صورت عمل ميكنيم.با اين تفاوت كه مبناي عدد بايد توجه كنيم.مثلاً اگر در مبناي 2 باشه در موقع غرض گرفتن 2واحد به عدد اضاقه ميكنيم واگر مبناي 16 باشد 16 واحد)
مثال:202H-76D=?B
حل:
202H=1000000010 , 76D=000011110

c.jpg
 

aira

Member
از آنجاييكه برنامه نويسي به زبان اسمبلي‌‌‌؛به ماشين ربط دارد؛آشنايي با سخت افزار كامپيوتر هم ميتواند در بهتر نوشتن برنامه ها به شما كمك كند.البته من قصد ندارم به طور كامل درباره سخت افزار بحث كنم.چونهم شما دوستان ميدونيد هم خيلي گستردست.فقط قسمتهايي رو ميگم كه ممكنه درموردش اطلاعات نداشته باشيد.
در تمام كامپيوترها قسمتي به نام حافظه اصلي ياCPU وجود دارد كه اين مجموعه ميتواند دستورها يا دادها را به صورت يك بايت ذخيره كند.هر بايت حافظه اصلي داراي يك برچسب عددي با نام آدرس ميباشد كه اين آدرس هي ميتواند از 0000 شروع شده و مقدار ماكزيمم آن برابر عدد بدون علامتFFFF16 باشد.يك آدرس را ميتوان با پنج رقم شانزده شانزدهي نشان داد.اندازه ماكزيمم حافظه اصلي برابر 1مگابايت ميباشد.
Cap.jpg


اطلاعات در داخلCPU در محلهايي به نام ثبات(Register) ذخيره ميشود.رجيستر ها به سه دسته تقسيم ميشوند.
1-General Register:(ثبات عمومي)اين ها ثبات هايي هستند كه در دستورعمل ها استفاده ميشود.به بيان ساده تر بيشتر يا اين علامتها سروكار داريم.
Ax: نتايج محاسبات در آن قرار ميگيرد به همين دليل به آن انباره هم گفته ميشود
Bx: پايه؛كاربرد همگاني
Cx: شمارش؛كاربرد همگاني
Dx :داده؛كاربرد همگاني
در مورد اين نشانه ها در قسمت برنامه نويسي مفصل تر توضيح ميدم فقط در اين حد كه به گوشتون خورده باشه بدونيد
اين رجيسترهاي همگاني به دو ثبات8بيتي مستقل يعني نصف بالايي براي 8بيت سمت چپ و نصف پاييني براي8بيت سمت راست استفاده نمود.اسامي اين ثباتهاي 8بيتي عبارتند ازAH,AL,BH,BL,CH,CL,DH,DL
Cap1.jpg


2-Pointer & index Register: (ثباتهاي اشاره گر شاخص)
IP: Instruction pointer اشاره گر دستور العمل؛به دستور العمل درحال اجرا اشاره ميكند وبا اجراي دستورات به صورت اتوماتيك عوض ميشود
BP: اشاره گر پايه؛معمولاً براي آدرس دهي استفاده ميشود
SP: اشاره گر پشته؛به آخرين خانه پرشده پشته(Stock) اشاره ميكند.يعني وقتي اطلاعات در داخل آن قرار ميگيرد آخرين اطلاعات اول خارج ميشود
SI: شاخص مبدا
DI: شاخص مقصد
SI, DI در آدرس دهي براي گذاشتن يا برداشتن اطلاعات در حافظه اصلي استفاده ميشود
3-Segment register(ثباتهاي سگمنت)
DS:داده
CS:كد يا برنامه(دستورات به كد تبديل ميشود)
SSپشته(در فراخواندن استفاده ميشود)
EX :اضافي(شبيه داده است؛اگر داده زياد باشد استفاده ميشود)

فعلاً همينا رو داشته باشيد تا دفعه ي بعد ؛الان ديگه خيلي خستم:-? :wink:
 

aira

Member
درباره رجيسترها چند مطلب ديگه هم مانده كه در اينجا ميگم.
از پردازنده هاي 386 به بعد(+386) ثباتهاي عمومي به صورت زير معرفي ميشوند كه 36 بيتي ميباشند:
EAX, EBX, ECX, EDX
در ثباتهاي اشاره گر به صورت:
EDI, ESI, ESP, EBP, EIP
در ثباتهاي سگمنت به صورت:
FS, GS

براي ديدن رجيسترها در DEBUG ,DOSرا اجرا كنيد و فرمان R را صادر كنيد :

D:\MASM>DEBUG
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=17AA ES=17AA SS=17AA CS=17AA IP=0100 NV UP EI PL NZ NA PO NC
17AA:0100 0F
حافظه و آدرس دهي

هر كامپيوتر مبتني بر 8086 داراي حداقل 640 كيلوبايت حافظه است . اين 640
كيلوبايت به قطعات 64 كيلوبايتي تقسيم شده و ما اين قطعات را "قطعه " يا Segment
ميناميم . هر سگمنت هم به خانه هاي تك بايتي ديگري تقسيم شده است .

براي بدست آوردن مقدار يك بايت مشخص از حافظه ما بايد عدد مربوط به سگمنت و
همچنين شماره آن بايت در سگمنت ( كه آفست Offset ناميده ميشود-چندمين خانه از شروع سگمنت ) را بدانيم .
مثلا اگر مقدار مورد نظر در قطعه 0030h( يعني عدد در مبناي 16 است ) و آفست 13C4h
باشد ما بايد قطعه اي كه شماره آن 0030h است را بيابيم و بعد در همان قطعه
مقدار بايت شماره 13C4 را بخوانيم .
براي نمايش اين حالت بين عدد سگمنت و آفست علامت ( : ) قرار ميدهيم . يعني
ابتدا عدد مربوط به قطعه را نوشته و سپس عدد آفست را مي آوريم :
Segment: Offset
هميشه در آدرس دهي ها از اعداد مبناي 16 استفاده ميكنيم .
مثال:1234H:5678H
براي به دست آوردن آدرس فيزيكي جلوي آدرسBase يك صفر ميگذاريم و با آفست جمع ميزنيم.

12340+5678=179B8H
در مبحث بعدي دستورهاي اسمبلي رو ميگم...:)
 
آخرین ویرایش:

aira

Member
دستورهاي اجرايي اسمبلي
حالا ميخواهيم به رجيتسرها مقدار بدهيم و آنها را بخوانيم و ... . ما معمولا در
زبانهاي ديگر از علامت =(يا =ا:) براي مقدار دهي استفاده ميكنيم ولي در زبان
اسمبلي اين كار ممكن نيست . در عوض از دستورالعمل MOV كمك ميگيريم . با MOV
ميتوانيم داده ها را بين رجيسترها يا خانه هاي حافظه انتقال بدهيم . به اين صورت :
MOV D/S
مقاديري كهDميتوانند بگيرنند يك رجيستر، نام يك متغير، يا آدرس يك مكان از حافظه است و مقاديري كهS ميتواند بگيردهم يك مقدار عددي يا حرفي ، نام يك رجيستر و ... ميباشد .(cte=مقدار ثابت)

registe <r----> register
register ---> memory
memory ---> register
register --->cte
memory --->cte
segment register ---> general register
general register --->segment register​

حالت هاي غير ممكن:
segment register --->segment register
segment register ---> cte
؟ ‹--- ثابت

باز هم بايد به يك يا دوبايتي بودن ثباتها توجه كنيم . به عبارت ديگر ما
نميتوانيم مقدار يك ثبات تك بايتي را به يك ثبات كامل دوبايتي منتقل كنيم .
مثلا عبارت mov DX/AL قابل قبول نيست چون AL يك بايتي بوده و DX دوبايتي است .
به عبارت ساده و كامل تر دو طرف عملوند MOV بايد از نظر اندازه برابر باشند.
بنابر اين :
MOV DL/AL
و MOV CL/BHوM درست ولي MOV DS/AH نادرست است .


به علاوه ما فقط ميتوانيم ثباتهاي همه منظوره AXتا DX را به اين صورت مقدار دهي
كنيم . در صورتي كه بخواهيم ثباتهائي مثل ..DS/ES/ را مقدار دهي كنيم بايد از
رجيستر AX به عنوان واسطه استفاده كرده و مقدار را از طريق آن انتقال دهيم .
مثلا:
نميتوانيم بنويسيم mov ds/20h
ولي ميتوانيم داشته باشيم :
mov ax/20h
mov ds/ax


به اين ترتيب مقدار 20hبه DS انتقال پيدا ميكند ( گرچه تغيير دادن DS ايده خوبي
نيست !)

حالا مطالب گفته شده را تمرين ميكنيم . ما ميتوانيم با DEBUG اسمبلي بنويسيم و
حتي برنامه هاي COM. درست كنيم . بنا براين در DOS، DEBUG، را اجرا كنيد .
D:\LNG\ASM> DEBUG


يك خط تيره به صورت - ظاهر ميشود . اين خط تيره اعلان DEUBG براي وارد كردن
دستورات است .
حرف A (به معني شروع وارد كردن دستورات اسمبلي ) را وارد كرده و Enter را بزنيد .
عددي بصورت xxxx:0100 ظاهر ميشود . اين عدد براي شما (فعلا) مهم نيست ، پس به
آن توجه نكنيد .
حالا ميتوانيد دستورات زير را وارد كنيد :


MOV AX/100
MOV BX/AX
MOV ES/AX


بعد از وارد كردن خط آخر يكبار ديگر كليد Enter را بزنيد تا اعلان (-) دوباره ظاهر
شود .
در سطر اول ما عدد 100h ( پيش فرض اعداد در Debug هگزا است ) را به AX منتقل
كرديم . بعد مقدار AXبه BX و سپس مقدار AXبه ES منتقل شده . به اين ترتيب همه
ثباتهاي AX/BX/ES بايد در نهايت برابر 100h باشند .
براي ديدن صحت اين مطلب دستور T ( به معناي Trace) را وارد كنيد .
با هر بار اجراي اين دستور يكي از سطرهاي برنامه اجرا ميشود . بعلاوه شما ميتوانيد
محتواي رجيسترها را هم ببينيد .
با اولين فرمان T ، سطر اول اجرا ميشود . بازهم فرمان T را وارد كنيد . الان مقدار100h
به BX داده شد و اگر به محتواي رجيستر AX توجه كنيد خواهيد ديد كه مقدار آن
(همانطور كه انتظار داشتيم ) برابر 100h است . دوبار ديگر هم فرمان T را صادر
كنيد و در نهايت مقدار ثباتهاي AX/BX/ES را ببينيد . هر سه ثبات (حالا) برابر 100h
هستند .
براي خارج شدن از Debug هم فرمان Q به معني Quit را وارد كنيد .


حالا فرض كنيد با اين آدرس روبرو شديد MOV [200H]/70H
اين دو از حافظه هستند پس چه جوري بايد مقدار را منتقل كنيم؟؟
خيلي راحت با استفاده از دستورPTR؛ براي اينكه آدرس يك متغير بيان كننده نوع آن متغير نميباشد(يعني چند بايتي است) از عملگر PTR استفاده ميشود.

BYTE PTR [......]
WORD PTR [......]
DWORD PTR [......]

MOV BYTE [200H]/70H.
مثال) كداميك از دستورات زير درست ميباشد؟
1) MOV BYTE PTR[DI]/BL
MOV BYTE PTR[SI]/300(2
MOV BYTE PTR[SI]/BYTE PTR[DI] (3
MOV [300H]/ BX (4

حل:
گزينه 2و3 غلطه؛چرا:wink:
2- چون 300 بيشتر از يك بايت است
3- انتقال از حافظه امكان ندارد

تا بعد كه بقيه رو بگم:)
 

aira

Member
اسمبلي تحت ويندوز

آشنايي با برنامه نويسي اسمبلي ويندوز - قسمت‌هاي 1/2/ 3

شامل:
تفاوت مهم بين اسمبلي داس و ويندوز
متغيرها
رجيسترها
نگاهي بر معماري حافظه در ويندوز و داس
آشنايي با حالت حافظه‌ي محافظت شده
آشنايي با Opcodes
ساختار فايل‌هاي منبع اسمبلي
پرش هاي شرطي
توضيحاتي در مورد اعداد
نگاهي دقيق‌تر به پشته
برنامه نويسي asm32 با استفاده از masm
اسمبلي مقدماتي ويندوز
بكار گيري dll ها و توابع API ويندوز



قسمت اول



قسمت دوم



قسمت سوم

باتشكر از آقاي نصيري كه زحمت جمع آوري اين مطالب رو كشيدند:)
 

aira

Member
قبل از اينكه ادامه دستورهاي اسمبلي رو خدمتتون عرض كنم؛توضيحي درباره ي رجيستر وضعيت و كنترل(status& contorol register):
CF: carry flat
ZF: zero flag
PF: paritty flag
اگر نتيجه محاسبه صفر باشدZF؛يك ميشود واگر نتيجه صفر نشد؛اين بيت صفر ميشود
AF: پرچم نقلي كمكي=اگر درموقع محاسبه از بيت 3به4 رقم نقلي داشته باشيم اين بيت يك ميشود.
PF: پرچم تقارن= اگر تعداد 1هاي نتيجه زوج باشدPF-1ميباشد و اگر تعداد يكهاي نتيجه فرد باشدPF=0ميشود.
SF: پرچم بيت علامت.اگر نتيجه منفي باشدSF=1واگر تنيجه مثبت باشدSF=0ميشود.
OF:پرچم سرريز.اگر تنيجه محاسبه خيلي بزرگ يا خيلي كوچك باشد كه در مقدار پيشبيني شده جا نشود؛سرريز اتفاق مي افتد و OF=1ميشود.

دستورات اسمبلي:
دستورات انتقال داده:دستور MOVرو قبلا گفتم.در اينجا دستورهاي LEA ,XCHG رو بررسي ميكنيم.
XCHG:اين دستور محتواي D,Sرا با هم عوض ميكند.
XCHG D,S
D<==>S
Genelar register <==> general register
general register<==> memory
memory<==>general register
در اين دستور يك طرف حتماً بايد رجيسترباشد.

در ادامه دستورات محاسباتي رو ميگم
سلامت و موفق باشيد
 

saeedsmka

Member
سلام مرسي از زحمات شما
لينك هاي آشنايي با برنامه نويسي اسمبلي ويندوز كار نميكنه ميشه يك لينك ديگه بديد
بازم مرسي
 
سلام

با تشکر از شما ، منم مثل دوست قبلی دچار همین مشکل هستم

ظاهرآ تمامی مطالبی که برای مبناها بصورت عکس گذاشتید،لینکشان عوض شده

در ضمن لینکهای آموزشی هم همینطور ، کلآ تمام لینکها عوض شدند و هیچکدام کار نمیکنند

ممنون میشم اگر لینکهای سالم رو جایگزین کنید:)

با تشکر . موفق باشید
 

aira

Member
متاسفانه این فایل از کامپیوتره منم پاک شده و من الان اصلشو ندارم..
اگه فایل اصلی رو بهتر پیدا کردم براتون میزارم..
بازم پوزش میخوام
 

milani

Member
با سلام
حیفه که تو این تاپیک یه جزوه با حال رو معرفی نکنییم
http://www.iaushab.ac.ir/prof/DrMehri/Lectures/MLSPfa.html
می تونید ار آدرس بالا دانلود جزوه کامل برنامه نویسی زبان ماشین را را که تالیف دکتر مهری می باشد را دانلود کنید.
ایشون در انجمن مجله کامپیوتری ابتکار که در امضام لینکش هست مدیر هستند.
 
سلام.aira از زحماتت واقعا ممنون.خیلی خوب پیش میری.ولی ای کاش به زبان اسمبلی بیشتر توجه می شد و این تاپیک مثل c پر رونق میشد.
لطفا ادامه بده .من تازه دارم استفاده میکنم.
با تشکر.
 

aira

Member
سلام به دوستان عزيز و تمام كساني كخ به اين تاپيك لطف كردن.
متاسفانه من نسبت به گذشته مشغله كاريم خيلي زياد شده واي مطمئنا تمام سعيم رو ميكنم تا دوباره اين تاپيك رو پر رونق كنيم

سلامت و موفق باشيد
 

J4vad

Member
با سلام دوستان

35=(100011) ‌‌‌‹در مبناي دو›

2-اين راه خيلي آسونتره و اگه يك عدد بزرگ دادن خيلي زودتر ميشه به جواب رسيد(عدد مورد نظر را به توانهاي 2 عدد تجزيه ميكنيم تا عدد مورد نظر يا استفاده از توانهاي 2 ساخته شود.به جاي عددهايي كه داريم 1 ميگذاريم)
35=32(5^2)+3
0^2 1^2 2^2 3^2 4^2 5^2
1 1 0 0 0 1 = 35

من با شروع دانشگاه و داشتن درس اسمبلي در اين ترم مي خوام دوستان با هم كمك كنيم و اسمبلي رو به طور كامل اينجا در موردش بحث كنيم !

دوستمون در اين قسمت در روش اول درست نوشتن تبديل رو اما يك را راحت هست كه بهتر هست هميشه از اون استفاده كنيد اعداد 1 2 4 8 16 32 64 128 256 512 1024 را در نظر بگيريد مثلا داريد عدد 50 به اين گونه

1 2 4 8 16 32
0 1 0 0 1 1
50= 2 + 16 + 32
10(50)=2(110010)

يا حق .
 

mohammad323

New Member
با سلام
حیفه که تو این تاپیک یه جزوه با حال رو معرفی نکنییم
http://www.iaushab.ac.ir/prof/DrMehri/Lectures/MLSPfa.html
می تونید ار آدرس بالا دانلود جزوه کامل برنامه نویسی زبان ماشین را را که تالیف دکتر مهری می باشد را دانلود کنید.
ایشون در انجمن مجله کامپیوتری ابتکار که در امضام لینکش هست مدیر هستند.

سلام
كسي اين جزوه را داره؟!!!
ساختار سايت عوض شده و من هر چي گشتم، چيزي پيدا نكردم.
لطفا اگه كسي اين جزوه را داره، آپلود كنه.

با تشكر
 
وضعیت
موضوع بسته شده است.

جدیدترین ارسال ها

بالا