Forum: PC-Programmierung Kopfzerbrechen Assembler


von none (Gast)


Lesenswert?

hallo leute,

ich komme mit assembler und dem ablauf überhaupt nicht klar.

zb. (für 8051)

INC A
MOV P1,A
JMP 0
END

bedeutet das hier nur, dass der Akku mit 0000 0000 anfängt und bis 1111 
1111 hochzählt und jedes mal den schritt an die 8 LEDs an P1 ausgibt?

von TomA (Gast)


Lesenswert?

Hallo none,

falls das Programm bei Speicheradresse 0 beginnt, stimmt deine Aussage. 
Und 8-Bit FFh (1111 1111) + 1 ist 00h (0000 0000), so läuft das endlos 
weiter.

Gruß. Tom

von none (Gast)


Lesenswert?

ok danke, und die 0 in JMP verweist dann auf die stelle im 
ProgrammCounter?

mein problem ist folgendes: ich habe zig fertige progs die analysiert 
werden müssen. im praktikum werden diese jeweils mit 2 drehschalter 
aufgerufen und man kann halt mit den 8 schaltern und 8 leds die funktion 
überprüfen. mehr ist da nicht. lange fragen sind unerwünscht und können 
zum rausschmiss führen.

ich muss also alles im voraus schon verstanden und mit papier&stift 
"durchgerechnet" haben. die unterlagen vom prof. sind einfach 
unbrauchbar/unvollständig für jmd. der sowas noch nie gemacht hat. und 
die ewig lange befehlsliste ist auch keine verständnishilfe.

vielleicht kann mir jemand anhand dieses bsp, welche basics ich benötige 
um das selbstständig zu verstehen und mit einsen und nullen selbst 
"auszurechnen".

Hex-Befehl  Mnemonik
013D E590   L17: MOV A,P1
013F F8     MOV R0,A
0140 540F   ANL A,#00001111B
0142 C8     XCH A,R0
0143 C4     SWAP A
0144 540F   ANL A,#00001111B
0146 28     ADD A,R0
0147 F5B0   MOV P3,A
0149 80F2   SJMP L17

von TomA (Gast)


Lesenswert?

Hallo none,

zum Beispielprogramm:

013D E590   L17: MOV A,P1 // L17: ist ein symbolischer Ersatz für die
                      // Speicheradresse 013Dh. E590 ist der Binärcode 
in
                      // Hex-Schreibweise. MOV A,P1 ließt die 8 Bit-
                      // zustände von Port 1 in den Akku (Register A)

013F F8     MOV R0,A  // Kopiert den Inhalt A in das Register R0

0140 540F   ANL A,#00001111B    // löscht die oberen 4 Bit in A,
                      // die unteren 4 Bit bleiben unverändert

0142 C8     XCH A,R0  // Tauscht die Inhalte von A und R0

0143 C4     SWAP A    // Tauscht die oberen 4Bit mit den unteren 4 in A

0144 540F   ANL A,#00001111B    // löscht die oberen 4 Bit in A

0146 28     ADD A,R0    // Kopiert den Inhalt von R0 nach A

0147 F5B0   MOV P3,A    // Gibt den Akkuinhalt zu Port 3 aus

0149 80F2   SJMP L17    // Rücksprung zu Adr. 013D (Endlosschleife)

Im Link findest du ein PDF (MCS51LB.PDF), es ist ein Lehrbuch für einen 
8051-Kurs für MCS51-Hardware und Assemblerprogrammierung. Dort findest
du mehr Informationen.

Beitrag "MCS51-Kurs sinnvoll?"

Viel Erfolg. Tom

von none (Gast)


Lesenswert?

danke tom, ich schaue mir das mal in ruhe an...

von Sinus T. (micha_micha)


Lesenswert?

TomA schrieb:
> 0146 28     ADD A,R0    // Kopiert den Inhalt von R0 nach A

da warst du wohl zu unaufmerksam.
Koorekt:

0146 28     ADD A,R0    // addiert den Inhalt von R0 zu A, also A=A+R0

von none (Gast)


Lesenswert?

Frage:

hallo,

laut dem o.g. pdf gibt es also im unteren datenspeicherbereich von 00h 
bis 1Fh die 4 Registerbänke mit jeweils R0-R7. Und mit RS0/RS1 im PSW 
ausm SFR wird die gewünschte Bank angesteuert. und gleichzeitig gibt es 
im oberen bereich 80h-FFh "parallel?!" zum SFR eine weitere registerbank 
mit R0-R7? wobei R2-R7 nicht per zeiger adressiert werden können. ist 
das so? wozu? ich verstehe den sinn dahinter nicht?

von Mr. Claudius (Gast)


Lesenswert?

Auf den Adressen 80h..FFh liegen sowohl die SFR als auch der RAM-Bereich 
(nur bei Derivaten mit mehr als 128 Byte, z.B. 8052). Dort gibt es keine 
weitere Registerbank.
Ob man auf die SFR oder das RAM zugreift, entscheidet sich dadurch, 
welche Adressierungsart angewendet wird.
SFR sind nur per direkte Adressierung erreichbar.
RAM ab 80h ist nur per indirekter Addressierung erreichbar, z.B.

mov a,p3    ; Wert von Port 3 in a einlesen = direkte Adressierung
mov 30h,a   ; Wert im RAM auf Adresse 30h ablegen = direkte Adressierung
mov p1,a    ; Wert an Port 1 ausgeben (p1 hat Adresse 90h)
mov 90h,a   ; identisch wie Zeile drüber, direkte Adressierung erreicht 
SFR
mov r0,#90h
mov @r0,a   ; Wert in RAM auf Adresse 90h speichern = indirekte 
Adressierung

von none (Gast)


Lesenswert?

ok danke,
jetzt hab das hier in etwa kommentiert und verstehe dennoch nicht was 
geschieht. kann jemand helfen?


MOV DPTR,#L6TAB  // 16 bit datapointer auf speicherplatz array? "L6TAB"
MOV R0,#020H  // wert 020h in register r0 schreiben
L6: MOV @R0,P1 // kopiere P1 in R0 auf speicherplatz #020
MOV A, #000H // setze akku auf wert 000h
XCHD A,@R0  // vertauscht die Low-Tetrade des Akku mit der Low-Tetrade
MOVC A,@A+DPTR  // Bringt den Inhalt der Speicherzelle, deren Adresse 
sich aus dem Stand des Datenpointers plus dem momentanen Inhalt des Akku 
ergibt, in den Akkumulator.
MOV P3,A // akku an port3
SJMP L6  //schleife
L6TAB:
 DB 00000001B  // define byte?! 0000 0001  usw
 DB 00000010B
 DB 00000100B
 DB 00001000B
 DB 00010000B
 DB 00100000B
 DB 01000000B
 DB 10000000B
 DB 11111110B
 DB 11111101B
 DB 11111011B
 DB 11110111B
 DB 11101111B
 DB 11011111B
 DB 10111111B
 DB 01111111B

 end

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.