www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Inline Assembler


Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi leute hab mal ne Frage.
Unzwar würde ich gern in meinem C Programm ein 16x16 Multiplikation 
nutzen und habe mir daher von Atmel dieses Stück Assembler Code geholt:
;***************************************************************************
;*
;* "mpy16u" - 16x16 Bit Unsigned Multiplication
;*
;* This subroutine multiplies the two 16-bit register variables 
;* mp16uH:mp16uL and mc16uH:mc16uL.
;* The result is placed in m16u3:m16u2:m16u1:m16u0.
;*  
;* Number of words  :14 + return
;* Number of cycles  :153 + return
;* Low registers used  :None
;* High registers used  :7 (mp16uL,mp16uH,mc16uL/m16u0,mc16uH/m16u1,m16u2,
;*                          m16u3,mcnt16u)  
;*
;***************************************************************************

;***** Subroutine Register Variables

.def  mc16uL  =r16    ;multiplicand low byte
.def  mc16uH  =r17    ;multiplicand high byte
.def  mp16uL  =r18    ;multiplier low byte
.def  mp16uH  =r19    ;multiplier high byte
.def  m16u0  =r18    ;result byte 0 (LSB)
.def  m16u1  =r19    ;result byte 1
.def  m16u2  =r20    ;result byte 2
.def  m16u3  =r21    ;result byte 3 (MSB)
.def  mcnt16u  =r22    ;loop counter

;***** Code

mpy16u:  clr  m16u3    ;clear 2 highest bytes of result
  clr  m16u2
  ldi  mcnt16u,16  ;init loop counter
  lsr  mp16uH
  ror  mp16uL

m16u_1:  brcc  noad8    ;if bit 0 of multiplier set
  add  m16u2,mc16uL  ;add multiplicand Low to byte 2 of res
  adc  m16u3,mc16uH  ;add multiplicand high to byte 3 of res
noad8:  ror  m16u3    ;shift right result byte 3
  ror  m16u2    ;rotate right result byte 2
  ror  m16u1    ;rotate result byte 1 and multiplier High
  ror  m16u0    ;rotate result byte 0 and multiplier Low
  dec  mcnt16u    ;decrement loop counter
  brne  m16u_1    ;if not done, loop more
  ret

meine Frage ist nun wie ich diesen Code in mein Programm einbaue so das 
ich ihn zum beispiel per Multi(x,y) aufrufen kann.Hab keine Ahnung vom 
Assembler.

Gruss Flo

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Computer --> Internet --> Google --> AVR libc --> User Manual --> 
"Inline Assembler Cookbook"

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, inline assembler dafür ist eigentlich Humbug.  Da er ohnehin
eine Funktion aufrufen können will, wäre eine separate Assemblerdatei
viel sinnvoller.

Mit "ab keine Ahnung vom Assembler" wird man da allerdings so oder so
nicht sehr weit kommen.

http://www.nongnu.org/avr-libc/user-manual/group__...
http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...

Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das Problem is das ich einfach nur ein Funktion für die Multiplikation 
benötige, da ich einen AD Wert in eine Spannung Wandeln möchte.Habe aber 
noch keine in C gefunden

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Für welchen Controller soll das denn sein? Atmegas haben z.B. einen 
Hardwaremultiplizierer. Dann wäre der Code Unsinn. Ansonsten musst du 
dich mal informieren, wie in C Variablen übergeben werden (Register, 
Stackframe,...).

MfG Spess

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Idb wrote:
> das Problem is das ich einfach nur ein Funktion für die Multiplikation
> benötige, da ich einen AD Wert in eine Spannung Wandeln möchte.Habe aber
> noch keine in C gefunden

Aber C kannst du, ja?  Dann weißt du auch, dass man mit einem Stern
als Operator multipliziert, oder?

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tuts die Multiplikationsroutine aus der LIBC denn nicht?

Autor: Florian Idb (fbeek)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Stern ist klar aber wenn ich 678*2560 rechne spuckt der 
Werte raus mit 15 stellen das kann nicht sein. Es handelt sich um einen 
Atmega 8.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@fbeek,

dann poste doch mal deinen C Sourcecode und ich schaue solange ob ich 
noch Popcorn finde.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Idb wrote:

> Das mit dem Stern ist klar aber wenn ich 678*2560 rechne spuckt der
> Werte raus mit 15 stellen das kann nicht sein.

Doch, das ist so.  Bevor du hier mit Assembler losschlagen willst,
mit dem du nach deiner Aussage gar nicht umgehen kannst, mach dir
erstmal Gedanken um C und um die Wertebereiche von Zahlen.

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.