ARM Assembly Lokalen Labels
Ich bin derzeit der Lektüre ein tutorial auf Raspberry Pi OS Entwicklung und wunderte mich über die Art und Weise lokale labels sind in diesem code-snippet (GCC-ARM-Assembly):
...
b 2f
1:
stmia r4!, {r5-r8}
2:
cmp r4, r9
blo 1b
...
Wenn Sie 1:
als ein label-Sie geben an, entweder f
oder b
nach dem Sprung zu machen, der assembler wissen, in welche Richtung der Sprung erwischt. Soweit ich weiß, konnte man auch dieses verwenden:
...
b .2
.1:
stmia r4!, {r5-r8}
.2:
cmp r4, r9
blo .1
...
Ich glaube, diese option ist viel weniger verwirrend (lokale labels sind auch mit einem Punkt markiert in x86-assembly), denn es ist kein zusätzlicher Buchstabe nach der label Referenz. Ich habe getestet die resultierende Maschinencode und es ist das gleiche. Also meine Fragen:
-
Warum würden Sie verwenden, die eine Variante gegenüber der anderen?
-
Warum ist es notwendig, geben Sie die Richtung des Sprungs entweder
f
oderb
?
- Ich denke, dass Ihre Nutzung von lokalen labels ist falsch. Sie sind diejenigen, die in der form von "N:". ".L" ist das lokale symbol-Namen. Grund, Sie wollen den lokalen Bezeichnungen, da es in einer großen assembly-Datei, die Sie definieren können zwei ".Loop:" zum Beispiel, und dann assembler werden darüber beklagen. Denken Sie zum Beispiel, wenn Sie kopieren und einfügen eine andere Versammlung Teil. Sie können nicht wirklich sicher sein, du wirst nicht zu einem Namenskonflikt. Dabei sind die örtlichen Etiketten erforderlich sind. (sourceware.org/binutils/docs/as/Symbol-Names.html)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der wichtige Unterschied ist, dass die nummerierten lokalen labels wiederverwendet werden kann, ohne sorgen und das ist, warum Sie benötigen, um die Richtung angeben zu. Springen Sie zum vorhergehenden oder folgenden, aber nicht diejenigen, die über Sie hinaus.
Solange Sie nur innerhalb eines einzelnen Blocks, können Sie sicher sein, dass Sie so funktionieren wie Sie sollen und nicht in Konflikt mit etwas anderes.
Einer der wichtigsten Vorteile von lokalen labels ist, dass da der gleiche Bezeichner kann mehrere Male angezeigt werden, können Sie in Makros eingesetzt. Betrachten wir einige hypothetische lokale label-Verwendung wie diese, obwohl:
Ist das eigentlich erlaubt in armasm (wenn auch mit leicht unterschiedlicher syntax), wo das Verhalten in der Abwesenheit von einer bestimmten Richtung ist "Suche rückwärts, dann vorwärts", aber immer noch unter einer vernünftigen default-Verhalten mindestens einen der Sprünge in den obigen code zu Ende geht targeting die falsche Instanz für ein label. Explizit aufrufen, um die Richtung mit
beq 1f
undbne 2b
im makro löst die Mehrdeutigkeit und erzeugt die richtigen Sprünge in beiden Aufrufe des Makros.Wenn Sie wählen, um etwas, das nicht eine wahre lokales label, dann nicht nur, dass Sie möglicherweise herauf Ihren symbol-Tabelle mit junk, sondern Sie auch zu berauben Sie sich selbst der Lage zu verwenden, Schleifen oder bedingte Verzweigungen in Makros, da würden Sie generieren, nicht-eindeutige Symbole. Mein Beispiel mag ein wenig konstruiert wirken, aber Umstellung von assembler-Makros, inline-asm-Blöcke in C-Funktionen, die inline ganzen Ihrer komplexen Codebasis, und die Dinge bekommen ein viel mehr echte.