VVR-GCC (Assembler & Compiler): Platzverschwendung

Gast #5617556
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
...
Gast #5617559
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.
Gast #5617601
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?
Gast #5617991
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.
Persönliche Seite #5621031
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.
#5621132
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren