2016-06-15 27 views
3

Ich habe das schon eine Weile gegoogelt, aber ich kann keine Dokumentation dazu finden. Ich habe versucht, ARM zu lernen und habe mir den kompilierten ARM-Assembler-Code für ein einfaches Taschenrechner-Programm angeschaut, um zu sehen, ob ich verstehen konnte, was vor sich ging. Das, was ich zu sehen, halten ist, Anweisungen wie diese:Was bedeutet ein = Zeichen auf der rechten Seite eines LDR-Befehls in ARM?

LDR  R3, =__stack_chk_guard__GLIBC_2.4 

oder

LDR  R0, =aEnterOperator ; "Enter operator: " 

oder

LDR  R0, =aSIsNotAValidOp ; "%s is not a valid operator. Enter +, -" 

Hinweis: der Stoff, nachdem die Semikolons ist nur die Auto-Kommentare von IDA hinzugefügt.

Meine Frage ist, was bedeutet das '=' auf der rechten Seite dieser LDRs? Im ersten Fall scheint es ein Etikett zu sein, das das Laden einer Bibliothek anzeigt; Im zweiten und dritten Fall scheint '= a' einem Druck zu folgen. Ich bin mir da nicht ganz sicher, da ich in der Dokumentation nichts über diese Syntax für LDR finden kann. Kann mir jemand helfen, das zu verstehen? Vielen Dank!

+0

Welchen Assembler verwenden Sie? Hast du die Dokumentation des Assembler gelesen? – Olaf

Antwort

8

Die Verwendung eines Gleichheitszeichens (=) am Anfang des zweiten Operanden des LDR-Befehls gibt die Verwendung des LDR pseudo-instruction an. Dieser pseuo-Befehl wird verwendet, um einen beliebigen 32-Bit-Konstantenwert in ein Register mit einem einzelnen Befehl zu laden, obwohl der ARM-Befehlssatz nur unmittelbare Werte in einem viel kleineren Bereich unterstützt.

Wenn der Wert nach dem dem Assembler bekannt ist und in den zulässigen Bereich eines unmittelbaren Werts für den MOV- oder MVN-Befehl passt, wird ein MOV- oder MVN-Befehl generiert. Andernfalls wird der konstante Wert in den Literal-Pool eingegeben und eine PC-relative LDR instruction wird verwendet, um den Wert in das Register zu laden.

Wenn Ida diese LDR = Anweisungen beim Zerlegen von Code generiert, muss es erkannt haben, dass der Assembler oder Compiler die zweite Option ausgewählt hat, wenn der Code generiert wird, den Sie betrachten. Die eigentliche Anweisung ist etwas wie LDR R0, loc_1234567 (oder genauer gesagt etwas wie LDR R0, [PC, #-1234]) und Ida sucht den Wert im literalen Pool um loc_1234567 für Sie.

2

= wird normalerweise durch eine sofortige Konstante ergänzt und weist den Assembler an, die Konstante in einen nahe gelegenen Literalpool zu setzen und einen relativen Speicheroperanden pc zum Laden zu erzeugen. Dies ist nützlich, da das ARM-Befehlsformat nicht genügend Platz zum Speichern einer vollen 32-Bit-Konstante hat. Das Laden von Konstanten, die nicht in 8 Bits kodiert werden können (denke ich) und eine Verschiebung von einem nahegelegenen Literalpool ist eine effektive und effiziente Möglichkeit, dieses Problem zu umgehen.