Forum: Mikrocontroller und Digitale Elektronik Verwendung des Steacks bei MSP und AVR.


von Oliver_E (Gast)


Lesenswert?

Hallo zusammen,

ist die Verwendung des Steacks bei allen Controller (MSP430, AVR, 
PIC,...) gleich -also beim Aufruf einer Funktion werden die Sprung 
Adressen + lokale Variablen auf dem Steck abgelegt? Oder ist das 
Controller abhängig?

Besten Dank

von Christian R. (supachris)


Lesenswert?

1. das Ding heißt Stack (Stapel).
2. Ja, das ist wohl bei den meisten Prozessoren so. Allerdings der Stack 
an verschiedenen Stellen angelegt werden. Ist ja in letzter Konsequenz 
auch nur ein Pointer.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mal so, mal so bei den Steaks...

Wie die Verwendung ist, steht jeweils im ABI des Compilers (Application 
Binary Interface). Von der HW wird zunächst festgelest ob das Steak nach 
unten wächst oder nach oben, ob Werte big oder little endian sind etc, 
wobei "nach unten" verbreiteter ist.

Lokale Variablen müssen nicht aufs Steak, die können ebenso in lokalen 
Registern leben was dazu führt, dass sie niemals explizit in RAM 
auftauchen.

Ja nach Architektur gibt's mehr als ein Steak. TriCore kennt zB nen 
Steak für push/pop und eine CSA wo automatisch GPRs und RET-Adresse bei 
nem call rauf kommen.

Lokale Variablen können auch woanders angelegt werden (zB solche die 
static sind) oder gänzlich wegoptimiert werden und tauchen dann nichma 
innem Register mehr auf.

von Oliver_E (Gast)


Lesenswert?

Danke für die Antwort.
Johann, Was meinst mit "wegoptimiert"?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nehmen wir mal die C-Quelle
1
int main (void)
2
{
3
    int sum = 0;
4
    for (int i=1; i <= 100; i++)
5
        sum += i;
6
        
7
    return sum;    
8
}

und lassen nen optimierenden Compiler drauf los (hier avr-gcc 4.x). Der 
macht da draus
1
main:
2
  ldi r24,lo8(5050)
3
  ldi r25,hi8(5050)
4
  ret

also
1
int main (void)
2
{
3
    return 5050;    
4
}

Wenn Du dann mit den Debugger durchgehst kannst Dir nen Wolf suchen nach 
Deinen Variablen...

von crazy horse (Gast)


Lesenswert?

Warum muss ich gerade an den jungen Gauss denken??

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Als interne Darstellung von dem, was da algebraisch abgeht, dient die

"GNU algebraic uniform symbol semantic", kurz Gauss.

In gcc 5.x werden dann die "Extended uniform level expression rules" 
implementiert sein, die auch Optimierungen wie

ermöglichen werden.

von mr.chip (Gast)


Lesenswert?

> "GNU algebraic uniform symbol semantic", kurz Gauss.

Das heisst also, da mathematische Ausdrücke oder gar Algorithmen auf 
hohem Abstraktionsniveau analysiert und schliesslich optimiert werden? 
Wie weit geht sowas?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

> "GNU algebraic uniform symbol semantic", kurz Gauss.

Das was ein Scherz am Rande...

Prinzipiell sind der Phantasie (oder inzwischen Fantasi?) keine Grenzen 
gesetzt was Optimierungen bzw. Codetransformationen angeht.

Nehmen wir mal folgendes C-Progrämmle, das 5! ausrechnen soll. gcc 4.3 
macht in main() effektiv ein return 120.
1
unsigned int fak (unsigned int n)
2
{
3
    if (n > 1)
4
        return n * fak(n-1);
5
        
6
    return 1;
7
}
8
9
int main (void)
10
{
11
    return fak (5);
12
}

