Forum: Mikrocontroller und Digitale Elektronik assemblerbefehle


von Philipp F. (fritz87)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Philipp F. (fritz87)


Lesenswert?

ok

:'(

dacht nur das die befehle wenigstens annähernt gleich sind

von Karl H. (kbuchegg)


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.

von Falk B. (falk)


Lesenswert?


von Philipp F. (fritz87)


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

von MarioT (Gast)


Lesenswert?


von Stephan M. (stephanm)


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

von Stephan M. (stephanm)


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...

von Bernd N (Gast)


Lesenswert?

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

Dann sicher 8051 ASM.

von MarioT (Gast)


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.)

von Stephan M. (stephanm)


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

von Falk B. (falk)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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... :-/

von Philipp F. (fritz87)


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?

von Hannes L. (hannes)


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)

...

von spess53 (Gast)


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

von Philipp F. (fritz87)


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?

von MarioT (Gast)


Lesenswert?


von Falk B. (falk)


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-Tutorial:_Equipment#Literatur
http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf

MFG
Falk

von Karl H. (kbuchegg)


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.

von MarioT (Gast)


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.

von spess53 (Gast)


Lesenswert?

Hi

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

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

MfG Spess

von Karl H. (kbuchegg)


Lesenswert?

Hmm

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

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


(also tst auf b1 anstelle von b2)

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

Original:
1
udiv32:
2
  clr  t1
3
  tst  b3
4
  breq  udi10
5
  ldi  t0, 8
6
....
7
  ret
8
 
9
udi10:  tst  b2
10
  breq  udi20
11
  ldi  t0, 16
12
....
13
  ret
14
 
15
udi20:  tst  b2
16
  breq  udi30
17
  ldi  t0, 24
18
....
19
  ret
20
 
21
udi30:  ldi  t0, 32
22
udi31:  lsl  a0
23
....

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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:
1
divs ay1,ax0;
Oder auch der betage x86:
1
div ecx
Auch diese Beispiele sind gut, denn leider gilt nach wie vor:
>>>>>> weis noch nich wie der µC aussieht bzw heist

von Philipp F. (fritz87)


Angehängte Dateien:

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.

von Karl H. (kbuchegg)


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.

von Philipp F. (fritz87)


Lesenswert?

weis jetzt was es ist ..... ein hc12

so

und eine lcd-anzeige hängt auch schon drann

von Philipp F. (fritz87)


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

von Karl H. (kbuchegg)


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-Tutorial:_Arithmetik8#Division

von hcvxbnxcv (Gast)


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

von spess53 (Gast)


Lesenswert?

Hi

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

Hat bei mir 10sec gedauert.

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.