www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik assemblerbefehle


Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HI

so.....
...  fang mal mit dem standarttext an:

      bin assembleranfänger und brauch desswegen eure hilfe! ;)



hab die letzten zwei tage so eure foren durchforstet und trotzdem noch 
ne ganze menge Fragen . vorallem über ne großzahl an befehlen und deren 
bedeutung

also isses vieleicht am einfachsden wenn ihr mir ein quelltext mit 
erklärungen bestückt?!

schön währe es mit  diesem:

http://www.mikrocontroller.net/attachment/16261/UDIV32F.ASM


vieleicht noch als kurze-hintergrund-info

das zeil meines praktikums ist ein programm das von einem gerät eine 
24bit zahl bekommt und durche eine geteilt werden muss die zwischen 
10bit und 20bit breit sein (fals genaueres gewünscht wird einfach 
nachfragen)

weis noch nich wie der µC aussieht bzw heist ^^

ps: nachträglich frohe ostern

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> weis noch nich wie der µC aussieht bzw heist
Dann ist es schlicht Unfug, einen prozessorabhängigen 
Assemblerquelltext zu kommentieren... :-/
Denn jede Prozessorfamilie hat ihren eigenen Assembler mit anderen 
Funktionen und Mnemonics.

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok

:'(

dacht nur das die befehle wenigstens annähernt gleich sind

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> weis noch nich wie der µC aussieht bzw heist
> Dann ist es schlicht Unfug, einen /prozessorabhängigen/
> Assemblerquelltext zu kommentieren... :-/
> Denn jede Prozessorfamilie hat ihren eigenen Assembler mit anderen
> Funktionen und Mnemonics.

Kein Unfug hingegen ist es, sich die Prinzipien die sich in einem Code 
verbergen zu Gemüte zu führen und zu studieren. Dann fällt es nämlich 
auch leichter vorhandenen Code zu studieren und zu analysieren - wenn 
man bereits bekannte Prinzipien wiederentdeckt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dank herr brunner ... aber das hab ich mir schon durchgeschaut
wir haben auch schon halbwegs was programmiert in der uni

aber es ist ein unterschiet hob ich der welt hallo sagen will oder ich 
ne "riesiege" zahl dividieren muus -> deswegen versuch ich bestimmte 
quelltexte zu verstehen

in der uni haben wir hauptsächlich mov und add und sub und sowas benutzt

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp F. schrieb:
> aber es ist ein unterschiet hob ich der welt hallo sagen will oder ich
> ne "riesiege" zahl dividieren muus -> deswegen versuch ich bestimmte
> quelltexte zu verstehen

Die meisten Assemblerprogrammierer haben aus guten Gründen mit 
Programmen der Hallo-Welt-Klasse angefangen. Warum willst Du das 
umbedingt anders machen? Sich zu Beginn optimierte Routinen für 
Berechnungen anzusehen wird Dir außer Frust und Verzweiflung wenig 
bringen.

Philipp F. schrieb:
> das zeil meines praktikums ist ein programm das von einem gerät eine
> 24bit zahl bekommt und durche eine geteilt werden muss die zwischen
> 10bit und 20bit breit sein (fals genaueres gewünscht wird einfach
> nachfragen)

Routinen für Divisionen gibt es schon. Warum willst Du das Rad neu 
erfinden? Das wahre Können liegt darin, vorhandene Komponenten zu 
integrieren und nur dort wo es wirklich nötig ist, eine Eigenentwicklung 
zu starten. Alles andere ist Zeitverschwendung.

Stephan

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan M. schrieb:
> [...] und nur dort wo es wirklich nötig ist, eine Eigenentwicklung
> zu starten. Alles andere ist Zeitverschwendung.

...sollte heißen: dort wo es wirklich sinnvoll ist...

Autor: Bernd N (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> in der uni haben wir hauptsächlich mov und add und sub...

Dann sicher 8051 ASM.

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stephan M. schrieb:
> ...sollte heißen: dort wo es wirklich sinnvoll ist...

Das geht aber nur wenn man den Code verstanden hat. Man muß ihn nicht 
neu erfinden, aber nur mit Copy & Paste ist keine Lösung. (Dann holt man 
sich auch eine 32Bit Zahl aus dem Ram und teilt sie danach durch 256.)

Autor: Stephan M. (stephanm)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MarioT schrieb:
> Das geht aber nur wenn man den Code verstanden hat. Man muß ihn nicht
> neu erfinden, aber nur mit Copy & Paste ist keine Lösung.

Bei Divisionsroutinen schon :-)

Stephan

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Philipp F. (fritz87)

>dank herr brunner ... aber das hab ich mir schon durchgeschaut
>wir haben auch schon halbwegs was programmiert in der uni

