Forum: Mikrocontroller und Digitale Elektronik Zugriff auf 97 Byte reservierten Speicherplatz


von Florian (Gast)


Lesenswert?

Hallo,
Ich habe im Assemblercode folgende Anweisung:
1
VAR1: .BYTE 97
Nun will ich die Adresse von VAR1 in meinem C code nutzen.
So, wie ich das verstanden habe müsste ich bei einer 2 Byte reservierung
1
extern volatile uint16_t VAR1;
benutzen, um an den Inhalt zu kommen, und dann wäre ja &VAR1 die 
adresse.

Aber wie ist das bei dem 97Byte langem Speicher?
Kann ich da, da ich eh nur die Adresse brauch auch einfach nur
1
extern volatile uint8_t VAR1;
2
// &VAR1 == Adresse von VAR1
nehmen?

Vielen Dank,
Florian

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ob das "so einfach" ist weiß ich nicht (wieso überhaupt ASM+C auf diese 
weise mixen?), aber allgemein kann man den Zugriff auf größere Blöcke in 
C als ein Array von uint8 realisieren.

von Hc Z. (mizch)


Lesenswert?

Die Direktive „.byte“ erzeugt nur 1 Byte pro Argument, in Deinem Fall 
also ein einziges Byte mit dem Wert 97 (dezimal).

EDIT: gcc/gas angenommen.

von Florian (Gast)


Lesenswert?

Ich Danke dir, dann werd ich das so machen.
Ich dachte mir ich experimentier einfach mal ein wenig damit, das zu 
mischen, man weiß ja nie, ob man das vllt noch mal gebrauchen kann.

Nochmals Danke,
Florian

von Florian (Gast)


Lesenswert?

Dann hab ich das aus dem tutorial falsch verstanden :D
Wie kann ich denn 97 Bytes erzeigen?

Muss ich dann das
1
.comm VAR1, 97
benutzen?

Gruß Florian

von Hc Z. (mizch)


Lesenswert?

Klären wir erst mal: Da Du mit C mischen möchtest, geht es um die 
AVR-gcc-Toolchain, also avr-as ist der Assembler?

von Peter D. (peda)


Lesenswert?

Florian schrieb:
> Ich dachte mir ich experimentier einfach mal ein wenig damit, das zu
> mischen, man weiß ja nie, ob man das vllt noch mal gebrauchen kann.


Ich habs noch nie gebraucht.
Entweder pure Assembler (bis max 2kB Code) oder pure C.
Ich hab hier auch noch kein Projekt gesehen, wo das Mixen wirklich 
notwendig war.


Peter

von Florian (Gast)


Lesenswert?

Jop, so ist es

von Hc Z. (mizch)


Lesenswert?

Dann suchst Du „.space“.

von Hc Z. (mizch)


Lesenswert?

Und um Deine erste Frage zu beantworten:  Du definierst die Variable mit
1
      .bss
2
      .global  var1
3
var1: .space 97
4
      .text
und referenzierst sie mit
1
extern uint8_t var1[97];
oder welcher Typ immer am besten passt (struct wäre manchmal noch ganz 
praktisch).

(EDIT: sections hinzugefügt)

von Florian (Gast)


Lesenswert?

Okay, vielen Dank, dann werde ich das so machen :D

Gruüße,
Florian

von Hc Z. (mizch)


Lesenswert?

Ich habe da noch eine Korrektur an meinem Vorschlag anzubringen:  Beim 
GNU Assembler dürfte es statt
1
   .bss
richtig
1
   .section .bss
heißen, analog dann beim abschließenden „.text“.

von Peter D. (peda)


Lesenswert?

Warum willst Du unbedingt die Variable in Assembler anlegen?
Machs in C, das ist einfacher.
Und es erzeugt kein Byte mehr Code.


Peter

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