Int değişkenin Hıgh Byte'na erişim

Başlatan FEHMİ_ASM, 17 Eylül 2011, 08:20:57

FEHMİ_ASM

  İnt türünde bir değişkenin Hıgh ve Low byte'na (mantıksal operatör komutlarını kullanmadan) birbirinden bağımsız olarak nasıl erişibiliriz? Artan ve azalan yönde sayaclarım var ve 8 bit adresleme için bunları ayırmam lazım.
  Örneğin Syc1'in Hıgh Byte'na erişmek için C18'in özel olarak tanıdığı bir erişim komutu   Syc1__Hıgh  ya da benzeri birşey deyebilir miyiz?
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai


-Hasan-

Merhabalar;

Hocam; bu C18, CCS C ' nin mi?


gambit1244

#4
dostum sayıyı 100 e bölersen(a\100) soldaki high byte
100 e bolüp kalanını alırsan(a%100) low byte ına herişirsin

ama hex olarak
0x100 a bölceksin
ve 0x100 mod 100 alcaksın

buna benzer olarak
bu işlemin tam tersini yapmak istersen
yani 2 farklı byte ı 8 bitlik
tek degişkene 16 bit olarak eklemek gerekirse

high olmasını istedigin byte ı 0x100 ile çarpıp  FF den FF00 a çevirceksin  (ff örnekti)
low olmasını istedigin byte ı da bu deger ile toplucaksın mesela fa   noldu FFFA oldu
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

mufitsozen

Alıntı yapılan: gambit1244 - 17 Eylül 2011, 09:57:15
dostum sayıyı 10 a bölersen(a\10) soldaki high byte
10 a bolüp kalanını alırsan(a%10) low byte ına herişirsin

ama hex olarak
0x10 a bölceksin
ve 0x10 mod 10 alcaksın

buna benzer olarak
bu işlemin tam tersini yapmak istersen
yani 2 farklı byte ı 8 bitlik
tek degişkene 16 bit olarak eklemek gerekirse

high olmasını istedigin byte ı 0x100 ile çarpıp  FF den FF00 a çevirceksin  (ff örnekti)
low olmasını istedigin byte ı da bu deger ile toplucaksın mesela fa   noldu FFFA oldu

ozur dileyerek duzeltmek zorundayim, mesajin icerigi dogrumu bilmiyorum (bakamadim) ama hex sayi 0x100 olmali!

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

Tagli

Pointer casting yapabilirsin, ama performansı nasıl etkiler bilmiyorum. Yani belki mantıksal operatör kullanmak daha iyi bir çözüm olabilir, denemek lazım.

Örnek vermek gerekirse:
int a; tanımlı olsun.
char* ptr = (char*)(&a);
char low = *ptr;
char high = *(ptr+1);

Endian olayını yanlış hatırlıyor olabilirim, kodu bildiğin bir değer ile kontrol etmen lazım. Ve dediğim gibi, bu işlem mantıksal operatör kullanımına göre daha düşük performanslı olabilir.
Gökçe Tağlıoğlu

FEHMİ_ASM

        Yorumlara bakılırsa Logıc Door kullanmak daha mantıklı gözüküyor. Bir amacım da arka planda olmasa bile görünür kod'da görüntü sadeliği oluşturmaktı.
       
         İnt değişkenin Üst 8 Bitini maskeleyip Alt 8 bitini RegisterLye kopyalayacağım. Sonra üst 8 biti 8 kez Sağa kaydırıp onları da RegisterH'ye atacağım.

         Programımda zamanlama genel olarak bayağı önemli ama kritik değil. Zaten adres verisini çözümleme yaklaşık olarak en az 70mS'de bir olacak. Şu durumda en sadesi Door kullanmak olacak gibi.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

z

#8
Eger amac, ama tek amac hiz ise zaten asm kacinilmaz. Fakat amac hiz değilse C yi daya gitsin.

Bahsettigin islemi bir kac  yoldan yapabilirsin. Bunlarin herbiri farkli makine kodu uretir. Islemci yada derleyici degistiginde sonuc da farkli olur.

Ornegin ayni yazilim PIC yerine 8086 tabanli bir islemci icin tasindiginda, 16 bit deger CPU registerine okundugunda H ve L  bytelar zaten bu registerin alt bileseni olan registerlere yuklendiginden  H ve L degeri elde etmek icin ilave hic bir kod yazman gerekmez. (C derleyici iyi bir seyse basinin caresine bakar ve sizin amacinizi anladiysa bu yola basvurur.)

Eger A_H=A16>>8 ve AL=A & 0xff goruntu kirliligi yaratiyorsa benzeri kodlari  Bilesenler(int *Reg) gibi bir fonksiyonun icine yazarak gozden uzaklastirabilirsin.

Fakat union taniminin en aptal derleyiciyle bile iyi kod uretmesi lazim.

https://www.picproje.org/index.php/topic,33926.msg237835.html#msg237835

union Ister16_Ister8_8 {
   int Bir_Kerede_16_Bit_Yukle;
   struct Ozel_Integer Sekiz_Bit_Yukle;
};

Yazan kismi inceleyin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

#9
@mufitsözen hocam teşekkür ederim hatamı gördüm sayı 0x100 olmalı haklısınız ben bi bytle lık bilginin son 4 bitine müdahele eder gibi anlatmışım
biraz aceleyle yazdıgım için dalgınlıgıma gelmiş hemen düzelttim
saygılar
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

picman

Böyle durumlarda struct deyimi de kullanılabilir mesela

typedef struct {
        unsigned ustbyte:8;
        unsigned altbyte:8;
}deger = {0,0};

deger.ustbyte = 12;
deger.altbyte = 25;


bu yöntem de işine yaraya bilir..
Bilgi paylaştıkça artar..

OptimusPrime

picman

typedef struct {
        unsigned ustbyte:8;
        unsigned altbyte:8;
}deger = {0,0};

bu kodu derleyebiliyor musun...
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 ||

picman

#12
mesela bir kayar yazı uygulamasında kullandığım kodlarvar ve derlemede problem yok..
struct { //sistem data yapı değişkeni....
	unsigned kontrol:1;
	unsigned font:1;
	unsigned blink:1;
	unsigned invert:1;
	unsigned bekleme:2;
	unsigned hiz:2;
}sistem_data_H={1,0,0,0,0,0}; 

struct {
	unsigned gelme_efekt:4;
	unsigned gitme_efekt:4;
}sistem_data_L={0,0};


bu kodlar düzgün çalışıyor mesela .. ama typedef deyimi kullanmadım ben uygulamalarda. birde struct eleman bitsayısını belirtirken 8 biti aşarsanız tanımladığınız struct değişken int tipinde oluyor sizin yapmak istediğiniz öyle birşey sanırım.
Bilgi paylaştıkça artar..

ErsinErce

#define byte0(x)			(uint8)(*(((uint8 *)&x)+0))
#define byte1(x)			(uint8)(*(((uint8 *)&x)+1))


değişken şeklini değiştirmeden bu şekilde de kullanabilirsin

justice_for_all

bunalmıs hocamın dedigi union ile yaparsan daha kolay olur senin icin
typedef union isim {unsigned int data1;            unsigned char data2[2];};
burda data2nin 0.elemanı high kısmın oluyo
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay