لینک دانلود و خرید پایین توضیحات
فرمت فایل word و قابل ویرایش و پرینت
تعداد صفحات: 114
آموزش اسمبلی
برای یاد گرفتن اسمبلی باید با مبناهای عدد نویسی ، ساختمان داخلی کامپیوتر و برنامه نویسی آشنا باشیم . ما برنامه هایمان را مستقیما با اسمبلر Macro Assembler خواهیم نوشت و گاها از Debugاستفاده خواهیم کرد . بعلاوه چون برنامه های حجیم نخواهیم نوشت قالب اکثر رنامه های ما COM. خواهد بود . برای شروع ابتدا نگاهی به حافظه میکنیم : حافظه و آدرس دهی هر کامپیوتر مبتنی بر 8086 دارای حداقل 640 کیلوبایت حافظه است . این 640 کیلوبایت به قطعات 64 کیلوبایتی تقسیم شده و ما این قطعات را "قطعه " یا Segmentمینامیم . هر سگمنت هم به خانه های تک بایتی دیگری تقسیم شده است . برای بدست آوردن مقدار یک بایت مشخص از حافظه ما باید عد مربوط به سگمنت و همچنین شماره آن بایت در سگمنت ( که آفست Offset نامیده میشود ) را بدانیم . مثلا اگر مقدار مورد نظر در قطعه 0030h(h( یعنی عدد در مبنای 16 است ) و آفست 13C4hباشد ما باید قطعه ای که شماره آن 0030h است را بیابیم و بعد در همان قطعه مقدار باین شماره 13C4 را بخوانیم . برای نمایش این حالت بین عدد سگمنت و آفست علامت (:) قرار میدهیم . یعنی ابتدا عدد مربوط به قطعه را نوشته و سپس عدد آفست را می آوریم : Segment:Offset مثال : 4D2F:َ9000 **همیشه در آدرس دهی ها از اعداد مبنای 16 استفاده میکنیم . | | | | CConvertional | 1 Segment=64K | | | | | Memory | | | | | | | | | | | | | | ثباتها Registers رجیسترها مکان هائی از CPU هستند که برای نگهداری داده ها (DATA) و کنترل اجرای برنامه بکار میروند . ما میتوانیم آنها را مقدار دهی کرده و یا بخوانیم و یا باتغییر محتوای آنها CPU را مجبور به انجام یک پروسه (رویه یا Procedure) کنیم دسته ای از رجیسترها که ما انها را "ثباتهای همه کاره یا همه منظوره " میخوانیم و شامل AX/BX/CX/DX هستند ، برای انتقال مقادیر بین رجیستر ها و CPU بکار میروند.این ثباتها را میتوانیم به هر نحوی تغییر دهیم و مقادیری را به آنهاارسال کنیم . ثباتهای دیگری هم که نام میبریم کاربردهای خاص خودشان را دارند و برای مقدار دهی آنها باید قواعد خاصی (که توضیح خواهیم داد) را بکار بریم . میکند عدد که در این ثبات وجود دارد شماره یک قطعه است و CPU برای یافتن DS : مخفف Data Segment . محل نگهداری متغییرها و ثابتهای برنامه را مشخص مقادیر لازم به آن قطعه مراجعه میکند . CS: مخفف Code Segment است و آدرس قطعه ای که برنامه در آن قرار گرفته را نشان میدهد . ES: این یک ثبات کمکی است و معمولا در آدرس دهی ها شماره قطعه را نگهداری میکند . DIDataIndex:Dبا DS/ESا مرتبط است و عدد آفست را نگهداری میکند . IP: این رجیستر معلوم میکند که برنامه در حال اجرائی که در CS قرار دارد از کدام بایت قطقه (یعنی کدام آفست ) شروع میشود . به همین دلیل همیشه این دو ثبات را با هم و بصورت CS:IP نشان میدهند. و ... تمام رجیسترهای فوق 16 بیتی (دوبایتی ) هستند و اعداد دوبایتی را نگهداری میکنند. ثباتهای همه منظوره به دو نیم ثبات تک بایتی تقسیم میشوند . بایت بالائی ب نماد H و بایت پائینی با نماد L نشان داده میشود . مثلا ثبات AX دارای دو نیم - ثبات AH/AL است : | AH - 8 Bit | AL -8 Bit | تمرین : برای دیدن رجیسترها در DOS، DEBUG، را اجرا کنید و فرمان R را صادر کنید : D:\MASM>DEBUG-RAX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=17AA ES=17AA SS=17AA CS=17AA IP=0100 NV UP EI PL NZ NA PO NC17AA:0100 0F
بیایید یک برنامه بنویسیم
در این قسمت میخواهیم با استفاده از مطالبی که در بخشهای قبلی یاد گرفتیم برنامه ای بنویسیم که کامل و قابل استفاده باشد . با این برنامه میتوانیم فلاپی دیسکهای خودمان را با سرعت کپی کنیم ! امروز برنامه را به شکلی مینویسیم که بتواند دیسکهای 1.44 را بوسیله درایو A کپی کند . بیشتر نیاز ما در کپی (تکثیر) دیسکها هم به همین شکل هست . با اینحال در قسمت بعدی نگارش (Version) جدیدتری از برنامه را مینویسیم و قابلیت تشخیص نوع دیسک و قابلیت مشخص کردن درایو را به آن اضافه میکنیم . بهترین کاری که میتوانیم بکنیم اینست که بتوانیم داده های خوانده شده از دیسک را در حافظه EMS بنویسیم (در این نسخه روی هارددیسک مینویسیم ) . وقتی که نحوه کار را حافظه گسترش یافته (Extended Memory) را هم یاد گرفتیم ، برنامه خود را کامل کرده و از آن بعنوان اولین دستختمان در برنامه نویسی اسمبلی لذت میبریم . لیست برنامه در زیر قرار دارد و توضیحات برنامه را روی آن میبینیم قبل از آن یاد آوری میکنم که هر دیسک HD َ1.44 دارای دو طرف و در هر طرف 80 شیار (Track) بوده و هر شیار هم به 18 بخش بنام قطاع (Sector) تقسیم میشود . برنامه ما باید محتوای تمام این قطاعها را خوانده و در فایلی روی دیسک سخت ذخیره کند. سپس همین داده ها را از فایل خوانده و مجددا روی دیسک جدید بنویسد. طول هر قطاع 512 بایت است EQU 512 SECTORSIZEتعداد شیار ها 80 شیار (79- 0-) است EQU 79 MAXTRACKهر دیسک دو طرف دارد EQU 2 NUMSIDESتعداد سکتور در هر شیار 18 تا است EQU 118 SECTOR_PER_TRACK E.MODEL SMALL.CODEORG 100HSTART:JMP MAINبافر برای ذخیره (0)BUF DB SECTORSIZE*SECTOR_PER_TRACK DUP
تحقیق درباره اسمبلی