Forum: Compiler & IDEs VVR-GCC (Assembler & Compiler): Platzverschwendung


von Bernd (Gast)


Lesenswert?

AVR-GCC (Assembler & Compiler): Platzverschwendung


Zwei Quellprogramme - ein C- und ein Assemblerprogramm werden übersetzt 
und gelinkt. Im LSS- bzw. HEX-File ist danach eine Lücke von 400 Bytes 
zwischen dem Assembler- und dem C-Teil zu sehen.

Das Assemblerprogramm enthält eine Anweisung ".p2allign 9" zum 
Ausrichten von Tabellen. Entferne ich diese Anweisung, dann verschwindet 
die Lücke.

Die Anweisung mit ."p2align 0" o . ä. aufzuheben hatte keinen Erfolg.

Warum wirkt sich die ".palign 9" Anweisung überhaupt auf eine andere 
Datei aus und wie ist dieses Problem zu lösen?

1
...
2
3
Tab01:
4
...
5
6
Tab02;
7
...
8
9
Tab07;
10
...
11
12
; 400-Bytes Lücke
13
14
main:
15
...

von C is great (Gast)


Lesenswert?

Mit palign 9 weist du den Compiler an, die Daten an einer 512 
Byte-Grenze auszurichten. Da deine Daten vermutlich kleiner sind, werden 
400 Füllbytes eingefügt. Der Compiler macht nur was du von ihm 
verlangst.

von Bernd (Gast)


Lesenswert?

Das ist nicht richtig. Du hast das Problem nicht verstanden und/oder 
einfach meinen Beitrag nicht durchgelesen.

Es gibt nur eine Anweisung ".p2align 9" in der Assemblerquelltextdatei. 
Die sich vor der ersten Tabelle befindet.

Wieso wird dann die main() aus der C-Quelltextdatei ebenfalls 
ausgerichtet?

von Markus F. (mfro)


Lesenswert?

.p2align wirkt gemeinhin nur ein Mal, genau an der Stelle wo's steht.

Wenn das bei dir anders aussieht, hat das wahrscheinlich eine andere 
Ursache.

Kannst Du dein .map-File posten?

von c-hater (Gast)


Lesenswert?

Bernd schrieb:

> Es gibt nur eine Anweisung ".p2align 9" in der Assemblerquelltextdatei.
> Die sich vor der ersten Tabelle befindet.
>
> Wieso wird dann die main() aus der C-Quelltextdatei ebenfalls
> ausgerichtet?

Dafür kann es nur eine einzige Erklärung geben: das main-Symbol hat eine 
größere Adresse als die Adresse, an der die "Anweisung" (eigentlich ist 
es nur eine Direktive) .p2align 9 steht und dazwischen ist nix 
sonstiges.

Denn diese Direktive macht nix anderes, als den Code- oder Datenblock, 
der nach ihr beginnt, an einer 512Byte-Grenze auszurichten UND dafür 
zu sorgen, dass auch 512Byte in diesem Block verfügbar sind!

D.h.: im Extremfall (gerade 1 Byte über die Blockgrenze beim vorherigen 
Code und ein Byte Nutzdaten im aligned block), werden im Falle eine 
512byte-alignments 1022 Bytes nutzlos verschwendet.

Blöd? Ja, aber: Strunzblöd war nur der Programmierer, denn es macht 
natürlich absolut keinen Sinn, für ein verschissenes Byte ein derartiges 
Alignment zu vereinbaren. Sowas macht nur Sinn für Tabellen, auf die 
besonders schnell zugegriffen werden soll. Und dann ist es in aller 
Regel so, dass die Tabellengröße der Größe des Alignments entspricht 
(oder ein ganzzahliges Vielfaches davon ist).

Und nunja: es kann Ausnahmen von dieser Regel geben. Die sind "notfalls" 
komplett in Assembler zu lösen.

Ich vermute aber mal ganz stark, dass die meisten C-Compiler durchaus 
auch in der Lage wären, so ein Szenario sinnvoll abzudecken. Sehr 
wahrscheinlich entweder durch einen weiteren Parameter für .p2align, der 
klarstellt wieviel Space im aligned block tatsächlich verwendet werden 
soll oder durch die Verfügbarkeit einer anderen Direktive mit ähnlichem 
Zweck, die aber eben zwei Parameter akzeptiert).

Ja ich hasse C, kann mir aber absolut nicht vorstellen, dass den Machern 
in 40+ Jahren nicht aufgefallen sein sollte, dass sowas unter gewissen 
Bedingungen nützlich sein könnte. So doof sind die wirklich nicht. Nur 
die reinen C-Benutzer sind im Allgemeinen strunzdoof.

von Carl D. (jcw2)


Lesenswert?

Zu schade, daß die Anweisung an den Linker, die Section doch auf 512 
auszurichten, vom Assembler kam. Passiert halt, wenn man blind in den 
Hass-Textbausteinvorrat greift, ohne die Situation erfaßt zu haben.

von Bernd (Gast)


Lesenswert?

@ Carl

Vielen Dank für deine (indirekte) Hilfe. Die Lösung sind natürlich 
Subsections. Funktioniert einwandfrei.

von c-hater (Gast)


Lesenswert?

Carl D. schrieb:

> Zu schade, daß die Anweisung an den Linker, die Section doch auf 512
> auszurichten, vom Assembler kam.

Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus 
irgendwelche Alignments.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

c-hater schrieb:
> Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus
> irgendwelche Alignments.

Es wurde vom Threadstarter in den Assemblerquelltext geschrieben:

> Das Assemblerprogramm enthält eine Anweisung ".p2allign 9" zum Ausrichten von 
Tabellen.

Willst Du das ernsthaft bestreiten, und behaupten, das hätte der 
C-Compiler angestellt?


Dein Hass auf Unverstandenes beginnt ernsthaft pathologisch zu werden.

von Carl D. (jcw2)


Lesenswert?

c-hater schrieb:
> Carl D. schrieb:
>
>> Zu schade, daß die Anweisung an den Linker, die Section doch auf 512
>> auszurichten, vom Assembler kam.
>
> Nein, niemals, völlig unmöglich. Kein Assembler vereinbart von sich aus
> irgendwelche Alignments.

Im Gegensatz zu einem hier hat der Assembler die an ihn gerichteten 
Anweisungen verstanden. Leseschwäche gepaart mit Kinderstubendeffizit 
haben offenbar einen Namen.

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.