Hi,
Auf einem ATmega163 implementiere ich AES. Ich habe nun das Problem dass
ich relativ reproduzierbar in der 8. Runde folgende Meldung erhalte:
AVR Simulator: Excessive stack overflow, stop sim.
Das kranke dabei: Ich verwende keine einzige Rekursion, wenig Variablen
auf dem Stack und eine relativ geringe Verschachtelungstiefe.
Die Hauptschleife sieht so aus:
1 | for(round = 1; round < 16; round++)
|
2 | {
|
3 | SubBytes(state);
|
4 | ShiftRows(state);
|
5 | MixColumns(state);
|
6 | GenerateNextKey(ext_key);
|
7 | AddRoundKey(state, ext_key);
|
8 | }
|
AddRoundKey beinhaltet nur eine simple Vorschleife mit XOR-Befehlen
ShiftRows macht lediglich ein paar Swaps mit XOR
SubBytes hat ebenfalls nur EINE for-Schleife
GenerateNextKey beinhaltet eine 10-zeilige Schleife mit 2 if-Abfragen
und definiert ebenfalls nur 2 Variablen.
Lediglich MixColumns ist ein bisschen größer, hat eber ebenfalls nur
eine for-Schleife und definiert ein "unsigned char col[4]". Weiters wird
einige Male (aber immer auf gleichem Level) eine Funktion gf8mul
aufgerufen. gf8mul definiert exakt 3 unsigned chars und hat sagenhaft
riesige 6 Zeilen.
Ja, wirklich, es kommt nichts vor dass "exzessiv" den Stack auffressen
könnte. Vor allem: Was ich dabei nicht verstehe: Nachdem in der Schleife
ja immer das gleiche gemacht wird und alles auf einer Ebene ist, kann
der Stack dadurch ja nicht größer werden! Wieso kommt dann erst bei der
8-ten Runde der Stack Overflow?
Irgendwie bin ich mit meinem Latein völlig am Ende, leider fehlt mir
auch die Kenntnis wie ich den Stack überprüfen kann...
Wie groß ist dieser überhaupt?
lg
divB