32 bitlik değişkenin yüksek 16 bitine tek çırpıda erişmek

Başlatan bunalmis, 26 Nisan 2011, 19:47:54

z

C dilinde, 32 bitlik değişkenin yüksek 16 bitine asm sadeliğinde nasıl erişebilirim?

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

SpeedyX


Klein

Katılıyorum. En kolay yol union kullanmak. Pointer kullanarak da yapılabilir ama pek asm sadeliğinde olmaz.

Erol YILMAZ



mufitsozen

Sevgili @gerbay,

haddim olmayarak bir kac dusuncemi belirtmek isterim.

ARM mimarisinde degiskenler istege gore (data yada code icin) little-endian yada big-endian olarak set edilebilir.

Bir cok isletim sistemi kullanicidan bagimsiz olarak ARM mimarisinde bu endien'lik durumunu set eder (ornegin symbian os, linux vb arm icin little-endian'dir)

Simdi @bunalmis hocam assembler kullanmayi cok sevdigi icin, en yuksek 16bit'e erismek konusunda programinda endian indikatorunu nasil set ettigini sormak lazim (yada ARM default hangisini seciyor)

bir baska konuda MCUlarda bolme islemi cok pahali bir islemdir(zaman acisindan) eger bolen 2nin katlari ise >> operatoru ile kaydirma yaparak bolmek daha hizlidir, burada dikkat edilecek nokta isaret bitinin nasil kaydirilacagidir, onun icin unsigned bir cast kullanilmasi daha dogru olur.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

@mufitsozen

Assemblyde hedef adresi bir registere yükledikten sonra o adrese istersek word tipi komutla 16 bit erişim istersek int tipi komutla 32 bit erişim yapıyoruz.

Tüm kodlarımı saf asm yazmadığım için C derleyicinin seçtiği veri sıralamasına müdahale etmiyorum. (Eğer gerekirse veri dizilişi nasıl olursa olsun assembly komut ile verileri Big Endian'dan little Endian'a yada tersine tek komutla çevirme şansım var.)

Başlığı yanlışlıkla ARM altına attım aslında Cortex M3 altına atmalıydım. Standart veriuzunluklarının tam katlarına yada kesirlerine erişimlerde bölme veya kaydırma işlemleri komut setinde olsa bile düşünülecek en son aşama olmalı. Bu dediğim tabiki hızlıca işlenip bitmesi gereken rutinler için geçerli.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: bunalmis - 27 Nisan 2011, 13:13:08
@mufitsozen

Assemblyde hedef adresi bir registere yükledikten sonra o adrese istersek word tipi komutla 16 bit erişim istersek int tipi komutla 32 bit erişim yapıyoruz.

Tüm kodlarımı saf asm yazmadığım için C derleyicinin seçtiği veri sıralamasına müdahale etmiyorum. (Eğer gerekirse veri dizilişi nasıl olursa olsun assembly komut ile verileri Big Endian'dan little Endian'a yada tersine tek komutla çevirme şansım var.)

Başlığı yanlışlıkla ARM altına attım aslında Cortex M3 altına atmalıydım. Standart veriuzunluklarının tam katlarına yada kesirlerine erişimlerde bölme veya kaydırma işlemleri komut setinde olsa bile düşünülecek en son aşama olmalı. Bu dediğim tabiki hızlıca işlenip bitmesi gereken rutinler için geçerli.

hizlica yapmak icin >> operatoru (saga kaydirma) bile size yavas gelecektir.

eger 32 bit bilginin hafizada nasil oldugunu biliyorsaniz (ve generik multi platform, tasinabilir bir kod yazmiyorsaniz) bir union/structure arayiciligi ile sonuc almak en hizlisi olacaktir.

ornek C programi: (Borland C++ 4.5 ile yazilmis)

#include <stdio.h>

#include <conio.h> //getch fonksiyonu icin

void main(void){

typedef unsigned long int uint32_t;   // 32 bit unsigned type
typedef unsigned int uint16_t;      // 16 bit unsinged type
union uint32_or_uint16{
   uint32_t Bit32;
   uint16_t Bit16[2];
} Num32_16;


uint32_t int32 = 0x12345678L;

uint16_t int16;

int16 = (uint16_t) int32;
printf("\n int16 degeri: %x", int16);

Num32_16.Bit32 = int32;
printf("\n int16 degeri[0]: %x \n int16 degeri[1]: %x", Num32_16.Bit16[0],Num32_16.Bit16[1] );


getch();

}

int16 degeri: 5678
int16 degeri[0]: 5678
int16 degeri[1]: 1234
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Onu diyorum işte. Kaydırma ve bölmeden uzak durmak lazım. (istisna işlemciler hariç)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: gerbay - 27 Nisan 2011, 14:06:50
.....

4 byte ve 2 clock cycle..   ister assembly ile yazın ister C ile..  bence C ile yazmak daha uygun..

bencede!
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.