اطلاعیه

Collapse
No announcement yet.

ضرب وجمع در اسمبلی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ضرب وجمع در اسمبلی

    با سلام
    من با کامپایلر pic basic poroکار میکنم یه مشکل بسیار اساسی که داره این کامپایلر تا اعداد16 بیتی(65535)بیشتر نمیگیره و در بیشتر پروژه هام نیاز به ضرب و تقسیم اعدادخیلی بزرگتر ازاین رو دارم
    تو این کامپایلر میشه دستور اسمبلی هم نوشت حالا من میخوام 1-تعریف متغیر چند بایتی تو اسمبلی 2-ضرب دوعدددر اسمبلی3-تقسیم 2عدد دراسمبلی رو یاد بگیرم
    خواهش میکنم اگه کسی بلده اطلاعاتشو در اختیار ما هم قرار بده

    ضمنا میدونم که این کامپایلر بده و قدیمیه و ....اتفاقا من سی هم بلدم ولی پروژه هامن طورین که باید با این کامپایلر نوشته بشن
    اگريك فلج مادر زاد در مسابقه دو ماراتون نفراول نشود مقصر فقط وفقط خودش است...

    #2
    پاسخ : ضرب وجمع در اسمبلی

    پیاده سازی ریاضیات 16 بیتی(و بیشتر) با اسمبلی وحشتناک پیچیده میشه. کردم که میگم!
    شما برو سراغ سی.
    موفق و موید باشی

    دیدگاه


      #3
      پاسخ : ضرب وجمع در اسمبلی

      من فکر میکنم شما اشتباه میکنید که متغیر بزرگتر از 16 بیت نداره.
      این لینک رو نگاه کن :
      http://www.mikroe.com/chapters/view/...rocontrollers/

      این عبارت رو توش سرچ بزن "BASIC LANGUAGE DATA TYPES"
      یه جدول میاد که توش longword , longint, float رو نوشته.
      پس این جدول چی میگه ؟؟؟؟

      دیدگاه


        #4
        پاسخ : ضرب وجمع در اسمبلی

        نوشته اصلی توسط freedom_truth
        پیاده سازی ریاضیات 16 بیتی(و بیشتر) با اسمبلی وحشتناک پیچیده میشه. کردم که میگم!
        شما برو سراغ سی.
        موفق و موید باشی
        اتفاقا من خوراکم کار بااین "بیت"و"بایت"هه.من رشتم کامپیوتره ومشکلی ندارم با بیت و بایت چون به خوبی میفهممشون
        اگه میشه یه توصییح کوچلو بدین راجب تغیر متغیر تو اسمبلی
        مرسی
        اگريك فلج مادر زاد در مسابقه دو ماراتون نفراول نشود مقصر فقط وفقط خودش است...

        دیدگاه


          #5
          پاسخ : ضرب وجمع در اسمبلی

          من با picbasic کار نکردم ولی نکته ای که امیر.م گفت بنظر منطقی میاد.
          بررسی کن اگر درسته دیگه مشکلی نداری.

          در مورد اسمبلی هم من فقط در مورد الگوریتمش صحبت کردم وگرنه در مورد اسمبلی pic و نوشتن اون توی picbasic اطلاعی ندارم.

          دیدگاه


            #6
            پاسخ : ضرب وجمع در اسمبلی

            الان اون لینکی که امیرجان داده بودن بررسی کردم که دو نوع longint و longword طولشون 32 بیت هست.
            یکی signed و اون یکی unsigned.

            دیدگاه


              #7
              پاسخ : ضرب وجمع در اسمبلی

              فقط جهت راهنمایی اگه بی ربط بود ببخشید:
              من AVR با زبون سی کار میکنم. وقتی این کامپایلر کد رو کامپایل میکنه ؛ کد اسمبلی تولید میکنه و بعد با اسمبلر کد هگز میده. موقع شبیه سازی با AVR studio شما کاملا متوجه هستی که کدوم کدهای هگز برای کدوم خطوط از برنامت داره اجرا میشه و به این طریق مثلا یه برنامه ساده مینویسی (نوشتم)که توش دو تا مثلا long int با هم ضرب یا تقسیم بشن بعد دنبال میکنی ببینی چه ماکرویی داره براش اجرا میشه.
              برای PIC هم احتمالا بتونی این روش رو دنبال کنی (کپی پیست وخلاص)

              دیدگاه


                #8
                پاسخ : ضرب وجمع در اسمبلی

                نوشته اصلی توسط امیر . م
                من فکر میکنم شما اشتباه میکنید که متغیر بزرگتر از 16 بیت نداره.
                این لینک رو نگاه کن :
                http://www.mikroe.com/chapters/view/...rocontrollers/

                این عبارت رو توش سرچ بزن "BASIC LANGUAGE DATA TYPES"
                یه جدول میاد که توش longword , longint, float رو نوشته.
                پس این جدول چی میگه ؟؟؟؟
                نداره فقط سه نوع متغیر داره(بیت وبایت و وردword)
                helpش رو هم چک کردم فقط از این سه نوع متغیر نام برده...
                اگريك فلج مادر زاد در مسابقه دو ماراتون نفراول نشود مقصر فقط وفقط خودش است...

                دیدگاه


                  #9
                  پاسخ : ضرب وجمع در اسمبلی

                  سلام دوست عزیز
                  برای اینکه بدونی چطوری به متغیر اسمی رو اختصاص بدی یه برنامه نمونه گذاشتم واست که ابتدای برنامه با EQU این کار انجام شده
                  برای اینکه بدونی چه خونه هایی از اس رم در اختیارته برای نامگذاری متغیر ها به دیتاشیت میکروت مراجعه کن همون 30-40 صفحه اول یه جدول bank register میبینی که از ادرس 0x20 در بانک صفر در اختیار شماست و بانک یک و ...
                  میتونی بجای اینکه نامی رو به متغیر اختصاص بدی مستقیما از ادرسش استفاده کنی
                  MOVWF 0X20
                  مقدار WREG رو میریزه تو Fileregister خونه 0x20
                  من یه تابع دارم که تقسیم 32 بیتی بدون علامت هست، یه تابع هم ضرب 16*16 بیتی بدون علامت، این برنامه هایی بودند که برای AVR نوشته شده بودند اما من موهای سرم سفید شد تا به PIC تبدیلش کردم. شما میتونی از اینا استفاده کنی
                  اما ممکنه به مشکلی بخوری، مثلا تو برنامه بیسیک دو متغیر یک بایتی داری، فرض کامپایلر اومده 0x20,0x21 رو انتخاب کرده، اگر شما ندونی و با 0x20 محاسبات اسمبلی انجام بدی مقدار متغیرت رو از دست میدی ، یا اینکه اگر خونه 0x30 رو استفاده میکنی و تداخلی تو برنامه اسمبلی و بیسیک نداری، اینکه چطور به کامپایلر بیسیک حالی کنی که برو خونه 0x30 رو مثلا با متغیری به نام i جمع کن؟
                  بهرحال این مشکلات با خودت

                  اما توصیه میکنم کاری کن که نه BCD هست نه char چیزی بین این دو ، فرض شما دو متغیر داری بنام i,j ، با این دوتا اعداد 0-9999 رو میتونی داشته باشی ، اما بی سی دی استفاده نکن که هر نیبل رو برای یک رقم اختصاص بدی، بیا همون مقدار باینریشو در نظر بگیر معادل 99 ، که میشه 63 هگز، یعنی اگر متغیر j بایت کم ارزش باشه و متغیر i بایت با ارزش باشه، شما بخوای یه کانتر داشته باشی، متغیر j رو یکی یکی اضافه میکنی و اگر 0x64 شد صفرش میکنی و i رو یکی اضافه میکنی، دردسر این کار از بی سی دی کمتره چون بی سی دی با هر بار اضافه کردن باید تصحیحش کنی ، میدونیم بی سی دی چهار پنج نوع خطا داره که با دستور DAW یا decimal adjust Wreg تو pic18 به بالا یا DA در 8051 ها این خطا تصحیح میشه، البته این روش برای تقسیم و ضرب دنگ و فنگ داره و فقط جمع و تفریق راحته باهاش

                  تابع تقسیم 32 بیتی و ضرب 16 بیتی
                  http://s1.picofile.com/file/7881286555/ASM_Div32.zip.html

                  نمونه
                  http://s1.picofile.com/file/7881291177/0_9999_COUNTER.zip.html
                  فایل با نام g رو باز کنید

                  Good Luck

                  دیدگاه

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