نويسنده موضوع: برنامه نویسی به زبان اسمبلی  (دفعات بازديد: 29581 بار)

0 کاربر و 3 مهمان درحال ديدن موضوع.

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
برنامه نویسی به زبان اسمبلی
« : 16 ارديبهشت 1389 - 18:52:14 »
یکی از دوستان در چند مرحله سوالاتی را در مورد برنامه نویسی اسمبلی مطرح کردند و این مسئله مرا برآن داشت تا در این مورد این تاپیک را تشکیل دهم. به عنوان یک مقدمه، هرچند ممکن است برنامه نویسی به این زبان سخت ترین روش به نظر برسد، اما در عین حال می تواند کاراترین و سریعترین روش هم باشد و هیچ واسطه ای بین آنچه که در واقعیت اتفاق می افتد با برنامه نویس وجود ندارد. در برنامه نویسی اسمبلی این برنامه نویس است که روند اجرای برنامه را شخصا تعیین می کند و واسطه ای به نام کامپایلر سطح بالا در این بین وجود ندارد. به فعلیت رساندن سرعت واقعی یک میکروکنترلر در نهایت مرتبه خود به برنامه نویسی با این زبان منتهی می شود و اگر کسی بتواند کاربردهای سریع خود را با این زبان انجام دهد، قطعا رتبه اول سرعت را به دست خواهد آورد. البته لازمه این امر یک آشنایی روشمند با این نوع برنامه نویسی و خودداری از نوشتن کدهای غیراصولی است. آنچه که در این تاپیک بیان می شود از نظر دستورالعمل ها برای هردو خانواده XMEGA و AVR قابل استفاده است و اگر استثنایی وجود داشته باشد، در جای خود بیان خواهد شد.

پی نوشت: از بخش 76 فیلم های آموزش AVR در مورد برنامه نویسی اسمبلی آموزش داده می شود:

کاربران مهمان مجاز به مشاهده لینک ها نیستند. لطفا ثبت نام نمایید. ثبت نام -- ورود
« آخرين ويرايش: 4 مهر 1393 - 17:22:26 توسط طراح »
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #1 : 17 ارديبهشت 1389 - 12:01:21 »
معماری خانواده AVR و XMEGA از نوع RISC است و بنابراین کلیه عملیات انجام شده از طریق رجیسترهای R0-R31 انجام می شوند. برخلاف معماری که در خانواده ای مانند 8051 وجود دارد و این اجازه را به برنامه نویس می دهد تا مثلا خروجی یک پورت را مستقیما با عددی AND کند، در این خانواده ها باید عملیات مذکور با واسطه رجیسترهای R0-R31 انجام شود. ممکن است که این مسئله در ابتدا به عنوان یک عدم مزیت تلقی شود، اما به دلیل سرعت اجرای دستورالعمل ها که اکثرا در یک سیکل انجام می شود، این مسئله در نهایت به سرعت بالاتری در اجرای برنامه منجر خواهد شد. وزن و اهمیت این 32 رجیستر با هم مساوی نیست و تفاوت هایی بین آنها وجود دارد که در اینجا به آن اشاره می شود:
1- عملیاتی که بصورت Immediate انجام می شوند، یعنی بین یک رجیستر و یک عدد صورت می گیرند تنها روی رجیسترهای R16-R31 قابل انجام هستند.مثال SUBI R16,1
2- رجیسترهای R0 و R1 دارای این ویژگی هستند که نتیجه عملیات ضرب در آنها قرار می گیرند.
3- عملیات جمع و تفریق 16 بیتی با یک عدد تنها روی رجیسترهای R24-R31 قابل انجام است.
4- جفت رجیسترهای R27:R26 به نام رجیستر X شناخته می شوند و می توانند برای خواندن و نوشتن روی SRAM مورد استفاده قرار بگیرند.
5- جفت رجیسترهای R29:R28 به نام رجیستر Y شناخته می شوند و می توانند برای خواندن و نوشتن روی SRAM مورد استفاده قرار بگیرند.
6- جفت رجیسترهای R31:R30 به نام رجیستر Z شناخته می شوند که این دو رجیستر در واقع مهم ترین رجیسترها در مجموع 32 رجیستر هستند و علاوه بر امکان خواندن و نوشتن روی SRAM از طریق آن، دسترسی به حافظه FLASH و دستورات پرش غیر مستقیم و پرش به سابروتین ها بصورت غیر مستقیم ( IJMP  ICALL  EIJMP  EICALL) از طریق این رجیسترها قابل انجام است.
آگاهی از درجه اهمیت هر رجیستر موجب می شود که یک برنامه نویس بتواند استفاده از رجیسترها را مدیریت کند و از استفاده نابجا از رجسترهایی که قرار است در عملیات دیگری بکار گرفته شوند، خودداری کند. همچنین رجیسترهایی را که بصورت دائمی در معرض تغییر و قضاوت هستند در مکان مناسبی انتخاب کند تا از طولانی شدن بی مورد برنامه به دلیل انتخاب اولیه غلط، جلوگیری شود. به دوستانی که علاقه مند به پیگیری این بحث هستند اکیدا توصیه می شود که فایل مستقلی که مجموعه دستورالعمل های اسمبلی خانواده AVR را بصورت کامل توضیح داده از وبسایت Atmel دریافت و مطالعه کنند.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آنلاين Study

  • کاربر کامل سطح پنجم
  • *
  • تشکر
  • -اهدايي: 159
  • -دريافتي: 271
  • ارسال: 540
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #2 : 17 ارديبهشت 1389 - 13:25:05 »
تاپیک بسیار عالی ای هست جناب طراح، بنده حتما پیگیر خواهم بود و از اینکه این بحث رو راه انداختید تشکر میکنم.
اگر امکان داره به صورت خلاصه تعدادی از تغییرات نسبتا اساسی که در دستورالعمل های XMEGA نسبت به AVR شده رو هم برامون بنویسید.
دستورات LDS و STS توی XMEGA ها هم 32 بیت آپکد دارند؟
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #3 : 18 ارديبهشت 1389 - 19:19:09 »
اگر امکان داره به صورت خلاصه تعدادی از تغییرات نسبتا اساسی که در دستورالعمل های XMEGA نسبت به AVR شده رو هم برامون بنویسید.
دستورات LDS و STS توی XMEGA ها هم 32 بیت آپکد دارند؟

خوشبختانه دستورالعمل های خانواده AVR و XMEGA با یکدیگر مشترک هستند و تنها مواردی از استثناء (مانند دستورالعمل DES در XMEGA برای Encryption و Decryption) وجود دارد. اما زمان اجرای بعضی دستورالعمل ها از نظر تعداد سیکل در این دو خانواده متفاوت است.
دستورالعمل های LDS و STS و برخی دستورات دیگر، تعداد 4 بایت را در حافظه Flash اشغال می کنند.

« آخرين ويرايش: 4 مهر 1393 - 17:24:02 توسط طراح »
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #4 : 19 ارديبهشت 1389 - 10:46:21 »
در مورد لزوم بکارگیری برنامه نویسی به زبان اسمبلی باید به مسئله توجیه این نوع برنامه نویسی اشاره کرد. از نظر عملی برای انجام کارهایی که در آن آخرین حد توانایی سرعت یک میکروکنترلر مورد نیاز است و سرعت در مرزهای پردازشی قرار دارد، هیچ رقیبی برای این نوع برنامه نویسی وجود ندارد. اما برای انجام کارهایی که از نظر سرعت حساس نیستند و ممکن است عملیات بسیار مفصلی را هم پشتیبانی کنند، استفاده از این برنامه نویسی یک امر سلیقه ای است و به توانایی ذهنی برنامه نویس بر می گردد که آیا می تواند همه نیازهای خود را به این شیوه برطرف کند یا خیر. یک دلیل علاقه به برنامه نویسی اسمبلی در دوستانی که از ابتدا کار با میکروکنترلر را با برنامه نویسی سطح بالا شروع کرده اند، درک همین نیاز و تمایل به حداکثر بکارگیری قدرت پردازش AVR و XMEGA است و حتما نیازهایی در عمل احساس شده که گرایشی را به این سمت ایجاد کرده است. پس نمی توان مطلقا برنامه نویسی را به اسمبلی یا سطح بالا منحصر کرد و هر بخش باید در جایگاه خود و بصورت مناسب مورد استفاده قرار بگیرد.

