اطلاعیه

Collapse
No announcement yet.

پیدا کردن آدرس آرگومان های ارسالی به تابع C در اسمبلی

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

    پیدا کردن آدرس آرگومان های ارسالی به تابع C در اسمبلی

    سلام
    برای ضرب دو متغیر 32 بیتی تو کدویژن که حاصلش میشه 64 بیت یه تابع نوشتم که کل دستورات اسمبلی هست، یعنی این جوری:
    کد:
    void(long *a,long b,long c)
    {
    #asm
    
    دستورات اسمبلی که کار ضرب دو متغیر 32 بیتی را انجام میدهد *a=b*c
    
    #endasm
    
    
    }
    من برای تست داخل قسمت اسمبلی از اعداد ثابت استفاده کردم، حالا میخوام از آرگومان های تابع استفاده کنم، از کجا بدونم این متغیر ها تو چه آدرسی هستن ?
    که از اوجا بردارم و بریزم داخل رجیسترهای مورد نظر که قسمت اسمبلی اونارو تو هم ضرب کنه ؟

    با تشکر
    دوش دیوانه شدم عشق مرا دید و بگفت آمدم نعره مزن جامه مدر هیچ مگو
    گفتم ای عشق من از چیز دگر می​ترسم گفت آن چیز دگر نیست دگر هیچ مگو
    من به گوش تو سخن​های نهان خواهم گفت سر بجنبان که بلی جز که به سر هیچ مگو
    قمری جان صفتی در ره دل پیدا شد در ره دل چه لطیف است سفر هیچ مگو
    مولانا

    #2
    پاسخ : پیدا کردن آدرس آرگومان های ارسالی به تابع C در اسمبلی

    1- بهتره پارامترها رو در رجیسترهای همه کاره R بریزی و از اونها استفاده کنی که برای اینکار R0,R1,R22~R27, R30,R31 در اختیار برنامه نویسیه
    2- آدرس شروع متغیرهای 64 بیتی رو درون همون R ها بذار و بعد تابع رو فراخونی کن(اینکه اون متغیرها کجا قرار بگیرند دیگه با خودته)
    2- یه ضرب معمولی رو در codevision بنویس و در فایل list خروجی کامپایلر ببین چیکار کرده شما هم همون روش رو استفاده کن

    دیدگاه


      #3
      پاسخ : پیدا کردن آدرس آرگومان های ارسالی به تابع C در اسمبلی

      سلام

      آدرس پارامترهای ارسالی در رجیستر Y و مقدار خروجی در رجیستر Z ذخیره می شود .
      مطلب زیر از راهنمای کدویژن آورده شده است:

      کد:
      [CodeVisionAVR
      3.18.1 Calling Assembly Functions from C
      The following example shows how to access functions written in assembly language from a C program:
      // function in assembler declaration
      // this function will return a+b+c
      #pragma warn- // this will prevent warnings
      int sum_abc(int a, int b, unsigned char c) {
      #asm
      ldd r30,y+3 ;R30=LSB a
      ldd r31,y+4 ;R31=MSB a
      ldd r26,y+1 ;R26=LSB b
      ldd r27,y+2 ;R27=MSB b
      add r30,r26 ;(R31,R30)=a+b
      adc r31,r27
      ld r26,y ;R26=c
      clr r27 ;promote unsigned char c to int
      add r30,r26 ;(R31,R30)=(R31,R30)+c
      adc r31,r27
      #endasm
      }
      #pragma warn+ // enable warnings
      void main(void) {
      int r;
      // now we call the function and store the result in r
      r=sum_abc(2,4,6);
      }
      The compiler passes function parameters using the Data Stack.
      First it pushes the integer parameter a, then b, and finally the unsigned char parameter c.
      On every push the Y register pair decrements by the size of the parameter (4 for long int, 2 for int, 1
      for char).
      For multiple byte parameters the MSB is pushed first.
      As it is seen the Data Stack grows downward.
      After all the functions parameters were pushed on the Data Stack
      , the Y register points to the last parameter c, so the function can read its value in R26 using the instruction: ld r26,y.
      The b parameter was pushed before c, so it is at a higher address in the Data Stack.
      The function will read it using: ldd r27,y+2 (MSB) and ldd r26,y+1 (LSB).
      The MSB was pushed first, so it is at a higher address.
      The a parameter was pushed before b, so it is at a higher address in the Data Stack
      
      The function will read it using: ldd r31,y+4 (MSB) and ldd r30,y+3 (LSB).
      The functions return their values in the registers (from LSB to MSB):
      •R30 for char and unsigned char
      •R30, R31 for int and unsigned int
      •R30, R31, R22, R23 for long and unsigned long.
      So our function must return its result in the R30, R31 registers.
      After the return from the function the compile r automatically generates code to reclaim the
      Data Stack
      space used by the function parameters.
      The #pragma warn- compiler directive will prevent the compiler from generating a warning that the
      function does not return a value.
      This is needed because the compiler does not know w hat it is done in the assembler portion of the
      function.

      دیدگاه


        #4
        پاسخ : پیدا کردن آدرس آرگومان های ارسالی به تابع C در اسمبلی

        نوشته اصلی توسط mojalan
        1- بهتره پارامترها رو در رجیسترهای همه کاره R بریزی و از اونها استفاده کنی که برای اینکار R0,R1,R22~R27, R30,R31 در اختیار برنامه نویسیه
        2- آدرس شروع متغیرهای 64 بیتی رو درون همون R ها بذار و بعد تابع رو فراخونی کن(اینکه اون متغیرها کجا قرار بگیرند دیگه با خودته)
        2- یه ضرب معمولی رو در codevision بنویس و در فایل list خروجی کامپایلر ببین چیکار کرده شما هم همون روش رو استفاده کن
        سلام
        این سوال رو تو تاپیک اسمبلی پرسیدم کسی جواب نداده فعلا
        نوشته اصلی توسط فرامرز مختاری
        سلام،
        تو کامپایلر کدویژن نیاز به ضرب 32 بیت در 32 بیت داشتم و حاصل رو داخل یه رشته 64 بیتی(8بایتی) بریزه، چون کدویژن متغیر 64 بیتی نداره، این ضرب رو داخل Atmel Studio انجام دادم و کد های اسمبلی تابع رو به کد ویژن منتقل کردم.
        حالا یه تابع سی دارم که از کلا دستورات اسمبلی هستش،
        سوالی که دارم حین انجام عملیات ضرب مقادیر رجیسترها (R0-R32)تغییر میکنه، این تغییرات روی ادامه برنامه تاثیر می ذاره ؟ تو خود Atmel Studio که نگاه کردم همه رجیستر هایی که استفاده کرده بود رو push و pop نکرده بود؟!
        اصلا من اگه کل 32 تا رجیستر رو اول تابع push کنم و آخرش pop کنم حله؟؟ مشکلی پیش نمیاد ؟؟؟
        با تشکر
        آقای mojalan پست شما جواب این سواله دیگه؟ یعنی اگه من R0,R1,R22~R27, R30,R31 رو داخل تابع تغییر بدم مشکلی برای ادامه برنامه رخ نمیده و فقط رجیستر های R2~R21 رو اگه استفاده کردم push ,pop کنم ؟
        درست متوجه شدم آیا ؟
        دوش دیوانه شدم عشق مرا دید و بگفت آمدم نعره مزن جامه مدر هیچ مگو
        گفتم ای عشق من از چیز دگر می​ترسم گفت آن چیز دگر نیست دگر هیچ مگو
        من به گوش تو سخن​های نهان خواهم گفت سر بجنبان که بلی جز که به سر هیچ مگو
        قمری جان صفتی در ره دل پیدا شد در ره دل چه لطیف است سفر هیچ مگو
        مولانا

        دیدگاه

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