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?
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
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
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
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.