بصورت کلی دستورات اسمبلی را می توان برای انجام عملیات زیر بکار برد:

- عملیات روی رجیسترهای R0-R31
- عملیات روی فضای I/O
- پرش های شرطی و غیر شرطی و احضار زیربرنامه ها
- خواندن و نوشتن SRAM
- خواندن از Flash
- تغییر محتوای Flash
- خواندن و نوشتن Stack
- دستورات خاص BREAK-NOP-WDR-SLEEP-DES-RET-RETI

این عناوین، چکیده کلی تمام دستورات اسمبلی هستند و دستوری وجود ندارد که خارج از یکی از این موارد عمل کند.
اگر یک شناخت و تسلط کافی نسبت به توانایی های این دستورات ایجاد شود و بدانیم که در انجام هر کاری لازم است کدام گروه را به کار بگیریم، آنگاه  به راحتی می توان برنامه نویسی مورد نظر را انجام داد و هدف مورد نظر را تحقق بخشید. برای وارد شدن به جزئیات بیشتر، در بخش بعد بصورت ریزتری در مورد دستورات توضیح داده خواهد شد.

اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آنلاين Study

  • کاربر کامل سطح پنجم
  • *
  • تشکر
  • -اهدايي: 159
  • -دريافتي: 271
  • ارسال: 540
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #5 : 19 ارديبهشت 1389 - 13:29:35 »
ضمن تشکر از زحمات جناب طراح حالا که ایشون برخی از ویژگیهای برنامه نویسی اسمبلی را مطرح کردند چند مورد دیگر را هم بنده اضافه میکنم ضمن اینکه بنده برتری های زبان های سطح بالا نسبت به اسمبلی رو هم قبول دارم و در اینجا بیشتر هدف بیان ویژگیهای مثبت اسمبلی هست:
در برنامه نویسی اسمبلی زمان اجرای هر دستور دقیقا مشخص هست و زمان بین اجرای دو دستور و به طور کلی دستورات مختلف هم کاملا مشخص هست و در پروژه هایی که دقت زمانی مهم هست و باید هر کاری دقیقا در زمان مورد نیاز انجام شود و فاصله زمانی بین محاسبات و اعمال مختلف محاسبه شود اسمبلی بهترین انتخاب خواهد بود، چرا که در هنگاهم برنامه نویسی با زبانهایی مثل C یا بیسیک مشخص نیست که از اجرای هر دستور تا دستور دیگر دقیقا چقدر زمان صرف میشود.
به علاوه در اسمبلی شما در هر جای برنامه که باشید میتونید با تقریب خیلی خوب بدون نیاز به ترجمه برنامه متوجه بشید که تا اینجای برنامه چقدر از فضای حافظه رو استفاده کردید و چقدر باقی مانده.
علاوه بر اینها یکی از مزایای مهم اسمبلی این هست که میشه کد خیلی کوتاه تری بنویسیم و از هدر رفتن فضای حافظه برنامه جلوگیری کنیم، اگر برنامه نویس اسمبلی مهارت داشته باشه همیشه میتونه حجم نهایی برنامه در حافظه رو از هر کامپایلری کمتر در بیاره و از حافظه استفاده بیشتری بکنه.
به علاوه همیشه کامپایلر خوب برای همه میکروها وجود نداره و حداقل بعد از تولید هر میکرو مدتی طول میکشه تا کامپایلر مناسبی تولید بشه اما اسمبلی همیشه آماده استفاده هست.
به طور خلاصه اسمبلی برای استفاده از بیشترین کارآیی میکروکنترلر هست، با هیچ زبان دیگری نمیشه بیشترین استفاده رو از امکانات میکرو ببریم، چراکه با هیچ زبان دیگری نمیشه مستقیما به زبان خود میکرو باهاش ارتباط برقرار کنیم و خواسته هامون رو به صورت کد تعریف کنیم.
نکته مهمی هم که باید اشاره کرد این هست که اگر شما کاری رو با اسمبلی انجام دادید و نتیجه اون مشابه یا ضعیف تر شد از وقتی که با مثلا C یا زبان سطح بالای دیگری اون کار رو انجام دادید مطمئن باشید این ضعف شما در برنامه نویسی اسمبلی رو نشون میده نه ضعف زبان برنامه نویسی اسمبلی.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #6 : 21 ارديبهشت 1389 - 14:36:17 »
برای شروع برنامه نویسی به زبان اسمبلی باید از لحظه اتمام وضعیت RESET و شروع بکار میکروکنترلر، عملکرد آنرا بصورت مرحله به مرحله بدانیم و با آن همراه شویم. یک تعبیر شخصی این است که یک برنامه نویس اسمبلی باید ذهن خود را با عملکرد CPU هماهنگ کند مانند یک نرم افزار شبیه ساز فکر کند. اولین نقطه شروع این است که بعد از RESET شدن میکروکنترلر، ابتدا رجیسترهای کنترل کننده سخت افزار دارای مقدار اولیه مشخصی می شوند که همگی در Datasheet ذکر شده است. سپس اولین دستوری که در آدرس صفر حافظه Flash توسط پروگرامر قرار داده شده، اجرا می شود. این دستور باید توسط برنامه نویس نوشته  و روی Flash پروگرام شده باشد. سوال این است که اولین دستوری که به زبان اسمبلی نوشته می شود باید چه دستوری باشد؟ برای پاسخ به این سوال باید از مبحثی به نام وقفه و بردارهای وقفه مطلع باشیم. وقفه ها در واقع تقاضاهایی از CPU برای پاسخگویی هستند که منابع مشخصی دارند و پذیرش و پاسخگویی به یک وقفه توسط CPU یعنی اجرای دستورالعمل هایی که توسط برنامه نویس نوشته شده و در آدرس مشخصی در حافظه Flash قرار داده شده است. این آدرس ها، مکان های از پیش تعیین شده ای هستند که توسط کارخانه سازنده اعلام شده اند. در ابتدای حافظه Flash تنها به اندازه یک دستور پرش فضا در اختیار برنامه نویس است و بعد از آن همین آدرس های مشخص قرار دارند. بنابراین در پاسخ به این سوال که باید چه دستوری را درابتدا بنویسیم باید گفت که بصورت اصولی باید اولین دستور یک دستور العمل پرش باشد تا فضای آدرس های مربوط به پاسخگویی وقفه برای وظیفه مخصوص به خود محفوظ بماند و در اولین آدرسی که خارج از این فضا باشد، می توانیم کدهای مورد نظر را قرار دهیم . البته در صورتی که در یک برنامه وقفه ای وجود نداشته باشد، انجام این امر الزامی نیست و اولین دستور لزوما می تواند یک پرش نباشد. اما از نظر اصولی بهتر است در تمام شرایط و برای امکان توسعه نرم افزار این مسئله رعایت شود. سوال بعد این است که بعد از این پرش، اولین کاری که باید توسط نرم افزار انجام شود، چیست؟ پاسخ این سوال برای AVR و XMEGA متفاوت است. برای AVR اولین کار، تعیین مکان Stack از طریق قرار دادن آدرس انتهای SRAM در رجیستری به نام Stack Pointer است. اما این عملیات در XMEGA بصورت خودکار انجام می شود. مثالی از موارد بیان شده برای mega16 در زیر آورده شده است:
.ORG  0X00
JMP  RESET
.ORG  0X2A
RESET:
LDI  R16,HIGH(0X45F)
OUT SPH,R16
LDI  R16,LOW(0X45F)
OUT  SPL,R16
...
در کد اخیر .ORG یک دستورالعمل نیست و تنها یک راهنما برای Assembler است که بیان می کند هر دستورالعملی که بعد از آن ذکر شده، در هنگام پروگرام کردن در کدام آدرس Flash قرار داده شود.
آدرس 0x2A هم از Datasheet مربوط به mega16 استخراج می شود و اولین آدرس آزادی است که مربوط به پاسخگویی به هیچ وقفه ای نیست. آدرس 0X45F آخرین نقطه واقع در SRAM است که معمولا شروع Stack در آن محل قرار داده می شود. این آدرس ها و مقادیر در هر شماره IC متفاوت است و با مراجعه به اطلاعات آن IC و یا استفاده از فایل های Header قابل دستیابی و استفاده است. این مقدار دهی اولیه به Stack pointer برای XMEGA لازم نیست.
از اینجا به بعد می توانیم توسط برنامه نویسی، عملیات مورد نظر خود را انجام دهیم. مثلا فرض کنیم در mega16، بخواهیم با حداکثر سرعت ممکن، ورودی PORTB و PORTC را بخوانیم و با هم جمع کنیم و حاصل را روی PORTD قرار دهیم:

LDI  R16,0XFF
OUT  DDRD,R16
LOOP:
IN  R16,PINB
IN  R17,PINC
ADD  R16,R17
OUT  PORTD,R16
RJMP  LOOP

از نکات قابل ذکر این است که بصورت Default پورتها ورودی هستند و کدهایی مانند DDRB=0x00 و DDRC=0x00 که در این موارد توسط code wizard مربوط به Code vision تولید می شوند، اضافه و زاید هستند.
کد مذکور برای XMEGA تا حدی متفاوت خواهد بود که بعدا به آن اشاره خواهد شد.

« آخرين ويرايش: 3 خرداد 1389 - 20:34:47 توسط طراح »
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آنلاين Study

  • کاربر کامل سطح پنجم
  • *
  • تشکر
  • -اهدايي: 159
  • -دريافتي: 271
  • ارسال: 540
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #7 : 21 ارديبهشت 1389 - 20:01:22 »
عالیه جناب طراح، اینجور مطالب معمولا اینجا کمتر طرفدار داره اما از با ارزش ترین مطالب هست و به نظر من حتی اگر فقط 2 نفر هم بخوانند ارزش نوشتن را دارد. سیستم پشته در XMEGA ها هم به همون ترتیب AVR هست ( درون SRAM ) و فقط نیازی به تعیین مکان نداره یا اینکه کلا سیستمش فرق میکنه؟ لطفا به مبحث پشته که رسیدید هردو سخت افزار و نرم افزار پشته رو هم مثل همیشه خوب و کامل توضیح بدید، البته بنده انتظاری ندارم اما اگر فرصت کنید و اینکار رو انجام بدید لطف بزرگی کردید.
یک نکته رو هم بنده اشاره کنم که opcode دستور JMP چهار بایت هست و برای پرش های بلند استفاده میشه و در عوض دستور RJMP دارای opcode دو بایتی است که نصف قبلی هست و در اینجا ما میتونیم برای پرش به آدرس شروع به جای دستور JMP از RJMP استفاده کنیم که دوبایت در حافظه صرفه جویی کرده باشیم ( به اندازه یک دستور معمولی ) البته ممکن هست اسمبلر خودش موقع اسمبل کردن برنامه به جای دستور JMP ما RJMP رو جایگزین کنه ( در 8051 مشابه اینکار رو انجام میداد ) اما نمیدونم اسمبلر AVR هم اینکار رو میکرد یا نه، به هر حال بهتر هست در اینجا RJMP استفاده بشه.
نکته دیگر هم که بد نیست اشاره کنم این هست که اگر فایل سرآیند تراشه مورد نظر رو اضافه کرده باشید نیاز نیست حتما آدرس آخرین حافظه از RAM رو نگاه کنید و درون پرانتز قرار بدید، برای صرفه جویی در وقت میتونید به این صورت بنویسید:
LDI R16,LOW(RAMEND) و LDI R16,HIGH(RAMEND) که در این دو دستور هم اسمبلر موقع اسمبل کردن برنامه با توجه به تراشه شما آدرس انتهای SRAM رو جایگزین RAMEND میکنه، در نتیجه مثل این میمونه که شما آدرس رو نوشته باشید، اما اگر بخواهید در قسمتی دیگر غیر از آخر حافظه RAM پشته رو قرار بدید باید حتما آدرس مورد نظر را به همین صورت که جناب طراح نوشتند بنویسید.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #8 : 21 ارديبهشت 1389 - 22:03:30 »
درباره استفاده از RJMP بجای JMP به دلیل اینکه این مثال برای mega16 نوشته شده و بردارهای وقفه در این IC بگونه ای است که به فاصله دو word از یکدیگر قرار دارند، حتی اگر RJMP هم نوشته شود عملا از یک word باقیمانده برای هیچ کاری نمی توان استفاده کرد. بنابراین در متن Atmel هم از دستور JMP برای این کار استفاده شده است و می توانید در Datasheet مربوط به mega16 این مسئله را ملاحظه کنید. البته از همین دقت شما مشخص است که در امر برنامه نویسی اسمبلی تبحر دارید و جای شکر دارد که هنوز کسانی هستند که در این حوزه ها فعالیت کنند و CONFIG LCD ... همه  را از برخی کاربردها محروم نکرده است.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آنلاين Study

  • کاربر کامل سطح پنجم
  • *
  • تشکر
  • -اهدايي: 159
  • -دريافتي: 271
  • ارسال: 540
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #9 : 21 ارديبهشت 1389 - 23:14:19 »
جناب طراح شما تا حالا کجا بودی؟ :kiss: :wink: همینجوری از مطالعه پست هاتون لذت میبردم، این پاسخ آخری رو که بهم دادید رو که خواندم از ته دل خوشحال شدم انگار یک همزبان پیدا کردم که زبانم رو میفهمه، هیچ وقت فکر نمیکردم دیگه همچین کسی رو توی این انجمن پیدا کنم و بتونم در مورد نکات اینچنینی با کسی بحث دوطرفه کنم و یاد بگیرم و لذت ببرم. امیدوارم حالا حالا ها اینجا فعالیت داشته باشید. متاسفانه مدت زیادی هست که با اسمبلی AVR و به طور کلی با AVR کار نکردم و خیلی نکته های ریز رو فراموش کردم، اگر جایی اشتباه میکنم لطفا اصلاح کنید. نکته ای که در مورد RJMP و JMP اشاره کردید خیلی جالب بود، اما استفاده از JMP در اینجا مزیتی به RJMP داره ؟ درسته که این مقدار حافظه خالی در محلی قرار گرفته که در اجرای برنامه به هیچ دردی نمیخوره اما میشه یک دیتا رو توی اون ذخیره کرد که شاید کاربرد خاصی داشته باشه، مثلا به عنوان یک نشانه برای خودمان یا امضا یا..!!! شاید هم از این لحاظ هیچ کلا کاربردی نداشته باشه.
اما تفاوت دیگر هم این هست که دستور RJMP دو سیکل زمان نیاز داره اما JMP سه سیکل شاید در بعضی جاها برامون کمی فرق کنه. البته بسیار به ندرت.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #10 : 22 ارديبهشت 1389 - 00:04:54 »
در مورد کمتر بودن تعداد سیکل های RJMP نسبت به JMP، کاملا حق با شما است و اگر در جایی این امر مهم باشد باید از اولی استفاده شود. البته شرط آن این است که میزان پرش مجاز برای RJMP، بتواند جوابگوی دسترسی به آدرس روتین وقفه باشد.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين طراح

  • Moderator
  • *
  • تشکر
  • -اهدايي: 1306
  • -دريافتي: 10238
  • ارسال: 3013
  • اوژن کی نژاد
    • كارشناس ارشد مخابرات میدان
    • KnowledgePlus.ir
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #11 : 23 ارديبهشت 1389 - 00:44:30 »
گام بعدي در برنامه نويسي، شناخت امكانات سخت افزاري و روش بكار گرفتن آن از طريق استفاده از مجموعه دستورالعمل ها و نوشتن مقادير مناسب در رجيستر هاي كنترل كننده هر سخت افزار است. براي ارتباط با سخت افزار بايد رجيسترهايي را شناسايي كرد كه بر آن سخت افزار مديريت مي كنند و بايد بررسي كنيم كه چه مقاديري را در اين رجيسترها بنويسيم تا سخت افزار بگونه اي كه مورد نظر است، عمل كند. استفاده مكرر از محيط هاي Wizard اين اشكال را دارند كه عليرغم سادگي ظاهري، اين دانش را از برنامه نويس سلب مي كنند و اگر در كاربردي لازم باشد در وسط اجراي برنامه تغييري در نوع عملكرد يك سخت افزار ايجاد شود( مثلا تغيير پيكره بندي يك تايمر)، اطلاعات لازم براي اينكار بايد وجود داشته باشد و اين كار تنها با تغيير مقادير رجيسترهاي كنترل كننده سخت افزار ممكن است.
چند مورد مهم ديگر شامل آگاهي از امكانات محاسبات منطقي و رياضي در CPU و همچنين نحوه دسترسي به SRAM و FLASH و ايجاد شرط و قضاوت و ايجاد حلقه در برنامه است كه با آگاهي از آنها مي توان با قدرت و تسلط كافي، سخت افزار را بكار گرفت و عمليات مورد نظر را انجام داد.
عمليات منطقي و رياضي كه روي رجيسترهاي R0-R31 انجام مي شوند، شامل AND و OR و NOT و XOR و SHIFT و ROTATE و مقايسه و جمع و تفريق و ضرب مي شود. دستور تقسيم از اساس در خانواده AVR وجود ندارد، اما با روتين هايي شامل تفريق و SHIFT مي توان آن را انجام داد.
R0-R31 در واقع رجيسترهايي در درون ميكروكنترلر محسوب مي شوند كه تنها حكم واسطه را دارند و هر عمليات و محاسباتي هم كه روي آنها انجام شود، رابطه اي با دنياي خارج ايجاد نمي كند. رابطه ميكروكنترلر با دنياي خارج از طريق پورتهاي آن انجام مي شود كه در بخش بعد در اين مورد توضيح داده خواهد شد.
اوژن: به معنای افکننده و شکست دهنده است
برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
دانایی، توانایی است-Knowledge is POWER-قوی شدن و همچنان خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است - اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
ساعت کار بدن انسان معمولا کمتر از 800.000 ساعت (33333 روز) است و بعد از آن از کار می افتد
امکان پاسخگویی به سوالات از طریق پیغام خصوصی مقدور نیست. لطفا سوالات خود را در سطح انجمن مطرح کنید

