SW4STM32 (GCC) Inline Assembly nasıl kullanılır?

Başlatan Cemre., 25 Kasım 2017, 16:09:11

Cemre.

Merhaba,

Bazı noktalarda if büyüktür if küçüktür ile kalabalık yaratmamak için özellikle 10bit, 12bit gibi sabit değerlerde saturasyon yapmak istediğimde USAT ve SSAT assembly komutlarını kullanıyordum. Keil ile bunu yapmak çok kolay çünkü direk değişken ile yazabiliyorum. Ancak GCC'de işler böyle değil anladığım kadarıyla.

Yapmak istediğim şey
__asm {USAT iSetPoint, 12, iSetPoint};

iSetPoint değişkenini unsigned 12bit sature et ve iSetPoint'e tekrar yaz.

Keil'de bu şekilde yapılabiliyordu. Ancak SW4STM32 burada hata veriyor. Öncelikle {} yerine (" ") kullanmak gerektiğini fark ettim. Ancak değişkenlerin tanımlı olmadığı ile alakalı hatalar alıyorum.

Araştırdığım kadarıyla değişkenlerin ASM bloğuna argüman olarak geçilmesi gerekiyor, örnek:

int arg1, arg2, add ;
__asm__ ( "addl %%ebx, %%eax;"
        : "=a" (add)
        : "a" (arg1), "b" (arg2) );


Peki %ebx %eax vs ne anlama geliyor?

Yardımcı olursanız sevinirim.

İyi çalışmalar...

Cemre.

__asm("USAT %0, 12, %1;":"=r" (hedef değişken):"r" (sature edilecek değişken));


Sanırım bu şekilde olmalı. Bilen biri de onaylarsa çok güzel olacak :)

muhittin_kaplan


bsenguler

Eax, ebx işlemcinin içindeki 32 bitlik registerlardan sadece 2'si

OptimusPrime

If yazmamak için  bu kadar eziyet çekilir mi ?  :)

bundan önce bence aşağıdakileri gözden geçirmek lazım
- bunun ne yararı var.
- C ve asm ikilisi aynı dosyaya girince anlaşılması zorlaşır.
- kontrol edin belkide C derleyici istediğinizi arka planda yapıyor. Veya derleyici ayarları bu asm komutunu kullanmaya zorlayabilir.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Zoroaster

Alıntı yapılan: Cemre. - 25 Kasım 2017, 16:09:11
.... Peki %ebx %eax vs ne anlama geliyor? ....

X86 serisi islemcilere ait registerlere atifta bulunan simgeler gibi duruyor.
Seytan deliginden kacti.