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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.