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