Ich habe mir die printf-Funktion von linux-0.01 geklaut und soweit
angepasst, dass ich diese, auf x86, in jedes Projekt mit einer C und
einer Header Datei einbinden kann.
Jetzt will ich diese Funktion aber auch auf einem ARM laufen lassen. Die
späteren printf Funktionen aus dem Kernel oder die der glibc/uclibc sind
mir einfach zu aufgebläht, darum will ich auch keine andere haben.
Nun bin ich auf ein Problem gestossen. Im Code ist dieses Makro:
1 | #define do_div(n,base) ({ \
|
2 | int __res; \
|
3 | __asm__("divl %4":"=a" (n),"=d" (__res):"0" (n),"1" (0),"r" (base)); \
|
4 | __res; })
|
Da sich dieses nicht einfach so für ARM übersetzen lässt und ich weder
gross Ahnung von x86-ASM und überhaupt gar keine von ARM-ASM habe, würde
ich das gerne in C haben.
Mit ein bisschen googlen habe ich das gefunden:
1 | #define do_div(n,base) ({ \
|
2 | int __res; \
|
3 | __res = ((unsigned long)(n)) % (unsigned)(base); \
|
4 | (n) = ((unsigned long)(n)) / (unsigned)(base); \
|
5 | __res; \
|
6 | })
|
(Quelle: http://lwn.net/Articles/38643/ )
Allerdings komme ich damit nicht allzuviel weiter, da das Stück in einem
64bit Source-File steht und mich das ein wenig verwirrt. Das Zweite ist,
ich verstehe noch nichtmal ganz das erste Makro.
32/64bit Probleme dürften mit C ja aussen vor sein, da longs und ints ja
vom Compiler gemacht werden und ich nirgends im Code bei do_div etwas zu
bestimmen Datentypbreiten finden kann, oder?
Ich hoffe mir kann das mal einer etwas näher bringen.