Hallo zusammen! "Segmentdirektiven für absolute Segmente" - Das ist das Thema. Da gibt es ja CSEG, DSEG, XSEG, BSEG, ISEG. "Mit diesen Direktiven können sogenannte Segmente in den verschiedenen Speicherbereichen definiert werden." Was heißt das bitte genau? Hier habe ich ein Programm: http://pastebin.com/LX1RvbrF Ich weis weder was für einen Sinn das Programm hat, also zu was es gut ist und so. Meine Grundkenntnisse: Ich weis wie alle Arethmetsichen, Transportier- und JMP-Befehle funktionieren, also an dem solls nicht scheitern. Es scheitern nur an den Direkektiven die ich wie gesagt gar nicht verstehe. In meinem Programm habe ich alles kommentiert bitte das durchlesen. XSEG, ISEG und BSEG müsst ihr mir nicht erklären, da es im Programm nicht vorkommt, lieber mal das Programm verstehn :). Ich danke euch im voraus! Liebe Grüße Tom
Der 8051 hat verschiedene Speicherbereiche, die unterschiedlich Addressiert werden wollen. In ASM hat man dazu die verschiedenen MOV/MOVC/MOVX-Befehle. Beim Anlegen von Texten oder Arrays gibt man dem Linker vor, wo die Bereiche angelegt werden sillen, in C flüstert man dem Compiler, wo man die Variable gerne hätte. CSEG Codespeicher, also ROM 0x0000-0xFFFF je nach vornhadenem FLASH DSEG Datenspeicher internes RAM 0x00-0x7F (den von den Registern und dem Stack genutzten Bereich sollte man nicht selber nutzen...) XSEG Datenspeicher externes RAM 0x0000-0xFFFF je nach vorhandenem XRAM BSEG Bitadressierbares RAM, Byteadresse 0x20-0x2F, Bitadresse 0x00-0x7F ISEG indirekt adressierbares internes RAM 0x80-0xFF zusätzlich gehört dazu noch der SFR-Bereich mit den Byte-Adressen 0x80-0xFF und den Bitadressen 0x80-0xFF. Der Zugriff auf eventuell vorhandenens EEPROM geschieht meist, indem das EEORM in den XRAM-Bereich eingeblendet wird. Ob dann der Compiler z.B. ein ESEG oder ähnliches unterstützt, musst Du bei Bedarf nachlesen. Bei meinem Compiler (RIDE, RKIT51) heißen die Bereiche CODE, DATA, IDATA, XDATA, BDATA, BIT, SFR und SBIT. Bei aktuellen 8051-Derivaten ist (zur allgemeinen Verwirrung) bereits etwas "externes RAM" _im_Chip_(!) enthalten. Damit bleibt normalerweise der externe Daten- (P0) und Adressbus (P0+P2) frei für eigene Nutzung. Wenn man aber mal aus versehen den vorhandenen Speicherbereich überschreitet, dann flackern LEDs an den Ports ganz heftig, weil das dann die aktivität auf dem Daten- und Adressbus darstellt. Bei Deinem Programm wird z.B. der Stack in das indirekt adressierbare interne RAM (0x80-0xFF) verlegt, damit der untere RAM-Bereich frei nutzbar bleibt. Das macht die Zeile 4: STACK segment idata Dabei sucht der Linker dann einen möglichst großen freien Bereich und setzt die Variable STACK auf eine Anfangsadresse. > mov sp,#STACK-1 ;für was ist das hier gut? Die Zeile hier setzt dann den Stackpointer SP auf den Anfang des gewünschten Bereiches (-1 weil der Pointer auf die zuletzt genutze Stelle zeigt). Die übrigen Zeilen, die Dir nicht klar sind, enthalten nur Anweisungen an den Compiler bzw. Linker. Also für einen tieferen Einstieg solltest Du mal das Handbuch studieren... tschuessle Bernhard
Danke dir für deine Mühe! MAIN segment code STACK segment idata DATEN segment data diese 3 befehle weisen den jeweiligen Namen(MAIN, STACK, DATEN) die jeweiligen(code,idata,data) Speicherbereiche zu? Also das ganze Hauptprogramm wird im Programmspeicher gespeichert, für den Stack wird der indirekte interne Datenspeicher zur Verfügung gestellt und für "DATEN"(was meint man damit?) wird der direkte interne Datenspeicher zu Verfügung gestellt. Stimmt das? Ja aber was ist jetzt "rseg" was bedeutet das?
Ah jetzt verstehe ich. rseg wählt einen Speicherbereicht aus oder? rseg Daten block: ds blocksize Hier z.B. wählt rseg "Daten" aus, also den direkten internen Datenspeicher. Da werden blocksize Bytes reserviert und "block" enthält die Anfangsadresse. Stimmt das? Eins verstehe ich ncoh nicht. Der Befehl JMP MAIN, warum findet der genau ins Hauptprogramm, weil man davor rseg MAIN macht?
rseg sollte der Registerbereich 0x00-0x07 (bzw. bis 0x1f mit Banking)
sein.
Dein verwendeter Compiler scheint auf recht viel Mithilfe angewiesen zu
sein. Der Assembler von RIDE braucht außer einer org-Direktiven (auch
nur, wenn das Programm nicht auf 0x0000 beginnt) keine zwingenden
Compiler/Linkeranweisungen im Quellcode.
Welcher Compiler ist es denn? Hast Du schon mal ein eigenes Projekt "von
Scratch" erstellt? Gibt es evtl. einen Assistenten, der einen
Programmrahmen erstellt?
> "DATEN"(was meint man damit?) wird der direkte interne Datenspeicher zu
Verfügung gestellt.
Man kann ja auch in Assembler eigene Datenbeireiche und Variablen
deklarieren (hier muss dann halt die RAM-Adresse direkt angegeben
werden).
tschuessle
Bernhard
Das Programm das ich gepostet habe ist mit uVision4 erstellt worden --> Wir verwenden IMMER uvision4.
Ich kann mir nicht vorstellen, dass KEIL so viel Nachhilfe nötig hat. Wer hat denn den ASM-Code erstellt? Ein Schüler/Student/Bastler, ein Vollzeit-Entwickler oder der Linker.... tschuessle Bernhard
"rseg" ist eine Linkerdirektive. Sie sagt, daß der Linker den Code verschieben kann (relocate). Ist bei Assemblerprogrammen nur nötig, wenn sie mit C-Programmen zusammen gelinkt werden sollen. Vermutlich hat sich der Autor ein übersetztes C-Programm als Gerüst genommen. In der Regel schreiben Assemblerprogrammierer einfach drauflos ohne jede Segmendirective. Das Codesegment ist ja default und die paar Variablen kann man auch absolut adressieren. Peter
Peter Dannegger schrieb: > Ist bei Assemblerprogrammen nur nötig, wenn sie mit C-Programmen > zusammen gelinkt werden sollen. ...oder wenn man mehrere Assemblermodule hat...
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.