دانشگاه شهید بهشتی
ترم اول ۹۱-۹۰

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

گروه درسی بر روی گوگل
استاد : دکتر احمد محمودی
کمک درس : عباس نادری ، علیرضا زباندان
کمک تدریس | زبان ماشین و اسمبلی - دانشگاه شهید بهشتی - ترم اول سال تحصیلی ۹۱-۹۰ | تمرینات سری اول
آخرین به روز رسانی : ۲۶ مهر ۹۰

تمرینات سری اول


ساختار دستورات

نکته : برخی از تمرینات این سری احتیاج به ابزارهای اسمبلر، لینکر و دیس‌اسمبلر دارند. توصیه اکید می‌شود که یک نسخه از سیستم عامل Ubuntu ترجیحا بر روی ماشین مجازی به همراه نرم‌افزار build-essentials نصب داشته باشید.

  1. تمرین اول : اندازه دستور

    یک ماشین با ۶۴ کیلوبایت حافظه داریم. دستورات ماشین تک آدرسه هستند (یعنی هر دستور یک اپراند دارد) اندازه کلمات ماشین نیز ۸ بیتی است. این ماشین تعداد ۲۰۰ دستور مختلف دارد. با ذکر محاسبات :

    1. بزرگترین برنامه‌ای که در این ماشین جای می‌گیرد، چند دستور دارد؟
    2. اندازه ثبات آدرس حافظه (MAR) و ثبات داده حافظه (MDR) به ترتیب چند بیتی باید باشد؟
    3. با ذکر استدلال، ثبات‌های چند منظوره این مایشن باید چه اندازه باشند؟

  2. تمرین دوم : اندازه دستوارت پیشرفته

    یک ماشین با ۱۰۰ کیلوبایت حافظه موجود است. دستورات این ماشین صفر آدرسه، یک آدرسه و دو آدرسه هستند. ۱۵ دستور صفر آدرسه، ۳۰ دستور یک آدرسه و ۴۵ دستور دو آدرسه کل دستورات این مایشن را تشکیل می‌دهند.

    1. با فرض اندازه کلمات ۱۶ بیتی، MAR و MBR باید چند بیتی باشند؟
    2. با فرض اندازه کلمات ۱۳ بیتی، MAR و MBR باید چند بیتی باشند؟
    3. یک برنامه شامل هزار دستور در این ماشین، حداقل چقدر حافظه اشغال می‌کند؟

  3. تمرین سوم : شمارنده برنامه

    با فرض اینکه دستگاه سوال قبل، ثبات شمارنده برنامه (PC) نداشته باشد، به سوالات زیر پاسخ دهید:

    1. برای تشخیص دستور بعدی در سیر اجرایی دستورات، از چه مکانیزمی‌ می‌توان بهره جست؟
    2. یک برنامه شامل هزار دستور در این ماشین، حداقل چقدر حافظه اشغال می‌کند؟

  4. تمرین چهارم : معماری دستورات

    با معماری دستورات IA-32 در کلاس درس آشنایی خوبی پیدا کرده‌اید. ۳ معماری دستور دیگر به همراه ۲ برند پردازنده برای هرکدام ذکر کنید. به عنوان مثال IA-32 پردازنده‌های Intel و AMD دارد.

  5. تمرین پنجم : نحوه اسمبلی

    در این تمرین قصد داریم نحوه ایجاد کد اسمبلی توسط کامپایلر GCC را کمی مورد مطالعه قرار دهیم. سه فایل برنامه ایجاد کرده، به ترتیب برنامه‌های زیر را در آنها می‌نویسیم :

    	int main()
    	{
    		return 0;
    	}
    	
    	int main()
    	{
    		return 1+2;
    	}
    	
    	int main()
    	{
    		int a;
    		a=1+2;
    		return a; 
    	}
    	

    اکنون هر سه برنامه را به کد اسمبلی تبدیل کرده و کدها را مقایسه کنید. تفاوت جزئی برنامه اول و دوم در چیست و چرا اینگونه است؟ تفاوت بیشتر برنامه دوم و سوم در کدام کدهای اسمبلی است و این کدها چه معنایی دارند؟

    راهنمایی : سیر دستورات زیر در ترمینال لینوکس فایلها را به اسمبلی تبدیل کرده و تفاوت آنها را بر روی صفحه نمایش می‌دهد، با فرض اینکه سه فایل از قبل در پوشه جاری وجود داشته باشند :

    	# please replace 1, 2, 3 with appropriate filenames.
    	gcc -S 1.c
    	gcc -S 2.c
    	gcc -S 3.c
    	
    	less 1.s # to view the generated assembly code in 'less' text viewer application. press q in less to quit.
    	
    	diff 1.s 2.s #differents of 1.s and 2.s to output!
    	diff 2.s 3.s 
    	
    	
  6. تمرین ششم : مدهای آدرس دهی (امتیازی)

    کدام یک از مدهای آدرس‌دهی معادل استفاده از اشاره‌گر است؟ تحقیق نمایید IA-32 کدام مدهای آدرس دهی را پشتیبانی می‌نماید.

  7. تمرین هفتم : پردازنده (امتیازی)

    در سیستم عامل اوبونتو، چه دستوراتی را باید وارد کرد تا موارد زیر مشخص گردد :

    1. معماری پردازنده (i386, i686, x86_64)
    2. چند بیتی سیستم عامل 32bit 64bit
    3. Little-endian بودن یا Big-endian بودن

نحوه ارسال

لطفا ابتدا نحوه ارسال تمرینات کلی را مطالعه کنید. پاسخ تمریناتی که سوال هستند را، با ذکر شماره تمرین و شماره سوال می‌توانید در بدنه ای‌میل یا در هر فایل متنی متداول دیگر بنویسید. آخرین مهلت تحویل : دوشنبه ۲ آبان ۹۰

بازگشت