000
08.05.2008, 21:58 Uhr
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. |