Wo ist dann das Problem?

>ne "riesiege" zahl dividieren muus -> deswegen versuch ich bestimmte
>quelltexte zu verstehen

Na dann mach das.

>in der uni haben wir hauptsächlich mov und add und sub und sowas benutzt

Oh, und der Herr Studiosus ist mit dem Selbststudium nicht so vertraut. 
Na umsomehr sollte er sich mal selber drum kümmern.

MFG
Falk

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> Kein Unfug hingegen ist es, sich die Prinzipien die sich in einem
>>> Code verbergen zu Gemüte zu führen und zu studieren.
Oft ist aber der umgekehrte Weg einfacher: erst mal verstehen, wie etwas 
gemacht wird (hier die binäre Division) und dann mal nachsehen, wie 
andere das realisiert haben.
Aber ich finde es sehr schwierig, ein Verfahren anhand einer unbekannten 
Sprache rückwärts herzuleiten... :-/

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok
vielen dank erstmal an alle

dann mal eine direkte frage:

lsl  r16
rol  r19


soll das heisen, dass das höchstwertigste bit von r16, fals es gesetzt 
ist,in r19 "reingeschoben" wird?

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp F. schrieb:
> ok
> vielen dank erstmal an alle
>
> dann mal eine direkte frage:
>
> lsl  r16
> rol  r19
>
>
> soll das heisen, dass das höchstwertigste bit von r16, fals es gesetzt
> ist,in r19 "reingeschoben" wird?

Ja... (und zwar über das Carry-Flag)

...

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>soll das heisen, dass das höchstwertigste bit von r16, fals es gesetzt
>ist,in r19 "reingeschoben" wird?

Jain. Es wird auch hineingeschoben, wenn es nicht gesetzt ist.

MfG Spess

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
schön
danke

und der sbr befehl zb.: sbr r19,1 bedeutet das < r19 = r19 oder 1  > 
ist? also das niederwertigste bit von r19 immer gestzt wird egal was für 
ein zustand es hatt?

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Philipp F. (fritz87)

>und der sbr befehl zb.: sbr r19,1 bedeutet das < r19 = r19 oder 1  >
>ist? also das niederwertigste bit von r19 immer gestzt wird egal was für
>ein zustand es hatt?

Wenn man des Englischen ein wenig mächtig ist, und das sollte man, wenn 
man sowas studiert, ist die auführliche Beschreibung der 
Assemblerbefehle durchaus hilfreich. Dort stehen nämlich alle Befehler 
haarklein erklärt drin. Aber lesen muss man schon selber.

http://www.mikrocontroller.net/articles/AVR-Tutori...
http://www.atmel.com/dyn/resources/prod_documents/...

MFG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt noch eine enfache Möglichkeit.

AVR-Studio installieren
Den Code dort reinkopieren

Bei jedem Befehl, den man nicht versteht, oder bei dem man Hilfe 
braucht:

Den Cursor drauf stellen, F1 drücken
voila: AVR Studio sucht die Beschreibung des Befehls raus und zeigt sie 
an.

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp F. schrieb:
> aber es ist ein unterschiet hob ich der welt hallo sagen will oder ich
> ne "riesiege" zahl dividieren muus

Der Welt nicht "hallo sagen" wollen, aber nach jedem ASM-Befehl fragen.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Wie Divisionen in Assembler funktionieren, findest du in der AppNote 
AVR200 von Atmel:

http://www.atmel.com/dyn/resources/prod_documents/...

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm

Ich denke, die Divisions-Routine hat einen Fehler
udi20:  tst  b2
  breq  udi30
  ldi  t0, 24

Ich denke, das müsste so lauten
udi20:  tst  b1
  breq  udi30
  ldi  t0, 24


(also tst auf b1 anstelle von b2)

Ich habe jetzt nicht grossartig analysiert, sondern begründe meinen 
Verdacht damit

Original:
udiv32:
  clr  t1
  tst  b3
  breq  udi10
  ldi  t0, 8
....
  ret
 
udi10:  tst  b2
  breq  udi20
  ldi  t0, 16
....
  ret
 
udi20:  tst  b2
  breq  udi30
  ldi  t0, 24
....
  ret
 
udi30:  ldi  t0, 32
udi31:  lsl  a0
....

Der Fall udi20 wäre sinnlos, da er nur angesprungen wird, wenn b2 0 ist. 
In dem Fall wird aber von udi20 sofort wieder weiter an udi30 
gesprungen, d.h. der Sprung nach udi30 findet in jedem Fall statt und 
damit wäre die ganze Behandlung in udi20 für die Katz, weil sie nie 
benutzt wird.

