320 likes | 632 Views
زبان های ماشین و برنامه سازی سیستم. ساختار پردازنده 8086 اينتل. مهدی ایل بیگی دانشگاه آزاد اسلامی دماوند. اجزائ اصلی یک پردازشگر. واحد محاسبه و منطق (ALU) واحد محاسبه (Arithmetic Unit) واحد منطق (Logic Unit) رجيسترها واحد کنترل (Control Unit) گذرگاه مشترک (Bus) حافظه (Memory).
E N D
زبان های ماشین و برنامه سازی سیستم • ساختار پردازنده 8086 اينتل مهدی ایل بیگی دانشگاه آزاد اسلامی دماوند
اجزائ اصلی یک پردازشگر • واحد محاسبه و منطق (ALU) • واحد محاسبه (Arithmetic Unit) • واحد منطق (Logic Unit) • رجيسترها • واحد کنترل (Control Unit) • گذرگاه مشترک (Bus) • حافظه (Memory)
اجزائ اصلی یک پردازشگر ALU CU R0 R1 Rn DATA ADDRESS MEMORY
حافظه (Memory) • حافظه اصلي يک مجموعه منطقي از مکانهايي است که هرکدام بعنوان مثال ميتواند يک بايت دستورالعملها يا دادهها را ذخيره نمايد. هر بايت حافظه اصلي داراي يک برچسب عددي به نام آدرس ميباشد. 500 1000 100 1001 250 1002 محتوي 340 1003 آدرس 10 1004 410 1005 501 1006 1007 10 .... READ WRITE
حافظه 1KB*8 8bit DATA 8 BIT ADDRESS 10 BIT 1024 = 210 READ WRITE
حافظه 1MB*8 8bit DATA 8 BIT ADDRESS 20 BIT 1MB = 220 READ WRITE
حافظه 256MB*32 32bit DATA 32 BIT ADDRESS 28 BIT 256MB = 228 READ WRITE
حافظه 1MB*16 برای پردازشگر 8086 16bit DATA 16 BIT ADDRESS 20 BIT 1MB = 220 READ WRITE
آدرس 20 بيتي 000…00000 00000 20 بار FFFFF 111...11111 20 بار
بخشبندی حافظه پردازشگر 8086 BIOS F0000-FFFFF BIOS EFFFF برنامه هايBIOS 256KB BIOS BIOS C0000 BFFFF حافظه گرافيکي 128KB A0000 9 9FFFF 8 640 KB قابل استفاده توسط برنامه ها 1 00000 0
مشکل آدرسدهي در پردازشگر 8086 • در پردازشگر 8086 آدرس ها 20 بيتي است، ولی چون سلول های حافظه و رجيسترها 16 بيتي هستند، نمی توان آدرس ها را در یک سلول حافظه یا در یک رجیستر ذخیره کرد. • راه حل = استفاده از روش آدرس دهی (Segment-Offset). • در این روش حافظه به بخش (Segment)هایی به اندازه 64k تقسیم می شود. • بدلیل اینکه آدرس همه Segmentها در مبنای شانزده به 0 ختم می شود (زیرا ضرایبی از 16 هستند)، این صفر که معادل 4 بیت صفر در باینری است را در آدرس دهی ابتدای هر Segment در نظر نمی گیریم و در نتیجه می توانیم آدرس هر Segment را با 16 بین نمایش دهیم. 64KB 64KB 64KB
ابتداي سگمنت Offset 0000 • Offset برابر است با آدرس یک سلول از حافظه، درون یک Segment، که برابر با فاصله سلول مورد نظر در حافظه، از ابتداي Segment می شود. • برای آدرس دهی هر سلول از حافظه، در هر Segment نياز به 16 بيت داريم. X 64KB = 216 FFFF
آدرسدهي SEG:OFF RAM SEGMENT : OFFSET ACF2 ACF2:CF12 CF12 SEGMENT
تبدیل آدرس SEG:OFF به آدرس 20 بیتی • مرحله اول: با اضافه کردن صفر حذف شده، آدرس واقعي سگمنت را توليد مي کنيم. • مرحله دوم: جمع آدرس شروع سگمنت با آفست. • مثال: آدرس 2FC4:412A را به آدرس 20 بيتي تبديل نماييد: 2FC40 + 412A ------------------- 33D6A
اجزاء يک برنامه اسمبلي • Code Segment: دستورات برنامه در این قطعه قرار دارند. • نکته: هر برنامه، لزوما باید یک Code Segment داشته باشند. • Data Segment: اگر برنامه نیاز به تعریف متغییر داشته باشد، این ناحیه را داریم. • Stack Segment: آدرس های محل های بازگشت در موقع فراخوانی زیر برنامه ها و ...، در این ناحیه که در واقع یک پشته است ذخیره می شوند. • Extra Segment: برای ذخیره اطلاعات بعنوان بخش اضافی و در دستورات کار با رشته و ...، از این ناحیه استفاده می شود.
اجزاء يک برنامه اسمبلي RAM DATA SEG DATA CODE SEG CODE STACK SEG CODE STACK EXTRA SEG DATA EXTRA EXTRA STACK
انواع رجیسترها • رجيسترهاي سگمنت • رجيسترهاي داده • رجيسترهاي اشاره گر • رجيسترهاي شاخص • رجيستر دستورالعمل • رجیستر پرچم
Segment Registers • این رجیسترها، آدرس شروع Segmentهای برنامه را نگهداري مي کنند. 15 0 CODE SEGMENT(CS) 15 0 STACK SEGMENT (SS) 15 0 DATA SEGMENT(DS) 15 0 EXTRA SEGMENT(ES)
رجیسترهای داده در 8086 • ثباتهاي AX، BX، CX، DX را ثباتهاي دادهاي يا ثباتهاي همگاني ميگويند. • ثبات AX را با توجه به اينکه بسياري از نتايج محاسبات در آن قرار ميگيرند، گاهي آکومولاتور (Accumulator) نیز مينامند. 15 0 AX 15 0 BX 15 0 CX 15 0 DX
رجیسترهای داده در 8086 • بعضی از دستورالعملهای زبان ماشین، بطورخاص، نیاز به یکی از این ثبات ها دارد. اما در مورد بعضی دیگر از دستورالعمل ها، استفاده از هر یک از این ثبات ها، تفاوتی نمی کند. • استفاده های خاص از ثبات های داده ای: • AX : برای انجام محاسبات استفاده می شود. (ضرب و تقسیم) • BX : به عنوان ثبات پایه جهت آدرس دهی استفاده می شود. • CX : به عنوان ثبات شماره استفاده می شود. • DX : بیشتر برای عملیات رشته ای استفاده می شود.
رجیسترهای داده در 8086 • هر کدام از ثباتهاي AX، BX، CX، DX را ميتوان به صورت دو ثبات 8 بيتي مستقل يعني نصف بالا براي 8 بيت سمت چپ و نصف پائين براي 8 بيت سمت راست، استفاده نمود. • در اينجا حروف H و L به ترتيب قسمت بالائي (High)و پائيني (Low) ثباتها را نشان ميدهند. 8 7 15 0 AH AL 8 15 7 0 BH BL 15 8 7 0 CH CL 8 15 7 0 DH DL
رجيسترهاي داده در PENTIUM • رجیسترهای داده در Pentium، 32 بیتی هستند. • نام این رجیستر ها EAX, EBX, ECX, EDX است که حرف E سرنام Extended و به معنی توسعه یافته می باشد. 31 0 EAX 31 0 EBX 31 0 ECX 31 0 EDX
رجيسترهاي اشاره گر • اشاره گر پشته: در هر لحظه آدرس عنصر بالايي پشته را نگهداري مي کند. • اشاره گر پايه: در روش هاي آدرس دهي مورد استفاده قرار مي گيرد. 15 0 STACK POINTR (SP) 15 0 BASE POINTER (BP)
رجيسترهاي شاخص (Index Registers) • در بعضی از دستورالعملهای زبان اسمبلی برای انتقال رشته ها و کار با حافظه از ثباتهای شاخص استفاده می کنیم. • دو رجیستر شاخص بنام های رجيستر مبدا (Source) و رجيستر مقصد (Destination)، براي انتقالات بلوکي داده ها استفاده می شوند. 15 0 SOURCE INDEX (SI) 15 0 DESTINATION INDEX (DI)
اشاره گر دستورالعمل • ثبات اشاره گر دستورالعمل IP (Instruction Pointer)، آدرس دستورالعملي که بايد اجرا شود را نگهداري مي کند. • این ثبات 16 بيتي است و با اجراي هر دستور توسط واحد کنترل، يک واحد افزايش مي يابد. • بعنوان مثال دستورات پرش با تغییر این ثبات باعث می شوند که برنامه از هر محل دیگری قابل اجرا باشد.
ثبات پرچم (Flag Register) R = Reserved ZF = Zero Flag OF = Overflow U = Undefined DF = Direction Flag AF = Auxiliary Flag IF = Interrupt Flag PF = Parity Flag TF = Trap Flag CF = Carry Flag SF = Sign Flag
ثبات پرچم (Flag Register) • Carry Flag: (بیت نقلی) معمولا، از محاسبات تاثیر می پذیرد. برای اعمال جمع و تفریق از این بیت، برای رقم نقلی استفاده می گردد. در اعمالی مانند Shift دادن بیتها، آخرین بیت Shift داده شده، در این بیت قرار می گیرد. همچنین اگر در اعمال بر روی اعداد بی علامت سرریز رخ دهد این بیت یک می شود. • Parity Flag: از این بیت، معمولا برای اشکال زدایی در انتقال اطلاعات استفاده می شود. به عبارت دیگر، برای کنترل صحت اطلاعات به کار می رود. این بیت براساس تعداد بیت های یک (1)، در 8 بیت پایینی رجیسترها، یک یا صفر خواهد شد. به عنوان مثال اگر سیستم ما Parity فرد باشد، در این صورت اگر تعداد بیت های یک در 8 بیت فرد باشد، آنگاه بیت Parity صفر می شود و اگر تعداد بیت های یک زوج باشد، این بیت یک خواهد شد. • Auxiliary Flag: از این بیت، به عنوان بیت جانشین بیت Carry استفاده می شود. اگر این بیت یک باشد از بیت 3 به بیت 4 رقم نقلی داشته ایم.
ثبات پرچم (Flag Register) • Zero Flag: در صورتی که نتیجه عمل محاسباتی 0 شده باشد، مقدار این بیت، 1 می شود. در غیر این صورت این بیت 0 خواهد شد. • Sign Flag: علامت نتیجه محاسبه شده در دستور اجرا شده قبلی را نشان می دهد. اگر آخرین بیت 0 باشد علامت مثبت و اگر این بیت 1 باش علامت نتیجه منفی است. • Trap Flag: برای اجرای دستور به دستور برنامه، از این بیت استفاده می شود. اگر این بیت، 1 باشد، برنامه به صورت دستور به دستور اجرا می گردد و می توان برنامه را Trace کرد. • Interrupt Flag: با استفاده از این بیت، می توانیم کاری کنیم که وقفه ها، فعال یا غیر فعال گردند. IF=0 وقفه ها غیر فعال IF=1 وقفه ها فعال
ثبات پرچم (Flag Register) • Direction Flag: از این بیت، برای نمایش جهت عملیات، بر روی رشته ها استفاده می شود. مثالا جهت عملیات مقایسه یا انتقال رشته را مشخص می نماید. DF=1 Right to Left DF=0 Left to Right • Overflow: در صورتی که عمل محاسباتی بر روی اعداد علامتدار دارای سرریز باشد، مقدار این بیت، 1 می شود و در غیر این صورت 0 خواهد شد.
تمرین • حاصل تفریقهای زیر را بدست آورده و مقادیر پرچمهای CF, AF, OF, SF, ZF, PF را مشخص نمایید • 10100100 - 10101011 • 11111111 - 10000000 • 10000000 - 100000 • 10 - 1010101 • 11101 - 10 • راهنمایی: ابتدا همه اعداد را در 8 بیت نمایش دهید.