ASM Makro "do_div(n,base)" nach C Übersetzen

OP Persönliche Seite #1648249
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren