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



ارسال موضوع  ارسال پاسخ 
 
امتیاز موضوع:
  • 1 رأی - میانگین امیتازات : 5
  • 1
  • 2
  • 3
  • 4
  • 5

آموزش زبان اسمبلی

نویسنده پیام
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #1
آموزش زبان اسمبلی
مقدمه:
زباني كه كامپيوتر با آن كار مي كند زبان ماشين (Machine Language) نام دارد كه از يك سري 0 و1 تشكيل شده است. چون كار كردن و فهم زبان ماشين مشكل است بنابر اين سازندگان كامپيوتر زباني به نام زبان اسمبلي را عرضه كردند كه بسيار به زبان ماشين نزديك است و تقريباً همان قدرت را دارد.
زبان اسمبلي نياز به يك مترجم به نام اسمبلر(Assembler) دارد تا دستورات زبان اسمبلي را به 0 و1 معادل آن دستورات كه براي كامپيوتر قابل فهم است ترجمه كند. بايد توجه داشت كه زبان اسمبلي هر كامپيوتر تابع ساختارهاي سخت افزاري آن كامپيوتر ميباشد و در نتيجه زبان اسمبلي كامپيوترهاي مختلف با هم فرق مي كند و به اين خاطر زبان اسمبلي يك زبان سطح پايين (Low Level Language) است ولي زبانهايي مانند پاسكال ، فاكس پرو، بيسيك و ... زبانهاي سطح بالا (High Level Language) و زبانهايي مانند C وC++ و... زبانهاي سطح ميانه اند (Middle Level Language).
زبانهاي سطح بالا و سطح ميانه تابع مشخصات سخت افزاري نيستند و اصولاً بر هر كامپيوتري قابل اجرا و يكسان مي باشند. ولي مزيت زبان اسمبلي بر اين زبانها اين است كه آنها به صورت مستقيم بر امكانات سخت افزاري دسترسي ندارند و در نتيجه از امكانات سخت افزاري به صورت مؤثر بهره نمي برند و اين به اين معني است كه برنامه هايي كه به اين زبانها نوشته مي شوند از برنامه هايي كه توسط زبان اسمبلي يا زبان ماشين نوشته مي شوند 100 ها برابر كندتر هستند. علاوه بر اين در زمانهايي كه مي خواهيم ماشين آلات صنعتي مانند ماشينهاي بافندگي ، ماشين ابزار ، ماشين تنظيم موتور اتومبيل، ماشينهاي برش و ... را برنامه ريزي كنيم ، نياز به مشخصات و اطلاعات دريافتي از سخت افزار داريم و بايد نظارت مستقيم و همه جانبه به سخت افزار داشته باشيم. بنابر اين برنامه نويسي در اينگونه موارد بوسيله ي زبان اسمبلي يا زبان ماشين ممكن است. و علاوه بر اينها تمامي سيستم عاملها از جمله MS DOS،Windows 95، Windows 98، Windows ME ،Windows NT ، Windows 2003 ،Windows 2000، Windows XP ، Windows Vista، Mandrake Linux ، Fedora Linux ، SuSE Linux ، Lindows (Linspire) ، Mac OS ، Unix و هر سيستم عامل ديگري كه ساخته شود همگي با زبان اسمبلي نوشته شده و مي شوند. علاوه بر اين برنامه هاي ديگري نيز وجود دارند كه تنها با استفاده از زبان اسمبلي مي توان آنها را نوشت.
از آنجا كه دستورات زبان اسمبلي براي تمامي كامپيوترهاي شخصي (به علت داشتن ساختار سخت افزاري مشابه) يكسان است و از طرفي پيشنياز فراگيري اين زبان ، دانستن اصول سخت افزار كامپيوترها و نقش سيستم عامل در اجراي دستورات كاربر است، بنابراين دانستن مطالبي در مورد اصول سخت افزار كامپيوترهاي شخصي و سيستم عامل ضروري است.
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۲ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #2
RE: آموزش زبان اسمبلی
اصول زبان ماشين و زبان اسمبلي
تمام كامپيوترها برنامه هاي به زبان ماشين را اجرا مي كنند. اين زبان در حقيقت تنها از 0 و 1 ها تشكيل شده است. در واقع زبان ماشين يك سري بيت هاي 0 و1 است كه كامپيوتر بوسيله ي آنها مي فهمد چه كاري را بايد انجام دهد. زبان ماشين از نظر انسانها بسيار پيچيده و گنگ است، براي همين به جاي زبان ماشين از زبان اسمبلي كه زباني سمبوليك است استفاده مي كنيم.
ما در ابتدا برنامه ها را به زبان اسمبلي مي نويسيم و سپس برنامه را بوسيله ي برنامه ي مترجم اسمبلر به برنامه ي زبان ماشين تبديل مي كنيم و سپس آن را اجرا مي نماييم.
ساختار كامپيوتر:
كامپيوتر داراي دو قسمت سخت افزار و نرم افزار است. سخت افزار كامپيوتر شامل مدارهاي الكترونيكي و الكترومكانيكي و نرم افزار آن از برنامه ها تشكيل شده است. براي كسي كه برنامه ايي به زبان اسمبلي مي نويسد اطلاع از طرز كار قسمتهاي مختلف و سخت افزار كامپيوتر بسيار ضروري است.
كامپيوتر دستگاهي است كه اطلاعات ديجيتالي را به عنوان ورودي مي گيرد و بر طبق دستوراتي كه در حافظه دارد يك سري اعمال و عمليات روي آنها انجام مي دهد و خروجي مورد نظر را توليد مي كند. كامپيوتر ها به انواع مختلفي از نظر سرعت و قدرت و كاربرد تقسيم بندي مي شوند. مانند كامپيوتر هاي شخصي (Personal Computer)، كامپيوترهاي WorkStation ، كامپيوترهاي Main Frame و سوپر كامپيوترها (Super Computer) ولي هر كامپيوتري از واحدهاي : ورودي ، خروجي ، حافظه، محاسبه و منطق (ALU= Arithmetic & Logical Unit)، گذرگاه (BUS) ، واحد كنترل و يك سري ثبات (Registers) تشكيل شده است. مجموعه ي واحد محاسبه و منطق و واحد كنترل و ثباتها را پروسسور يا CPU مي نامند كه وظيفه ي آن اجراي دستورات است.
واحد پروسسور يا CPU:
وظيفه ي اين واحد اجراي دستورات برنامه هاي كامپيوتر مي باشد كه از واحد محاسبه ومنطق و واحد كنترل و يك سري ثبات جهت درج اطلاعات و اعداد در آنها تشكيل شده است. عمليتها و دستورات در واحد محاسبه و منطق انجام مي شود و واحد كنترل وظيفه ي كنترل قسمتهاي مختلف كامپيوتر را داراست.
واحد ورودي:
مهم ترين واحد ورودي صفحه كليد (Keyboard) است كه اطلاعات را وارد كامپيوتر مي كند. اطلاعات شامل داده ها (Data) و دستورات برنامه كامپيوتري هستند. هر دستور شامل دو قسمت است. قسمتي به نام كد اجرا (Operation Code) و قسمت ديگري كه آدرس اطلاعات يا عملوند (Operand) مي باشد. كه معمولاً 32 بيت ( 8 بيت براي كد اجرا و 24 بيت براي آدرس اطلاعات) را اشغال مي كنند.
واحد حافظه:
حافظه ي اصلي كامپيوتر داراي يك سري سلولهاي حافظه از جنس نيمه هادي مي باشد كه هر كدام دو وضعيت را شامل مي شوند(بيت). معمولاً مجموعه ي 8 بيت از اين سلولها را كه به طور همزمان نوشته يا خوانده مي شوند يك بايت (Byte) مي نامند. البته در كامپيوتر هاي سريعتر و پر قدرت تر مجموعه هاي 16 يا 32 يا 64 بيتي استفاده مي شود كه به آن كلمه (Word) گفته مي شود. براي دستيابي به خانه هاي حافظه (بايت يا كلمه) به هر كدام از آنها يك آدرس تخصيص داده مي شود و همچنين دستورات نيز كه در حافظه قرار ميگيرند هر كدام شامل آدرس مجزايي مي شوند. اگر بخواهيم اطلاعات را از يك خانه حافظه بخوانيم بايد آدرس آن خانه از حافظه به حافظه داده شود و فرمان خواندن از واحد كنترل كامپيوتر براي حافظه ارسال گردد. مدت زماني كه نياز است تا اطلاعات در حافظه نوشته يا از آن خوانده شود زمان دستيابي حافظه (Access Time) گويند.
واحد خروجي:
نتيجه محاسبات بوسيله ي واحد خروجي ، در اختيار كاربر قرار مي گيرد. متداول ترين وسايل خروجي عبارتند از مانيتور و انواع چاپگرها
باس يا گذرگاه:
ارتباط مداومي بين پروسسور و هر يك از دستگاه هاي ورودي و خروجي و حافظه برقرار است. ارتباط بين پروسسور و واحدهاي مختلف بوسيله ي سيمهايي به نام باس انجام مي شود. دركامپيوترهاي معمولي معمولاً تعداد اين سيمها بين 40 تا 200 سيم است. باس به قسمتهاي مختلفي تقسيم مي شود كه عبارت اند از: 1- باس آدرس: كه آدرس دستگاه هاي ورودي و خروجي روي آن قرار دارد 2- باس ديتا يا داده: كه اطلاعات از آنجا انتقال مي يابد. 3- باس كنترل: كه شامل و انتقال دهنده ي دستورات كنترلي است.
سيستم عامل:
سيستم عامل مجموعه ايي از برنامه هاي كامپيوتري به زبان ماشين است كه وظيفه ي نظارت و هدايت عملياتهاي كامپيوتر را دارد. درحقيقت سيستم عامل در نقش يك رابط ميان ماشين و انسان است. يعني رابطي بين كاربر و سخت افزار. به اين ترتيب سيستم عامل نرم افزاري است كه عمليات كامپيوتر ، انتقال اطلاعات بين دستگاه ورودي ، خروجي و .. را كنترل و نظارت مي نمايد. علاوه بر اين وظيفه ي ترجمه ي برنامه هاي كاربر ، فراهم ساختن تسهيلات براي ذخيره و بازيابي اطلاعات از ديسك و فراهم آوردن وسائل ارتباط ساده انسان با سخت افزار را دارد.
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۲ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
2 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده اند. مهشید18, fasleshisheii
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #3
RE: آموزش زبان اسمبلی
نمايش اطلاعات در كامپيوتر:
در كامپيوتر از سيستم اعداد باينري (Binary) كه از رقم هاي صفر و يك تشكيل شده است ، استفاده مي شود كه هر يك از اين ارقام را يك بيت (BIT) يا يك رقم باينري مي نامند و مبناي اين اعداد 2 مي باشد. چون كار با سيستم ده دهي براي انسانها آسان تر است بنا بر اين در اين قسمت به تبديل مبناي دو به ده و ده به دو مي پردازيم و همچنين چون در كامپيوتر ها از مبناي 16 هم زياد استفاده مي شود ، تبديل مبناهاي فوق به مبناي 16 و برعكس را نيز بيان مي كنيم و در نهايت به چگونگي جمع و تفريق در مبناي دو و 16 خواهيم پرداخت.
تبديل اعداد ده دهي به اعداد باينري:
اعداد باينري يا دودويي از دو رقم 0 و 1 تشكيل شده اند. براي تبديل اعداد در مبناي 10 به مبناي دو ابتدا عدد را بر 2 تقسيمات متوالي مي كنيم و باقيمانده ها را تا زماني كه خارج قسمت صفر شود در نظر مي گيريم به عنوان مثال عدد 23 در مبناي ده برابر عدد 11101 در مبناي 2 است.
23/2 = 11 باقيمانده 1
11 / 2 = 5 باقيمانده1
5 / 2 = 2 باقيمانده1
2 / 2 = 1 باقيمانده0
1/2=0 باقيمانده1
-------------------------------
2(11101)
براي تبديل قسمت اعشاري نيز با ضرب آن قسمت در 2 و برداشتن قسمت صحيح و ادامه دادن ضربها تا زماني كه قسمت كسري برابر صفر شود ، قسمت اعشاري در مبناي دودويي را بدست مي آوريم. به عنوان مثال عدد 23.6875 برابر است با 2(11101.1011):
0.6875 * 2 = 1.3750
0.3750 * 2 = 0.7500
0.7500 * 2 = 1.5000
0.5000 * 2 = 1.0000
---------------------------
2(0.1011)

تبديل اعداد دودويي به دهدهي:
براي تبديل اعداد دودويي به دهدهي هر بيت را شماره گذاري كرده و سپس اعداد درون بيت را در 2 به توان آن شماره ضرب مي كنيم. براي مثال عدد دودويي 2(1001.1101) برابر عدد ۹.۸۱۲۵ در مبناي ده است:
3 2 1 0 . -1 -2 -3 -4
--------------------------------------
1 0 0 1 . 1 1 0 1
--> (1*23) + (0*22) + (0*21) + (1*20) + (1*2-1) + (1*2-2) + (0*2-3) + (1*2-4) = 9.8125

بايت، كلمه ، كلمه مضاعف:
8 بيت را يك بايت گويند. با 8 بيت ميتوان اعداد 0000 0000 تا 1111 1111 را نمايش داد يعني اعداد 0 تا 255. همچنين اين 256 تركيب را مي توان ، نشانه ايي از يك كاراكتر در نظر گرفت. به عنوان مثال بايت 00101010 نمايش علامت ستاره (*) ميباشد. اگر در صفحه كليد علامت * فشرده شود كد فوق توليد مي گردد ولي اگر ما بخواهيم عدد باينري 00101010 را توليد كنيم بايد آن بصورت زير بنويسسم:
00101010B
در كامپيوترهاي شخصي تعداد دو بايت را يك كلمه نامند و تعداد چهار بايت را كلمه ي مضاعف گويند.
اعداد مبناي 16 (Hexadecimal):
سيستم اعداد مبناي 16 از ارقام 0 تا 9 بعلاوه رقم هاي A وB وC وD وE وF تشكيل شده است، كه رقم A معادل 10، رقم B معادل 11، رقم C معادل 12، رقم D معادل 13، رقم E معادل 14 و رقم F معادل 15 ميباشد. در كامپيوتر يك عدد مبناي 16 را با قرار دادن كاراكتر Hدر سمت راست آن عدد مشخص مي كنند مانند: 56F2H
تبديل اعداد مبناي 16 به مبناي 10 و برعكس:
براي اين كار مانند تبديل در مبناي 2 عمل مي شود ولي بايد تقسيمات و يا ضرب كردنها به جاي 2 در 16 انجام پذيرد. همچنين براي تبديل از مبناي 16 به مبناي 10 نيز پايه ي توان هر بيت بجاي 2 ، 16 خواهد بود.
تبديل اعداد مبناي دو به مبناي 16:
ابتدا عدد دودويي را 4بيت4بيت از راست جدا كرده و سپس معادل مبناي 16 هر قسمت را مي نويسيم. با كنار هم قرار دادن رقم ها عدد مورد نظر در مبناي 16 به دست مي آيد به عنوان مثال عدد 2(1010110111) برابر 16(2B7) است:
0010 1011 0111
------- ------- -------
2 B 7
تبديل اعداد مبناي 16 به مبناي دو:
براي اين كار ابتدا هر رقم مبناي 16 را جدا كرده و معادل آن را در مبناي دو به دست مي آوريم. و با قرار دادن ارقام در كنار هم عدد در مبناي 2 به دست مي آيد. براي مثال 16(9E6) برابر 2(100111100110) است:
9 E 6
------- ------- -------
1001 1110 0110
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۴ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

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


براي اسمبل كردن يك برنامه توسط اسمبلي بايد به يك اسمبلر دسترسي داشت . كه اين كار را ميتوان توسط يك نرم افزار ويژه انجام داد كه عموما از اسمبلرهاي 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 را بزنيد . كه كار كردن با اين محيط اموزش ويژه اي را ميطلبد.
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۵ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

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

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 بدم.


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

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


نكته:با عوض كردن بيت علامت عدد منفي نميشود
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 در مبناي دو برابر چه عدد يا عددهايي است؟
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۵ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

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

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


مبناي 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 معادل چه عددي است؟
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۷ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #7
RE: آموزش زبان اسمبلی
يكي ديگر از مبحث هايي كه در زبان اسمبلي شما خيلي استفاده ميكنيد جمع و تفريق مبناها است.

جمع:
مثل جمع كردن معمولي هست وزياد فرق نميكنه.
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
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۸ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #8
RE: آموزش زبان اسمبلی
درباره رجيسترها چند مطلب ديگه هم مانده كه در اينجا ميگم.
از پردازنده هاي 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
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۸ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #9
RE: آموزش زبان اسمبلی
دستورهاي اجرايي اسمبلي
حالا ميخواهيم به رجيتسرها مقدار بدهيم و آنها را بخوانيم و ... . ما معمولا در
زبانهاي ديگر از علامت =(يا =ا براي مقدار دهي استفاده ميكنيم ولي در زبان
اسمبلي اين كار ممكن نيست . در عوض از دستورالعمل 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 غلطه؛چرا
2- چون 300 بيشتر از يك بايت است
3- انتقال از حافظه امكان ندارد
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۱۹ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
1 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده است. مهشید18
*
ارسال ها: 351
اعتبار: 0
سپاس کرده: 0
سپاس شده: 95 در 81 موضوع

امتياز: 101.00

ارسال: #10
RE: آموزش زبان اسمبلی
قبل از اينكه ادامه دستورهاي اسمبلي رو خدمتتون عرض كنم؛توضيحي درباره ي رجيستر وضعيت و كنترل(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
در اين دستور يك طرف حتماً بايد رجيسترباشد.
يك شنبه ۲۲ بهم ۱۳۸۵ ۱۶:۲۰ عصر
یافتن تمامی ارسال های این کاربر سپاس نقل قول این ارسال در یک پاسخ
3 کاربر به دلیل این ارسال از mohsenktm سپاسگزاری کرده اند. ZIVAR, مهشید18, saeid_salsa
ارسال موضوع  ارسال پاسخ 






تالار گفتمان اف دی ال - انجمن تخصصی دانلود رایگان - تالار گفتگوی ایرانیان © 1396.