Ich wundere mich gerade über Folgendes: Ich habe ein paar Daten meinem
Flash-Image hinzugefügt, ASCII-Bytes, die mit einer 0 terminiert werden.
Ist die Stringlänge gerade, macht die angehängte 0 die nächste Adresse
für das folgende .hword ungerade, also füge ich ein .align 2 auf jeden
Fall ein.
Das gibt also folgendes Bild:
0000af50 00 00 00 bf 90 2d f8 6e 2e 62 61 6e 6e 65 72 00 |.....-.n.banner.|
9
0000af60 88 2d f0 6e 56 45 52 53 00 00 00 bf 80 2d 8c 6e |.-.nVERS.....-.n|
Man sieht z.B., daß "init" (gerade) mit der 0 dann auf einer ungeraden
Adresse landet. Das anschließende .align 2 fügt aber 3 bytes hinzu
(einschließlich eines "ominösen" BF - byte fill?)
Warum wird nicht einfach mit einem Byte (0) aufgefüllt, meinetwegen auch
"BF"?
https://ftp.gnu.org/old-gnu/Manuals/gas-2.9.1/html_chapter/as_7.html
" The way the required alignment is specified varies from system to
system. For the a29k, hppa, m68k, m88k, w65, sparc, and Hitachi SH, and
i386 using ELF format, the first expression is the alignment request in
bytes. For example `.align 8' advances the location counter until it is
a multiple of 8. If the location counter is already a multiple of 8, no
change is needed.
For other systems, including the i386 using a.out format, it is the
number of low-order zero bits the location counter must have after
advancement. For example `.align 3' advances the location counter until
it a multiple of 8. If the location counter is already a multiple of 8,
no change is needed.
This inconsistency is due to the different behaviors of the various
native assemblers for these systems which GAS must emulate. GAS also
provides .balign and .p2align directives, described later, which have a
consistent behavior across all architectures (but are specific to GAS).
"
Ich vermute, dass das beim ARM ein 2^N ist. Du müsstest also .align 1
schreiben.
Jörg W. schrieb:
...
>> Ich vermute, dass das beim ARM ein 2^N ist. Du müsstest also .align 1> schreiben.
Ja, danke, das bringt es. .align 1, so komisch es auch aussieht.
Christoph K. schrieb:> Jörg W. schrieb:> ...>>>> Ich vermute, dass das beim ARM ein 2^N ist. Du müsstest also .align 1>> schreiben.>> Ja, danke, das bringt es. .align 1, so komisch es auch aussieht.
Danke noch mal, Jörg. Aus der ARM-Community erhielt ich noch den Tipp:
.balign 2
Grüße
Christoph
Christoph K. schrieb:> .balign 2
Ja, steht ja auch in der Doku zum GNU-Assembler. .align machen sie halt
kompatibel zum jeweiligen System, für das sie assemblieren, während sie
.balign als über alle Systeme innerhalb des gas einheitliche Pseudo-Op
implementieren.