آفلاين freedom_truth

  • کاربر فعال
  • *
  • تشکر
  • -اهدايي: 501
  • -دريافتي: 593
  • ارسال: 743
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #12 : 24 ارديبهشت 1389 - 00:13:16 »
با سلام
از دوستان خوب "طراح" و "study" به خاطر بحث شيريني كه باز كردن ممنونم.منتها يه پيشنهاد دارم و اونم اينكه در اين مرحله به جاي چونه زدن روي يك بايت از حافظه يا نيم ميكرو ثانيه از زمان بيان روي مباحث كاربردي تري صحبت كنيم.
نظر بنده رو ايناست: طراحي فلوچارت و تابع بندي و انشعابات برنامه، استفاده از اشاره گر هاي داده در فلش و رم، مديريت متغير ها، عمليات رياضي روي عددهاي بزرگ و مميزي و ...

با تشكر

آنلاين Study

  • کاربر کامل سطح پنجم
  • *
  • تشکر
  • -اهدايي: 159
  • -دريافتي: 271
  • ارسال: 540
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #13 : 24 ارديبهشت 1389 - 00:46:48 »
جناب freedom راستش این بحث رو جناب طراح شروع کردند و حتما برنامه خاصی برای ادامه آن دارند، به نظر من همه این بحث ها جدا از هم هستند و هر کدام هم اونقدر حرف برای گفتن دارند که روشون وقت گذاشته بشه، استفاده از همین بایت ها و میکروثانیه ها بسیار مهم و با ارزش هست و فرمایشات شما هم به جای خودش مهم هست و باید مورد بررسی قرار بگیره، فکر میکنم این تاپیک به این منظور ایجاد شده که افرادی که با زبان اسمبلی نمیتونند کار کنند این زبان را یاد بگیرند و بتونند در مواقعی که لازم دارند استفاده کنند ایشالا اگر کمی تحمل بفرمایید کم کم به بحث های پیشرفته تر و مباحثی که مد نظر شماست هم میرسه.
در ضمن به طور کلی عرض میکنم ارزش این تک بایت ها و میکروثانیه ها خیلی بیشتر از اون چیزی هست که خیلی از دوستان فکر میکنند، اگر به راهنمای بعضی اسمبلر ها نگاه کنید فقط یک قسمت به عنوان شگردها نوشته شده و توی اون تکنیک هایی برای نوشتن کد گفته شده که مثلا به جای اینکه این کار رو با این روش انجام بدید با اون روش انجام بدید تا یک دستور اسمبلی کمتر استفاده کرده باشید، منظورم این هست اینقدر این بایت ها با ارزش هستند که در راهنمای اسمبلر تکنیک برنامه نویسی آموزش داده میشه که یک بایت هدر داده نشه.
از آنجا که گاهی فرصت بازخوانی پست نیست، بابت غلط های املایی و نگارشی احتمالی معذرت میخوام.
هیچیک از پاسخ هایی که میدم را کاملا تایید نمیکنم و ممکن هست اشتباه کرده باشم، اگر من به نوشته ام مطمئن هستم شما مشکوک باشید.
اگر در حل مشکل من کمک کردید و دکمه تشکر رو نزدم حتما فراموش کردم کوچکترین کمک شما برایم ارزشمند است!
اگر به هر طریقی از من ناراحت شدید حتما با یک پیام خصوصی تذکر بدهید تا مشکل رو حل کنیم و رابطه ی صمیمانه، پایدار بماند.
شاد و موفق باشید

آفلاين امیر حسام الفتی

  • کاربر نیمه حرفه ای سطح دوم
  • *
  • تشکر
  • -اهدايي: 150
  • -دريافتي: 284
  • ارسال: 799
  • ای که دستت میرسد کاری بکن...
پاسخ : برنامه نویسی به زبان اسمبلی
« پاسخ #14 : 24 ارديبهشت 1389 - 10:36:16 »
با سلام
آقا من از اوموقع خواننده بودم ولی گفتم یه پست بدم که شمام بدونید بابا کسی اینو میخونه ملی چون تازه دارم یا میگیرم حرفی برای گفتن ندارم.
راستی دوست عزیز اصل برنامه نویسی اسمبلی برای سرعتشه نا چیز دیگه ای چون جز زحمت هیچی به همراه نداره پس مهمه  حتی 1 سیکل یا دو سیکل  :agree:
لطفا همینجور ادامه بدید  :read: :job:
الهم عجل لولیک الفرج

فقط 313 نفر...