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.