www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16bit x16bit =32bit inline assembler


Autor: kaffeetas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich verwende erfolgreich die 16x16 multiplikation aus
Beitrag "16Bit x 16Bit = 32Bit schnelle Multiplikation für 8Bit AVR in C"

nun habe ich versucht damit und aus der AVR201 das ganze auf signed 
umzustellen:
inline int32_t multi16s(int16_t zahl_a, int16_t zahl_b)
{
  int32_t result;
  char hilf;
  asm(
    "clr hilf"   "\n\t"
    "muls %B1,%B2"   "\n\t"      
    "mov %D0,R1"   "\n\t"
    "mov %C0,R0"   "\n\t"
    "mul %A1,%A2"  "\n\t"    
    "mov %B0,R1"   "\n\t"
    "mov %A0,R0"   "\n\t"
    "mulsu %B1,%A2""\n\t"    
    "sbc %D0,hilf"  "\n\t"
    "add %B0,R0"  "\n\t"
    "adc %C0,R1"  "\n\t"
    "adc %D0,hilf"  "\n\t"
    "mulsu %B2,%A1" "\n\t"    
    "sbc %D0,hilf"  "\n\t"
    "add %B0,R0"    "\n\t"
    "adc %C0,R1"  "\n\t"
    "adc %D0,hilf"  "\n\t"
    "clr R1"   "\n\t"
    : "=&r" (result)
    :"r" (zahl_a), "r" (zahl_b));

  return result;
}
Es kompiliert nicht und erzeugt eine ganze Latte Fehlermeldungen
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s: Assembler messages:
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:517: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:518: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:521: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:522: Error: unknown opcode `mulu'
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:523: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:526: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:548: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:548: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:549: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:552: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:553: Error: unknown opcode `mulu'
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:554: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:557: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:572: Error: register number above 15 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:578: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:578: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:579: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:582: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:583: Error: unknown opcode `mulu'
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:584: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:587: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:610: Error: register number above 15 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:616: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:616: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:617: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:620: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:621: Error: unknown opcode `mulu'
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:622: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:625: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:639: Error: register number above 15 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:645: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:645: Error: register r16-r23 required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:646: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:649: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:650: Error: unknown opcode `mulu'
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:651: Error: constant value required
C:\DOKUME~1\ADMINI~1\LOKALE~1\Temp/ccFi0i31.s:654: Error: constant value required

soviel kann doch eigentlich nicht falsch sein oder?
Bitte helft mir ich komm sonst noch in die Klapse :-)

Grüße
 kaffeetas

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ersetz mal das r durch ein a, dann sollten die ganzen r16-r23 required 
Fehler weg sein.
Desweiteren kannst du hilf nicht so einfach ansprechen, das musst du der 
inline asm Funktion genauso übergeben wie die anderen Variablen. Les dir 
am besten mal das Inline Assembler Cookbook das beim gcc dabei ist 
durch. Der Abschnitt Clobbers könnte auch für dich auch interessant 
sein.

Autor: kaffeetas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ACK
obwohl ichs nicht verstehe hatte die "r" aus dem obigen code kopiert und 
ob "any register" oder "simple upper register" sollte doch keine Roller 
spielen (wenn kein unteres mehr frei ist soll er halt ein oberes nehmen)

die "constant value required" bleiben das "mulu" hab ich wieder nach 
"mulsu" gefixt.

danke für die schnelle Antwort

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kaffeetas schrieb:

> obwohl ichs nicht verstehe hatte die "r" aus dem obigen code kopiert und
> ob "any register" oder "simple upper register" sollte doch keine Roller
> spielen (wenn kein unteres mehr frei ist soll er halt ein oberes nehmen)

Doch: mulsu funktioniert nur mit r16-r23. Und a zwingt den Compiler eben 
diese Register zu verwenden.

Autor: Z8 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... nur gut das es asm gibt. :)

Autor: kaffeetas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann die angezeigte tempdatei nicht finden! Da muss ich doch 
bestimmt noch was einstellen dass diese erhalten bleibt die Frage ist 
nur wieder wo!!

das hilf hab ich durch _tmp_reg ersetzt, dann brauch ich "hilf" nicht 
clobbern?

achso vor ichs vergesse es läuft, ich werd verückt es läuft!

und das beste es rechnet anscheinend auch noch richtig.

danke Benedikt!

P.S. asm ist super da kann man mit ner "simplen" multiplikation den 
halben abend verbringen!

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kaffeetas schrieb:
> ich kann die angezeigte tempdatei nicht finden! Da muss ich doch
> bestimmt noch was einstellen dass diese erhalten bleibt die Frage ist
> nur wieder wo!!

Such mal im gcc Forum, da gabs irgendeinen Befehl mit dem man das 
einstellen kann.

> das hilf hab ich durch _tmp_reg ersetzt, dann brauch ich "hilf" nicht
> clobbern?

Ja.

> P.S. asm ist super da kann man mit ner "simplen" multiplikation den
> halben abend verbringen!

Versuch das ganze jetzt mal für einen AVR ohne mul Befehl zu 
programmieren. Da kommt Freude auf...

Autor: kaffeetas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
-save-temps bei den Compiler Optionen im Makefile -das ich da nicht 
selbst drauf gekommen bin.

Den Spaß hebe ich mir für die Divisionen auf. Die Routinen gibts ja 
schon, man muss Sie ja nicht neuerfinden nur selbst mal nachvolziehen ob 
das "Rad" auch rund ist und dann auch zum laufen bringen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.