Hallo,
ich schreibe meine Programme für meine µC-Projekte normalerweise in der
Arduino-IDE. Das nur vorweg, weil ich weiß, dass hier diesbezüglich ...
nun ... sagen wir mal gewisse "Aversionen" bestehen. Ich habe mich dafür
entschieden, weil ich mich dann im Regelfall nicht um gewisse Aspekte
kümmern muss, wenn ich den µC wechseln will.
Jetzt möchte ich aber -- einfach nur so zum Spaß, einfach nur, weil es
geht -- ein bischen inline-assembler verwenden. Was mir beim gcc-avr
dabei unklar ist und was ich in den tutorials dazu auch bisher nicht
finden konnte, ist folgendes: Wie übergebe ich bei Inline-Assembly mehr
als drei Speicherstellen?
1 | // mit maximal drei Speicherstellen klappt's...
|
2 |
|
3 | int16_t someCppFunc()
|
4 | {
|
5 | int8_t var1 = 0;
|
6 | int8_t var2 = 0;
|
7 | int8_t var3 = 0;
|
8 | int16_t result = 0;
|
9 |
|
10 | asm volatile
|
11 | (
|
12 | "..." // random assembly code here...
|
13 | : [result] (=r) (result)
|
14 | : [var1] (x) (var1),
|
15 | [var2] (y) (var2),
|
16 | [var3] (z) (var3)
|
17 | );
|
18 | }
|
19 |
|
20 | // was mache ich mit mehr zu übergebenden Variablen?
|
21 | // Insbesondere, weil es sich um einen C++-Compiler handelt, d.h. die
|
22 | // Symbolnamen sind ja normalerweise "gemangled"...
|
23 |
|
24 | int16_t someOtherCppFunc()
|
25 | {
|
26 | int8_t var1 = 0;
|
27 | int8_t var2 = 0;
|
28 | int8_t var3 = 0;
|
29 | int8_t var4 = 0;
|
30 | int8_t var5 = 0;
|
31 | int16_t result = 0;
|
32 |
|
33 | asm volatile
|
34 | (
|
35 | "..." // random assembly code here...
|
36 | : [result] (=r) (result)
|
37 | : [var1] (x) (var1),
|
38 | [var2] (y) (var2),
|
39 | [var3] (z) (var3),
|
40 | ??? und nun ???
|
41 | );
|
42 | }
|
Vielleicht findet sich jemand, der mir das Brett vor'm Kopf wegschrauben
kann?
danke schon mal,
L