🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.c
Article #47

16+16 != 32 (gcc, linux)

#47
From: slo... Tomasz Slodkowicz
Date: Fri, 10 Oct 1997 00:00
68 lines
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-mail

Show 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