X
تبلیغات
پیکوفایل
رایتل
شما در این وبلاگ میتوانید ترفند های کامپیوتر ورجستری وهمچنین آموزشهای بعضی از نرم افزارها وقسمتهای مهم کامپیوتر را یاد بگیرید.
جمعه 18 دی‌ماه سال 1388
آموزش زبان اسمبلی

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

اصول زبان ماشین و زبان اسمبلی
تمام کامپیوترها برنامه های به زبان ماشین را اجرا می کنند. این زبان در حقیقت تنها از 0 و 1 ها تشکیل شده است. در واقع زبان ماشین یک سری بیت های 0 و1 است که کامپیوتر بوسیله ی آنها می فهمد چه کاری را باید

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- باس کنترل: که شامل و انتقال دهنده ی دستورات کنترلی است.
سیستم عامل:
سیستم عامل مجموعه ایی از برنامه های کامپیوتری به زبان ماشین است که وظیفه ی نظارت و هدایت عملیاتهای کامپیوتر را دارد. درحقیقت سیستم عامل در نقش یک رابط میان ماشین و انسان است. یعنی رابطی بین کاربر و سخت افزار. به این ترتیب سیستم عامل نرم افزاری است که عملیات کامپیوتر ، انتقال اطلاعات بین دستگاه ورودی ، خروجی و .. را کنترل و نظارت می نماید. علاوه بر این وظیفه ی ترجمه ی برنامه های کاربر ، فراهم ساختن تسهیلات برای ذخیره و بازیابی اطلاعات از دیسک و فراهم آوردن وسائل ارتباط ساده انسان با سخت افزار را دارد.
یافتن تمام ارسال‌های این کاربر
نقل این ارسال در یک پاسخ
Sunday 11 Feb 2007, 15:14 PM
شماره : #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
یافتن تمام ارسال‌های این کاربر
نقل این ارسال در یک پاسخ
Sunday 11 Feb 2007, 15:15 PM
شماره : #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 را بزنید . که کار کردن با این محیط اموزش ویژه ای را میطلبد.
Sunday 11 Feb 2007, 15:15 PM
شماره : #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 در مبنای دو برابر چه عدد یا عددهایی است؟
Sunday 11 Feb 2007, 15:17 PM
شماره : #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 معادل چه عددی است؟
Sunday 11 Feb 2007, 15:18 PM
شماره : #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
Sunday 11 Feb 2007, 15:18 PM
شماره : #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
Sunday 11 Feb 2007, 15:19 PM
شماره : #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- انتقال از حافظه امکان ندارد
Sunday 11 Feb 2007, 15:20 PM
شماره : #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
در این دستور یک طرف حتماً باید رجیسترباشد