اطلاعیه

Collapse
No announcement yet.

برنامه نویسی به زبان اسمبلی

Collapse
این موضوع برجسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    پاسخ : برنامه نویسی به زبان اسمبلی

    سلام دوستان
    من حدود 10 صفحه از موضوع برنامه نویسی به زبان اسمبلی را خوندم. مصالب خوبی بودند ولی به علت کمبود وقت نمیرسم همه اونها را بخونم. چندتا سوال دارم که امیدوارم شما دوستان عزیز بتونید به بنده کمک کنید.
    من یک بایت داده دارم و میخواهم تک تک بیت های این یک بابت را بصورت سری از یکی از پایه های میکرو ارسال کنم. چطوری این کار را باید انجام بدم؟ حالا یا از MSB یا از LSB
    لطفا" بنده را راهنمایی کنید
    حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

    دیدگاه


      پاسخ : برنامه نویسی به زبان اسمبلی

      سلام دوستان
      کدهای اسمبلی زیر بصورت مشابه قابل اجرا در کدویژن نیست. آیا کسی هست که بتونه بنده را راهنمایی کنه تا این کدهای اسمبلی را بطور صحیح به کدویژن انتقال بدم؟
      ممنون از پاسخ شما.
      "nextbit:\n\t" // - label (T = 0)
      "sbi %0, %1\n\t" // 2 signal HIGH (T = 2)
      "sbrc %4, 7\n\t" // 1-2 if MSB set (T = ?)
      "mov %6, %3\n\t" // 0-1 tmp'll set signal high (T = 4)
      "dec %5\n\t" // 1 decrease bitcount (T = 5)
      "nop\n\t" // 1 nop (idle 1 clock cycle) (T = 6)
      "st %a2, %6\n\t" // 2 set PORT to tmp (T = 8)
      "mov %6, %7\n\t" // 1 reset tmp to low (default) (T = 9)
      "breq nextbyte\n\t" // 1-2 if bitcount ==0 -> nextbyte (T = ?)
      "rol %4\n\t" // 1 shift MSB leftwards (T = 11)
      "rjmp .+0\n\t" // 2 nop nop (T = 13)
      "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
      "rjmp .+0\n\t" // 2 nop nop (T = 17)
      "nop\n\t" // 1 nop (T = 18)
      "rjmp nextbit\n\t" // 2 bitcount !=0 -> nextbit (T = 20)
      "nextbyte:\n\t" // - label -
      "ldi %5, 8\n\t" // 1 reset bitcount (T = 11)
      "ld %4, %a8+\n\t" // 2 val = *p++ (T = 13)
      "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
      "rjmp .+0\n\t" // 2 nop nop (T = 17)
      "nop\n\t" // 1 nop (T = 18)
      "dec %9\n\t" // 1 decrease bytecount (T = 19)
      "brne nextbit\n\t" // 2 if bytecount !=0 -> nextbit (T = 20)
      ::
      // Input operands Operand Id (w/ constraint)
      "I" (_SFR_IO_ADDR(PORT)), // %0
      "I" (PORT_PIN), // %1
      "e" (&PORT), // %a2
      "r" (high), // %3
      "r" (val), // %4
      "r" (nbits), // %5
      "r" (tmp), // %6
      "r" (low), // %7
      "e" (p), // %a8
      "w" (nbytes) // %9
      حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

      دیدگاه


        پاسخ : برنامه نویسی به زبان اسمبلی

        لطفا" اگر کسی اسمبلی بلد هست کمک کنه.
        سوال من از ارسال برنامه بالا اینه:
        یک برنامه توی کدویژن نوشتم که به دلائلی مجبور هستم بخشی از اون رو به زبان اسمبلی تکمیل کنم. حالا توی اون بخشی که به زبان اسمبلی نوشته شده باید یک سری عملیات مثل جمع یا مقایسه یا شرط را روی متغیرهایی که توی برنامه وجود داره(هم در قسمت اسمبلی و هم در قسمت کد C) انجام بدم. ولی همونطور که میدونید. دستورات اسمبلی روی رجیسترهای R0 تا R31 عملیاتها را انجام میده. چطوری باید دستورات اسمبلی را روی متغیرها اجرا کنم؟
        حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

        دیدگاه


          پاسخ : پاسخ : پاسخ : برنامه نویسی به زبان اسمبلی

          نوشته اصلی توسط طراح نمایش پست ها
          زمان اجرای دستورالعمل ها در فایل زیر قابل دسترس است:



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

          http://www.aparat.com/v/UOqIX

          سلام
          امیدوارم که کمی وقت برای بنده داشته باشید.
          بنده یکی دوتا سوال در زمینه اسمبلی دارم که مدت یک ماهی هست من را درگیر خودش کرده
          من درحال نوشتن یک برنامه در کدویژن و به زبان C هستم. ولی به دلائلی از جمله سرعت و دقت در زمان و ... مجبور شدم بخشی از برنامه را به زبان اسمبلی بنویسم. تا حدودی بخشی از اون را نوشتم ولی یه جاهایی را واقعا" نمیدونم چیکار باید بکنم.
          دربرنامه (هم در بخش C و هم در بخش اسمبلی) یک سری متغیر دارم که باید یک سری عملیات مثل مقایسه، جابجایی و ... روی اونها به زبان اسمبلی انجام بشه. ولی طبق اون چیزی که من میدونم(حتما" علم من ناقصه) توی زبان اسمبلی عملیات فقط روی رجیسترها R0 تا R31 انجام میشه. حالا چطوری باید دستورات لازم را روی متغیرهای خودم انجام بدم؟
          یک نمونه برنامه که به عنوان الگوی اصلی برنامه خودم قرار دادم این کار را کرده ولی روش اجرای دستوراتش توی کدویژن قابل اجرا نیست و خطا میگیره. این برنامه را ضمیمه این درخواست ارسال میکنم و امیدوارم شما با توانایی های که دارید بتونید به بنده پاسخ بدید.
          تشکر

          asm volatile(
          "nextbit:\n\t" // - label (T = 0)
          "sbi %0, %1\n\t" // 2 signal HIGH (T = 2)
          "sbrc %4, 7\n\t" // 1-2 if MSB set (T = ?)
          "mov %6, %3\n\t" // 0-1 tmp'll set signal high (T = 4)
          "dec %5\n\t" // 1 decrease bitcount (T = 5)
          "nop\n\t" // 1 nop (idle 1 clock cycle) (T = 6)
          "st %a2, %6\n\t" // 2 set PORT to tmp (T = 8)
          "mov %6, %7\n\t" // 1 reset tmp to low (default) (T = 9)
          "breq nextbyte\n\t" // 1-2 if bitcount ==0 -> nextbyte (T = ?)
          "rol %4\n\t" // 1 shift MSB leftwards (T = 11)
          "rjmp .+0\n\t" // 2 nop nop (T = 13)
          "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
          "rjmp .+0\n\t" // 2 nop nop (T = 17)
          "nop\n\t" // 1 nop (T = 18)
          "rjmp nextbit\n\t" // 2 bitcount !=0 -> nextbit (T = 20)
          "nextbyte:\n\t" // - label -
          "ldi %5, 8\n\t" // 1 reset bitcount (T = 11)
          "ld %4, %a8+\n\t" // 2 val = *p++ (T = 13)
          "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
          "rjmp .+0\n\t" // 2 nop nop (T = 17)
          "nop\n\t" // 1 nop (T = 18)
          "dec %9\n\t" // 1 decrease bytecount (T = 19)
          "brne nextbit\n\t" // 2 if bytecount !=0 -> nextbit (T = 20)
          ::
          // Input operands Operand Id (w/ constraint)
          "I" (_SFR_IO_ADDR(PORT)), // %0
          "I" (PORT_PIN), // %1
          "e" (&PORT), // %a2
          "r" (high), // %3
          "r" (val), // %4
          "r" (nbits), // %5
          "r" (tmp), // %6
          "r" (low), // %7
          "e" (p), // %a8
          "w" (nbytes) // %9
          );
          این برنامه چندبایت را از ورودی دریافت میکنه و بیت به بیت را باتوجه به اینکه اون بیت صفر باشه یا یک، خروجی پالس مخصوص به خودش را ارسال میکنه
          جدیدترین ویرایش توسط hamid reza_1364; ۲۰:۵۳ ۱۳۹۹/۰۱/۱۲.
          حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

          دیدگاه


            پاسخ : برنامه نویسی به زبان اسمبلی

            نوشته اصلی توسط hamid reza_1364 نمایش پست ها
            لطفا" اگر کسی اسمبلی بلد هست کمک کنه.سوال من از ارسال برنامه بالا اینه:یک برنامه توی کدویژن نوشتم که به دلائلی مجبور هستم بخشی از اون رو به زبان اسمبلی تکمیل کنم. حالا توی اون بخشی که به زبان اسمبلی نوشته شده باید یک سری عملیات مثل جمع یا مقایسه یا شرط را روی متغیرهایی که توی برنامه وجود داره(هم در قسمت اسمبلی و هم در قسمت کد C) انجام بدم. ولی همونطور که میدونید. دستورات اسمبلی روی رجیسترهای R0 تا R31 عملیاتها را انجام میده. چطوری باید دستورات اسمبلی را روی متغیرها اجرا کنم؟
            برای نوشتن اسمبلی در کدویژن و ارتباط متغیرها و رجیسترها، بخش 4.19 و 4.19.1 را در فایل زیر با دقت مطالعه کنید:http://www.arctan.ca/files/cvavrman326.pdf
            اوژن: به معنای افکننده و شکست دهنده است
            دانایی، توانایی است-Knowledge is POWER
            برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
            وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
            قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
            اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
            ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

            دیدگاه


              پاسخ : برنامه نویسی به زبان اسمبلی

              نوشته اصلی توسط طراح نمایش پست ها
              برای نوشتن اسمبلی در کدویژن و ارتباط متغیرها و رجیسترها، بخش 4.19 و 4.19.1 را در فایل زیر با دقت مطالعه کنید:http://www.arctan.ca/files/cvavrman326.pdf
              سلام
              ممنون از راهنمایی شما. ولی مطالب اشاره شده برای مشکل بنده کفایت نمیکنه.
              کمک و راهنمایی که من از شما و دوستان میخوام اینه که این دستورات را چطوری توی کدویژن معادل ش را بنویسم؟
              "nextbit:\n\t"         // -    label                       (T =  0) 
              "sbi %0, %1\n\t" // 2 signal HIGH (T = 2)
              "sbrc %4, 7\n\t" // 1-2 if MSB set (T = ?)
              "mov %6, %3\n\t" // 0-1 tmp'll set signal high (T = 4)
              "dec %5\n\t" // 1 decrease bitcount (T = 5)
              "nop\n\t" // 1 nop (idle 1 clock cycle) (T = 6)
              "st %a2, %6\n\t" // 2 set PORT to tmp (T = 8)
              "mov %6, %7\n\t" // 1 reset tmp to low (default) (T = 9)
              "breq nextbyte\n\t" // 1-2 if bitcount ==0 -> nextbyte (T = ?)
              "rol %4\n\t" // 1 shift MSB leftwards (T = 11)
              "rjmp .+0\n\t" // 2 nop nop (T = 13)
              "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
              "rjmp .+0\n\t" // 2 nop nop (T = 17)
              "nop\n\t" // 1 nop (T = 18)
              "rjmp nextbit\n\t" // 2 bitcount !=0 -> nextbit (T = 20)
              "nextbyte:\n\t" // - label -
              "ldi %5, 8\n\t" // 1 reset bitcount (T = 11)
              "ld %4, %a8+\n\t" // 2 val = *p++ (T = 13)
              "cbi %0, %1\n\t" // 2 signal LOW (T = 15)
              "rjmp .+0\n\t" // 2 nop nop (T = 17)
              "nop\n\t" // 1 nop (T = 18)
              "dec %9\n\t" // 1 decrease bytecount (T = 19)
              "brne nextbit\n\t" // 2 if bytecount !=0 -> nextbit (T = 20)
              ::
              // Input operands Operand Id (w/ constraint)
              "I" (_SFR_IO_ADDR(PORT)), // %0
              "I" (PORT_PIN), // %1
              "e" (&PORT), // %a2
              "r" (high), // %3
              "r" (val), // %4
              "r" (nbits), // %5
              "r" (tmp), // %6
              "r" (low), // %7
              "e" (p), // %a8
              "w" (nbytes) // %9


              همونطور که شما استاد عزیز و بقیه دوستان میدونند دستورات اسمبلی رو رجیستر ها انجام میگیره و نه روی متغیرها. پس اگر قرار هست عملیاتی رو متغیرها انجام بشه باید مقدار اون توی رجیستر قرار بگیره و بعد از انجام عملیات مورد نظر ، حاصل اون دوباره در محل ذخیره متغیر قرار بگیره.
              توی این برنامه با استفاده از %0 یا %3 یا مثلا" %4 و با استفاده از :: و .... یه جورایی این %(عدد) ها را با آدرس متغیر متناظرش ربط داده تا دیگه لازم نباشه بصورت مستقیم داده ها را داخل رجیستر ها فراخوانی کنه و عملیات دلخواه را انجام بده. آیا در کدویژن هم راهی برای انجام چنین کاری هست؟
              جدیدترین ویرایش توسط hamid reza_1364; ۱۴:۳۸ ۱۳۹۹/۰۱/۱۵.
              حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

              دیدگاه


                پاسخ : برنامه نویسی به زبان اسمبلی

                سورسی را که شما قرار داده اید بر حسب فرمت آن ظاهرا مربوط به کدنویسی اسمبلی inline در AVR-GCC است که اصول آن به کلی با کدویژن متفاوت است.در فایلی که قبلا معرفی شد در مورد تناظر بین متغیرها و رجیسترها و اینکه متغیرهای تعریف شده در کدویژن در چه رجیسترهایی قرار می گیرند کاملا توضیح داده شده و اگر به زبان اسمبلی مسلط باشید می توانید از روی توضیحات آن فایل، کار مورد نظر را انجام دهید. ضمنا در صورت قرار دادن Optimization در کامپایلر روی speed، به جز موارد خیلی خاص معمولا نیازی نیست بخواهید بخشی از کد را با زبان اسمبلی بنویسید. مگر آنکه کاربردی مورد نظر باشد که بسیار Time critical باشد و حتی یک یا چند دستورالعمل کمتر یا بیشتر، در نتیجه کار موثر واقع شود.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه

                لطفا صبر کنید...
                X