Hallo, Gemeinde,
bei Sprut findet sich zum Thema Speicher-Reservieung folgendes Beispiel:
Beispiel: ORG 0x20
Wert RES 1 ; Wert bedeutet ab sofort 0x20, Wert ist eine 1
Byte große Variable
Pointer RES 3 ; Wert bedeutet ab sofort 0x21, Pointer kann als
3 Byte große Variable dienen
Temp RES 1 ; Wert bedeutet ab sofort 0x24
MOVLW Wert ; W wird mit dem Zahlenwert 0x20 beschrieben
MOVWF Temp ; nun wird der Inhalt von W in die Zelle mit der
Adresse 0x24 kopiert
Wenn ich es anwende, werden die entsprechende Zellen im Programmspeicher
und nicht im RAM reserviert. Wie stelle ich es an, eine bestimmte Zahl
von Zellen im RAM zu reservieren?
Danke im voraus.
Dieter
Mit Speicher sind die File-Register gemeint!
RAM reserviert man im allgemeinen mit einer Variable.
Da du aber in Assembler programmierst, ist das alleinig deine Aufgabe,
während des Programmierens dafür zu sorgen, das DU in nicht anderweitig
verwendest.
Beschreibe doch mal was du machen willst. Dann lassen sich
Missverständnisse schneller ausräumen.
Danke Euch Allen
Alle Unklarheiten beseitigt. (Da muss Sprut wohl ein Fehler unterlaufen
sein. In einem seiner Lernbeispiele ist die Methode mit cblock/endc
erklärt.)
Dieter Kohtz (dikomoe) schrieb:> Da muss Sprut wohl ein Fehler unterlaufen sein.
Nicht unbedingt. Immerhin hat das alles seine Geschichte von so rund 25
Jahren und mehr. Vermutlich bezieht sich bei Sprut da auf einen
mittlerweile veralteten Stand der Technik - und das wär's dann.
Ich hatte mich vor Urzeiten über die Erbärmlichkeit des damaligen
PIC-Assemblers PICALC schwarz geärgert und mir deshalb meinen eigenen
Assembler geschrieben.
Und der beherrscht Segmente, wie es sich gehört:
1
SEGRAM
2
ORG20h
3
Karlheinz:DS1
4
aFloat:DS4
5
6
ORG70h
7
RetteW:DS1
8
RetteFSR:DS1
9
RetteFlags:DS1
10
11
12
SEGCODE
13
ORG2007h
14
Config:DATA11111100110010b
15
ORG2100h
16
MyEEProm:.....
17
18
ORG0
19
CLRFStatus
20
CLRFPCLATH
21
GOTOStart
22
23
ORG4
24
Interrupt:
25
MOVWFRetteW;Wretten
26
SWAPFStatus,W;FlagsinWholen
27
...usw.
Nun hab ich den MicroChip-Assembler seitdem nicht weiter verfolgt, aber
inzwischen kennt der gewiß auch Segmente. Also guck mal in dessen
Dokumentation nach Segmenten.
W.S.
Dieter Kohtz (dikomoe) schrieb:> Alle Unklarheiten beseitigt. (Da muss Sprut wohl ein Fehler unterlaufen> sein. In einem seiner Lernbeispiele ist die Methode mit cblock/endc> erklärt.)
Irgendwie geht hier was total durcheinander. "cblock" ist eine Anweisung
in der Programmierung im (alten) "absolute mode". "ORG" ist aus dem
moderneren "relocatable mode" und bezieht sich allerdings auf
Programmspeicher (ROM).
Das Beispiel von Thomas Elger (-B) und natürlich der User's Guide (z.B.
4.62 udata - BEGIN AN OBJECT FILE UNINITIALIZED DATA SECTION) zeigen wie
es aktuell (relocatable) gemacht wird, falls wirklich die Notwendigkeit
bestehen sollte, dass Variablen an bestimmten Adressen liegen müssen.
Teo D. schrieb:> Da du aber in Assembler programmierst, ist das alleinig deine Aufgabe,> während des Programmierens dafür zu sorgen, das DU in nicht anderweitig> verwendest.
Das ist schon sehr lange nicht mehr so ;-)
Volker S. schrieb:> Irgendwie geht hier was total durcheinander.Volker S. schrieb:> Programmierung im (alten) "absolute mode".
Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht
die Absicht, es zu tun.
Nochmals Danke für Eure Beiträge.
Dieter
> Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht> die Absicht, es zu tun.
Solang es bei Assembler pur bleibt, sei es dir unbenommen.
Aber lass mal, schon der Bequemlichkeit wegen, ein paar C-Objekte
dazukommen. Da wird sich deine Meinung schon noch aendern.
Dieter Kohtz (dikomoe) schrieb:> Über diesen mode bin ich bisher nicht hinausgekommen und habe auch nicht> die Absicht, es zu tun.
Geht bis jetzt ja auch immer noch "absolut".
(((((
In MPLABX kann man anscheinend schon Projekte mit mehreren Assembler
Dateien nur noch "relocatable" anlegen.
Der Support für absolut wird wohl irgendwann gar nicht mehr da sein.
Wozu auch beides unterstützen wenn der "alte" Stil nichts hat, was
relocatable nicht genauso möglich is. Im Programmcode ändert sich
wirklich sehr wenig. Die Schlüsselworte CODE -> ORG und CBLOCK -> (z.B.)
udata.
)))))
vloki schrieb:> Wozu auch beides unterstützen wenn der "alte" Stil nichts hat, was> relocatable nicht genauso möglich is.
Auch wenn ich den Vorteil von "relocable" durchaus sehe und inzwischen
neue Projekte nicht mehr "absolute" mache, ist der alte absolute Mode
manchmal doch weniger "zickig", was das Herumrechnen mit Adressen
betrifft. Beispiel hier:
Beitrag "MPLAB - Makro für PC-relative Addresse"
vloki schrieb:> Der Support für absolut wird wohl irgendwann gar nicht mehr da sein.
Na, ich hoffe aber, daß CBLOCK erhalten bleibt - das benutze ich nämlich
munter auch bei "relocatable" Code! Wie soll man denn sonst sinnvoll
Offset-Adressen für eine Variablen-Struktur erzeugen?
z.B. sowas:
1
#define NSERVOS 5 ;Anzahl Servos
2
3
;Struktur für Servo-Daten:
4
CBLOCK 0
5
flags ;Steuer- und Statusbits
6
currentpw: 2 ;aktuelle Stellung
7
middle: 2 ;Mitte
8
leftlimit:2
9
rightlimit:2
10
SIZESERVO:0 ;Länge der Struktur
11
ENDC
12
13
LINEAR0 udata
14
servodata res NSERVOS*SIZESERVO ;Array mit Servodaten
Thomas E. schrieb:> im Prinzip hast Du zwei sinnvolle Möglichkeiten:> - A: für Assemblierung im "absolute" Mode CBLOCK 0x20> var1:1 ;Variable belegt ein Byte> var2 ;1 Byte ist Default, ":1" kann auch weggelassen werden> var3:3 ;reserviert drei Bytes> var4:0 ;reserviert kein Byte,> var5:2 ;var4 und var5 haben also die gleiche Adresse> ENDC
Liebe Leute,
der obige Beitrag war der einzige, der mir wirklich geholfen hat.
Mehr brauche ich nicht, selbst wenn es relocatable wäre. Ich denke es
ist an der Zeit, den thread zu beenden, oder?
Beste Grüße
Dieter