Der ganze Divisionsalgorithmus ist ein stinknormaler Divisions-Algo, der 
sich lediglich den Dividenden ansieht, ob Operationen eingespart werden 
können. Wenn das höchstwertige Byte vom Dividenden nicht 0 ist, dann 
müssen alle 32 Bit subtrahiert werden. Es ist aber auch klar, dass das 
Ergebnis nie größer als 255 sein kann, etc. Je mehr 0 Bytes (beginnend 
vom MSB an gezählt) im Dividenden vorkommen, desto größer kann zwar das 
Ergebnis werden, dafür können aber auch Subtraktionen gespart werden.
Das wird hier ausgenutzt, aber ich denke eben, wie gesagt, dass es da 
einen Fehler gibt.

Könnte sich das mal jemand ansehen und Bescheid geben, damit ich das im 
Artikel, aus dem der Code stammt, gegebenenfalls korrigieren kann?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie Divisionen in Assembler funktionieren...
müsste korrekt heissen:
Wie Divisionen in AVR-Assembler funktionieren...

Denn ich habe hier einen Assembler eines Signalprozessors, der kann das 
kompakter:
divs ay1,ax0;
Oder auch der betage x86:
div ecx
Auch diese Beispiele sind gut, denn leider gilt nach wie vor:
>>>>>> weis noch nich wie der µC aussieht bzw heist

Autor: Philipp F. (fritz87)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
so

ich denke (hoffe) das es so hinhaut

vieleicht etwas umständlich aber funktionstüchtig?!?!

schon mal danke für's durchgucken im vorraus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du das durchsimuliert?

Ich denke nämlich nicht, dass das hinhaut. Schon alleine deswegen, weil 
bei dir z (und damit die Anzahl der Wiederholungen der jeweiligen 
Schleifen) immer 24 ist.

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weis jetzt was es ist ..... ein hc12

so

und eine lcd-anzeige hängt auch schon drann

Autor: Philipp F. (fritz87)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wiegesagt es ist ein m68hc12

so, da hat es ja nur teilweise was gebracht das ich mich mit den 
avr-controllern beschäftigt hab  ;)

hab jetzt auch ein datenblatt mit ner menge befehlen ... aber nich mit 
allen die mein forgänger genutzt hat

und ich find mal wieder keine volständige ref.  im internet

hab auch schon nach einer vom hc11 gesucht da dieser ja ähnliche 
routinen benutzen

vielen dank, fals mir nochmals jemand helfen möchte

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Philipp F. schrieb:

> so, da hat es ja nur teilweise was gebracht das ich mich mit den
> avr-controllern beschäftigt hab  ;)

Das macht nichts.
Das Prinzip einer Division ist auch auf einem HC12 nicht anders (wenn 
der nicht Hardwaremässig dividieren kann)

logisch schieben
logisch rotieren
subtrahieren mit und ohne Carry
Überhaupt Carry Bit
und bedingte Branch-Befehle (die bei manchen Prozessoren Jump heißen)

haben sie alle. Hat man die erst mal bei einem Prozessor durchschaut, 
hat man sie bei so gut wie allen Prozessoren durchschaut.

Viel wichtiger ist, ob man das Prinzip der Division durchschaut hat.
In keiner anderen Programmiersprache wie Assembler, ist es so wichtig 
loszulassen und nicht ein spezifisches Programm von Prozessor A nach 
Prozessor B zu portieren, sondern eine Idee, die man von A abgreift und 
dieselbe Idee mit den Mitteln von B ausdrückt.

Hier ist die grundlegende Idee hinte einer Division
http://www.mikrocontroller.net/articles/AVR-Tutori...

Autor: hcvxbnxcv (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>weis jetzt was es ist ..... ein hc12
>so
>und eine lcd-anzeige hängt auch schon drann


>also wiegesagt es ist ein m68hc12
>so, da hat es ja nur teilweise was gebracht das ich mich mit den
>avr-controllern beschäftigt hab  ;)
>hab jetzt auch ein datenblatt mit ner menge befehlen ... aber nich mit
>allen die mein forgänger genutzt hat
>und ich find mal wieder keine volständige ref.  im internet
>hab auch schon nach einer vom hc11 gesucht da dieser ja ähnliche
>routinen benutzen
>vielen dank, fals mir nochmals jemand helfen möchte

Nein, moechte ich nicht.
Mit einem solchen, keinerlei Regeln (incl. der Forenregeln) folgendem
hingek.... Geschreibsel will ich mich nicht beschaeftigen.
Da schreiben ja unsere Kunden aus Fernost ordentlicher Deutsch.

Glaubst Du im Ernst, dass Du mit sowas einen Abschluss bekommst?

Gast

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>und ich find mal wieder keine volständige ref.  im internet

Hat bei mir 10sec gedauert.

MfG Spess

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.