Hier mal dumps der Passes, die avr-gcc zwischen .i (nach dem Präprozess) 
und *.s (asm-Ausgabe) durchläuft:
1
fak.c.001t.tu                   fak.c.102t.ivcanon
2
fak.c.003t.original             fak.c.107t.cunroll
3
fak.c.004t.gimple               fak.c.110t.ivopts
4
fak.c.006t.vcg                  fak.c.111t.loopdone
5
fak.c.007t.useless              fak.c.114t.reassoc2
6
fak.c.010t.lower                fak.c.115t.vrp2
7
fak.c.011t.ehopt                fak.c.116t.dom3
8
fak.c.012t.eh                   fak.c.117t.phicprop3
9
fak.c.013t.cfg                  fak.c.118t.cddce
10
fak.c.015t.veclower             fak.c.120t.dse2
11
fak.c.021t.cleanup_cfg1         fak.c.121t.forwprop4
12
fak.c.023t.early_optimizations  fak.c.122t.phiopt3
13
fak.c.024t.ssa                  fak.c.123t.tailc
14
fak.c.026t.einline2             fak.c.124t.copyrename4
15
fak.c.027t.cleanup_cfg2         fak.c.125t.uncprop
16
fak.c.028t.copyrename1          fak.c.126t.optimized
17
fak.c.029t.ccp1                 fak.c.127t.nrv
18
fak.c.030t.forwprop1            fak.c.128t.blocks
19
fak.c.031t.addressables1        fak.c.129t.final_cleanup
20
fak.c.032t.sdse1                fak.c.131r.expand
21
fak.c.033t.esra                 fak.c.132r.sibling
22
fak.c.034t.copyprop1            fak.c.134r.initvals
23
fak.c.035t.mergephi1            fak.c.135r.unshare
24
fak.c.036t.dce1                 fak.c.136r.vregs
25
fak.c.037t.addressables2        fak.c.137r.into_cfglayout
26
fak.c.038t.sdse2                fak.c.138r.jump
27
fak.c.039t.tailr1               fak.c.139r.subreg
28
fak.c.040t.profile              fak.c.140r.dfinit
29
fak.c.041t.release_ssa          fak.c.141r.cse1
30
fak.c.051t.apply_inline         fak.c.142r.fwprop1
31
fak.c.052t.salias               fak.c.143r.gcse1
32
fak.c.054t.retslot              fak.c.144r.ce1
33
fak.c.055t.copyrename2          fak.c.145r.loop2
34
fak.c.056t.ccp2                 fak.c.146r.loop2_init
35
fak.c.057t.phiprop              fak.c.147r.loop2_invariant
36
fak.c.058t.fre                  fak.c.151r.loop2_done
37
fak.c.059t.dce2                 fak.c.153r.bypass
38
fak.c.060t.forwprop2            fak.c.154r.cse2
39
fak.c.061t.copyprop2            fak.c.155r.dse1
40
fak.c.062t.mergephi2            fak.c.156r.fwprop2
41
fak.c.063t.vrp1                 fak.c.157r.regclass
42
fak.c.064t.dce3                 fak.c.158r.auto-inc-dec
43
fak.c.066t.dom1                 fak.c.159r.init-regs
44
fak.c.067t.phicprop1            fak.c.160r.outof_cfglayout
45
fak.c.068t.ifcombine            fak.c.161r.dce
46
fak.c.069t.phiopt1              fak.c.162r.combine
47
fak.c.070t.tailr2               fak.c.163r.ce2
48
fak.c.073t.cplxlower            fak.c.165r.regmove
49
fak.c.074t.sra                  fak.c.166r.split1
50
fak.c.075t.copyrename3          fak.c.167r.subreg2
51
fak.c.076t.dom2                 fak.c.171r.asmcons
52
fak.c.077t.phicprop2            fak.c.175r.lreg
53
fak.c.078t.reassoc1             fak.c.176r.greg
54
fak.c.079t.dce4                 fak.c.178r.postreload
55
fak.c.080t.dse1                 fak.c.180r.split2
56
fak.c.081t.forwprop3            fak.c.182r.pro_and_epilogue
57
fak.c.082t.phiopt2              fak.c.183r.dse2
58
fak.c.083t.objsz                fak.c.185r.csa
59
fak.c.084t.store_ccp            fak.c.186r.peephole2
60
fak.c.085t.copyprop3            fak.c.187r.ce3
61
fak.c.086t.fab                  fak.c.189r.cprop_hardreg
62
fak.c.088t.crited               fak.c.190r.dce
63
fak.c.090t.sink                 fak.c.191r.bbro
64
fak.c.091t.loop                 fak.c.197r.alignments
65
fak.c.092t.loopinit             fak.c.200r.mach
66
fak.c.093t.copyprop4            fak.c.201r.barriers
67
fak.c.094t.dceloop1             fak.c.203r.split5
68
fak.c.095t.lim                  fak.c.204r.eh-ranges
69
fak.c.098t.sccp                 fak.c.205r.shorten
70
fak.c.099t.empty                fak.c.206r.dfinish

Näheres zu einigen Passes/Algorithmen findest Du in den Links unten. 
Teilweise werden Algorithmen mehrfach angewandt (zB dce -- dead code 
elimination)

http://gcc.gnu.org/onlinedocs/gccint/Tree_002dSSA-passes.html#Tree_002dSSA-passes
http://gcc.gnu.org/onlinedocs/gccint/RTL-passes.html#RTL-passes

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.