Article View: pl.comp.lang.c
Article #4716+16 != 32 (gcc, linux)
From: slo... Tomasz Slodkowicz
Date: Fri, 10 Oct 1997 00:00
Date: Fri, 10 Oct 1997 00:00
68 lines
2594 bytes
2594 bytes
No wlasnie, dokladnie tak: 16 bitow + 16 bitow != 32 bitow...
Ale po kolei. Przenosilem program dosowy pod linuxa. Caly dzien walczylem ze
zrodlami jadra (gdzie znalezc specyfikacje tych roznych ioctl dla roznych
urzadzen???) i wreszcie program zaczal jakos dzialac (nie bylo to latwe,
troche brakuje asemblera pod linuxem z inb, outb itp).
Dane zwracane - teraz juz przez jadro - ogladalem poprzez zdefiniowana
strukture. I tu zaczely sie klopoty...
struct xxxx {
unsigned :3;
unsigned :4;
unsigned :1;
unsigned char [6];
unsigned ;
unsigned long;
} tak mniej wiecej wygladala pod dosem.
Oczywiscie (?) pojawily sie smieci, choc dane zwracane byly dobre.
Po pierwsze dosc szybko znalazlem (w limits.h) ze int w gcc ma 32 bity,
wiec zmienilem unsigned na unsigned short...
Od razu sie poprawilo, ale od pewnego miejsca dalej byly bledy. Dlugo
szukalem co to, ale w koncu znalazlem. Pierwszy wystepujacy w strukturze
skladnik long zawieral dane:
0xSSSSHHHH (0xLLLL) S - smieci, H - bardziej znacz. slowo, L - mniej
^^^^^^^ to tutaj to nastepne bajty w strukturze
Czyli bylo cos przesuniete... Myslalem ze cos skopalem (dodalem jakies dane
do struktury), ale nie. Poza tym, gdyby to bylo tylko przesuniete, to bylo
by ssss LLLLHHHH (w i386 sa odwrocone kolejnosci slow, bajtow...)
Okazuje sie, zapisy:
unsigned short [2]; i unsigned long ;
pomimo ze maja tyle samo bitow (32) zwracaja rozne dane!!! Nie chodzi tu tez
o wyrownanie adresow (bo w innej kolejnosci sa slowa).
Teraz dziala to tak, ze :
unsigned short a[2];
unsigned long b;
*(unsigned long *)(&a) daje poprawne dane, a b zle...
Nie rozumiem o co tu moze chodzic...
Albo pokazujac inaczej:
W pamieci: aa bb cc dd ee ff gg (hex)
2xshort: --i-- --j--
1xlong -----l----- --k--
to *(unsigned long*)(& i) == 0xddccbbaa
a l == 0x####ddcc (przy czym k == 0xffee)
Co z tym zrobic? Czy tak ma byc? Jak to obejsc?
Tomek
--
Tomasz Slodkowicz Institute of Computer Science
Jagiellonian University, Cracow, Poland
e-mail: slo...@ii.uj.edu.pl
www : http://www.ii.uj.edu.pl/~slodki
Technical Details
Message-ID:
<61lbcg$779$3@info.cyf-kr.edu.pl>Path:
mbox-mo1.pugleaf.net!unknown!not-for-mailShow Full Headers
Complete Article Headers
From: slo...@infoserv.ii.uj.edu.pl (Tomasz Slodkowicz) Subject: 16+16 != 32 (gcc, linux) Date: 1997/10/10 Message-ID: <61lbcg$779$3@info.cyf-kr.edu.pl> X-Deja-AN: 279294426 Organization: Dept.of Comp. Science of Jagiellonian University Newsgroups: pl.comp.lang.c MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit