Kann mir jemand sagen was die genaue Funktion dieses Programmsist? cseg at 0 start: mov R5, #10 mov A, #0 mov R0, #10h loop: add A, @R0 inc R0 djnz R5, loop stop: jmp stop end mfg
>Kann mir jemand sagen was die genaue Funktion dieses Programmsist?
Ja klar, das Assemblerhandbuch zu deinem uC.
Die sieben Zeilen kann man damit in 10 Minuten
verstehen.
Georg Steiner schrieb: > start: mov R5, #10 Lade R5 (Schleifenzähler) mit dem Wert 10. > mov A, #0 Lade Akkumulator mit dem Wert 0. > mov R0, #10h Lade Register R0 mit dem Wert 10. > loop: add A, @R0 Addiere den Inhalt der Speicherzelle, auf die das Register R0 zeigt, zum Akkumulator. > inc R0 Inkrementiere den Wert in R0 um 1 (Zeiger um 1 erhöhen) > djnz R5, loop Dekrementiere den Wert in R5 (Schleifenzähler um 1 erniedrigen) und springe zurück zum Label "loop" wenn nach der Denkrementierung der Wert in R5 größer als 0 ist. > stop: jmp stop Dies ist eine Endlosschleife.
Georg Steiner schrieb:
> Kann mir jemand sagen was die genaue Funktion dieses Programmsist?
Ich versuch's mal, ohne den besagten Prozessor/Assembler zu kennen.
1 | cseg at 0 |
Segement ab Adresse 0?
1 | start: mov R5, #10 |
In das Register R5 wird der Wert 10 (hexadezimal wohl, also 16) geschrieben.
1 | mov A, #0 |
In den Akkumulator wird der Wert 0 geschrieben.
1 | mov R0, #10h |
In das Register R0 wird #10 geschrieben.
1 | loop: add A, @R0 |
Hier fängt die Schleife an. Es wird zum aktuellen Wert des Akkumulators jeweils der Wert des Registers R0 addiert.
1 | inc R0 |
Das Register R0 wird um 1 hochgezählt.
1 | djnz R5, loop |
jnz ist sicher "jump if not zero"... das d sagt mir jetzt grad nichts. Es wird also der Wert in Register R5 geprüft. Wenn dieser nicht Null ist, wird an den Anfang der Schleife gesprungen.
1 | stop: jmp stop |
2 | end |
Und nu isses zu Ende. :-)
>Die Mnemonics sehen übrigens stark nach MCS51 aus (8051-Serie) Ach was ;) >> mov R0, #10h >Lade Register R0 mit dem Wert 10. Darüber würde ich noch mal nachdenken.
holger schrieb: >>Die Mnemonics sehen übrigens stark nach MCS51 aus (8051-Serie) > > Ach was ;) Ach ja.... ;o) >>> mov R0, #10h >>Lade Register R0 mit dem Wert 10. > > Darüber würde ich noch mal nachdenken. Stimmt. Das "h" am Ende hatte ich offensichtlich übersehen. Dann wird das Register halt mit dem Wert 10(Hex) geladen, was dezimal 16 entspricht.
>
1 | loop: add A, @R0 |
> Hier fängt die Schleife an. Es wird zum aktuellen Wert des Akkumulators > jeweils der Wert des Registers R0 addiert. Da könnte man auch noch mal drüber nachdenken, wenn meine Kleinhirn-Assemblerreste mich nicht gerade völlig täuschen...
Das ist eindeutig eine Siemens UP. Ich gehe auch davon aus, dass es sich entweder um einen 8051, 8052, 80515 oder um einen 80C517 handelt. Es gibt da übrigens einen sehr guten Simulator dafür, der heißt Simula5x, Simulator für die 8051-Familie. Damit kann man dann genau überprüfen, was das Progamm gerade macht. Läuft aber noch unter DOS - taugt aber was.
Hallo! Es werden zehn (dezimal) Werte die im internen Speicher des 8051 ab Adresse 10h (sechzehn) stehen im Akku (A) aufsummiert - ohne Übertragsbehandlung.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.