Man kann sich daß etwa so vorstellen:
In einem Bücherregal fängt der near Speicher links oben (oberstes Brett) an und sortiert seine Bücher
(Daten) von links nach rechts, von oben nach unten ein, dann startet das Programm das den Stack
vergrößert/verkleinert - wobei der Stack rechts unten anfängt und seine "Bücher" zuerst rechts unten
einsortiert und sich erst nach links und dann nach oben vorarbeitet... Irgendwann treffen sich dann Stack
und near Speicher und der Stack schmeißt die Bücher des near Speichers raus und stellt die eigenen rein...
Die Daten des near Speichers werden also überschrieben - genauso wirft dann der near Speicher die "Stackbücher"
raus, wenn er eigentlich ein near-gespeichertes Buch durch ein neues ersetzen will oder liest im Stackbuch Daten
=> kurz: Stack und near Speicher benutzen dann den selben Speicher und überschreiben sich gegenseitig. Dadurch
kommt es sehr schnell zu einem Absturz, da im Stack auch Rücksprungadressen bei Funktionsaufrufen gespeichert werden.
Wenn die überschrieben werden, dann springt der Prozessor am Ende der Funktion im Programmcode "irgendwohin",
aber sehr wahrscheinlich dorthin, wo er nicht soll...
#include <stdrom.h>
char test[28000];
void main()
{
LibJumpMenu();
}
|
| 1KB (00000h-003FFh) => Interruptvektoren |
| 3KB (00400h-00FFFh) => Systemreserve #1 |
| 3200B(01000h-01C7Fh) => Bildspeicher (Zwischenspeicher vom Betriebssystem) |
| 24,9K(01C80h-07FFFh) => Systemreserver #1 (Rest davon...) |
| 32KB (08000h-0FFFFh) => far Daten-"Segment" für PV-Addins |
| 33KB (10000h-183FFh) => Systemreserve #2 |
| 3KB (18400h-18FFFh) => "System Holds" für PV-Addins |
| 20KB (19000h-1DFFFh) => near Daten-"Segment" für PV-Addins |
| 8KB (1E000h-1FFFFh) => Stack-"Segment" |
| 64KB (80000h-8FFFFh) => 1. 64KB Segment für PV-Addin-Programmcode/Static far Vars (Flash-ROM) |
| 64KB (90000h-9FFFFh) => 2. 64KB Segment für PV-Addin-Programmcode/Static far Vars (Flash-ROM) |
| 3200 Bytes (F0100h-F0D80h) => Bildspeicher (Hardware) |
Interruptvektoren:
Systemreserve #1:
far Daten-"Segment":
Also beispielsweise:
int far test; char far map[32][32];Aber nicht:
static int far blah=293;
static int far foo=815;
static int far graphic[]= {
0xFF, 0xAA, 0xDD, 0x00, 0x00
.
.
.
0x00, 0x01, 0xBC, 0xDA, 0x00
}
Systemreserve #2:
"System Holds" für Addins:
near Daten-"Segment" für PV-Addins:
Z.B.:
int test; char test2[32]; int dummy[7][7][7];
Stack-"Segment":
z.B.:
void main() {
int test1;
char c;
.
.
.
}
Bildspeicher (Hardware/Betriebssystem):
Das Betriebssystem speichert seine Bilder erst in einem "Zwischenpuffer" bevor dieser dann mit "LibPutDisp();" in den "Hardwarespeicher" kopiert wird, von wo er dann wirklich angezeigt wird - damit wird verhindert, daß der evtl. langsame Bildaufbau zu sehen ist.
1./2. 64KB Segment für PV-Addin-Programmcode/Static far Vars (Flash-ROM):
<=64KB - Programme (S Model) --------------------------- TEXT _GHOST_DATA _x_n_DATA FAR_DATA
>64KB - Programme (P Model) --------------------------- TEXT _GHOST_DATA <<<---------- Segmentgrenze x_TEXT _x_n_DATA FAR_DATA"TEXT" meint hier wohl "Programmcode"
static char far grafik[]= {
0x00, 0x10, 0xFF,
.
.
.
0x00, 0x10, 0xFF
}
Für Ergänzungen wenden Sie sich bitte an:
Jürgen Wagner