Robotrontechnik-Forum

Registrieren || Einloggen || Hilfe/FAQ || Suche || Mitglieder || Home || Statistik || Kalender || Admins Willkommen Gast! RSS

Robotrontechnik-Forum » Technische Diskussionen » Frage zu C und ASM » Themenansicht

Autor Thread - Seiten: -1-
000
08.05.2008, 21:58 Uhr
Olli

Avatar von Olli

Hallo,

ich bin mitten dabei den WEGA Kernel nachzuentwickeln, so das die aus den Sourcen resultierenden Objekte 100% identisch mit den Originalobjekten sind.

Dabei habe ich nun ein kleines Problem. Gegeben sei folgender Beispielsource:


Quellcode:
mkseg()
{
        register unsigned size;
        struct a {      
                unsigned segno;
                unsigned size;
        }      
        *uap;
                  
        size = ((struct a *)u.u_ap)->size;
}

der relevante Teil davon (die Zuweisung) wird zu folgendem ASM Source:


Quellcode:
000020: 3124 0002           ld      r4,r2(#$0002)
000022: a17c                ld      r12,r7

Ich benoetige aber folgenden ASM Source:


Quellcode:
000020: 3124 0002           ld      r4,r2(#$0002)
000022: bd60                ldk     r6,0
000023: a147                ld      r7,r4
000024: 1606 0000 00ff      addl    rr6,#$000000ff
000027: b36d fff8           sral    rr6,#8
000029: a17c                ld      r12,r7

Wie man sieht, wird der Wert aus ((struct a *)u.u_ap)->size mit 255 addiert, und dann 8 Bits nach rechts verschoben. Dazu wird auch ein Langwort (32 Bit) als Zwischenschritt verwendet. "size" (r12) selber ist aber kein Langwort - also nicht vom C-Typ "long". Ich habe schon versucht, size als long zu definieren und dann mal vor der Zuweisung testweise mit 255 zu adieren - aber das fuehrt dann zu folgendem Code der richtig ist wie ich ihn definiert habe, aber nicht so ist wie ich ihn brauche da size (r12) eben kein long ist (8Bit-Rechtsshift habe ich auch noch dazugepackt aendert aber nichts an dem Problem).


Quellcode:
000020: 3124 0002           ld      r4,r2(#$0002)
000024: 0104 00ff           add     r4,#$00ff
000028: bd60                ldk     r6,0
00002a: a147                ld      r7,r4
00002c: 946c                ldl     rr12,rr6

Weiss einer wie der C-Source auszusehen hat damit das gewuenschte ASM rauskommt?
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000

Dieser Beitrag wurde am 08.05.2008 um 21:59 Uhr von Olli editiert.
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
001
08.05.2008, 22:07 Uhr
Olli

Avatar von Olli

Kennt Ihr das? Ihr denkt Ihr kommt nach recht langer Suche nicht weiter, entschliesst euch dann, doch mal wen zu fragen - probiert aber danach dann doch noch weiter - und just die naechste Loesung die Ihr probiert ist dann quasi die richtige? Verdammt Mensch! so ists hier...


Quellcode:
size = (long)((struct a *)u.u_ap)->size + 255 >> 8;

Das proudizert das gewuenschte ergebniss.. auch wenn sich mir nicht so ganz der Sinn erschliesst wiso ich das 16Bit-Wort mit 8Bit addiere, dann 8 Bit nach rechts verschiebe um dann eh wieder die letzten 8 bit zu nehmen und zuzuweisen... nunja, was solls...
--
P8000 adventures: http://pofo.de/blog/?/categories/1-P8000
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
002
08.05.2008, 22:13 Uhr
Enrico
Default Group and Edit


Ja, das kenne ich! Auch wenn ich hiervon überhaupt nix verstehe.
--
MFG
Enrico
Seitenanfang Seitenende
Profil || Private Nachricht || Suche Zitatantwort || Editieren || Löschen
Seiten: -1-     [ Technische Diskussionen ]  



Robotrontechnik-Forum

powered by ThWboard 3 Beta 2.84-php5
© by Paul Baecher & Felix Gonschorek