2017-01-09 4 views
0

Ich mag diese Anweisungen in meiner ARMv5 Montage gefunden haben:ARM Assembly - Verwendung von geschweiften Klammern

pop  {r2} ; (str r2, [sp, #-4]!) 
push {r0} ; (str r0, [sp, #-4]!) 
push {r4, r5, r6, r7, r8, r9, sl, lr} 

verstehe ich, dass Push- und Pop sind Akronyme für STR und LDR und dass diese Anweisungen zu speichern und Last auf mehrere Register deshalb glaube ich, dass diese geschweiften Klammern in diesem Fall bedeutet "Set für Register gespeichert oder geladen"

Ist meine Annahme richtig?

+0

Klingt wie es. – fuz

+0

Gehen Sie nicht davon aus, lesen Sie die Referenzhandbücher. – Jester

+0

Eine nicht verwenden S.O. entweder? –

Antwort

2

Nun, ja, lesen Sie einfach die Dokumentation des Anweisungssatzes. Der Assembler könnte str/ldr oder stm/ldm für diese einzelnen Register-Pushs und -Pops verwenden. Heutzutage möchten Sie, dass der Stapel auf einer 64-Bit-Grenze ausgerichtet bleibt, so dass im Allgemeinen eine gerade Anzahl von Registern gedrückt oder geblättert wird, aber Sie können auch einzeln nach Bedarf vorgehen. Für den Daumen Push/Pop sind ihre eigenen Anweisungen nicht codieren oder speichern.

00000000 <.text>: 
    0: e49d2004 pop {r2}  ; (ldr r2, [sp], #4) 
    4: e52d0004 push {r0}  ; (str r0, [sp, #-4]!) 
    8: e92d40f0 push {r4, r5, r6, r7, lr} 

00000000 <.text>: 
    0: bc04  pop {r2} 
    2: b401  push {r0} 
    4: b5f0  push {r4, r5, r6, r7, lr} 

In diesem Fall sind die ARM-Codierungen Lade-/Speicher erscheinen nicht nur die Disassembler Kommentar (x4xxxxxx) LDM/stm ist eine x8xxxxxx Codierung wie die letzte sein.

All dies ist natürlich in diesen ARM-Dokumenten, die diese und möglicherweise andere Fragen beantworten, die Sie möglicherweise haben. Sicher Stackoverflow kann aber nutzlos sein, wenn jede Antwort gefunden werden kann. Aber in diesem Fall untersuchen Sie einen Verweis, der die Syntax zeigt, derselbe Verweis sollte zusätzlichen Text haben, der anzeigt, dass die Registerliste ein Satz ist. Es gibt 15 bzw. 9 Bits in der Kodierung, und mit ein paar einfachen Beispielen können Sie sehen, dass die Kodierung mit der Liste übereinstimmt, die Sie in der Syntax angeben.

Ja, die geschweiften Klammern bedeuten, dass sie alle drücken oder alle von ihnen verschwinden, je nachdem, was der Fall ist. Die Dokumentation umfasst auch die Abnahme vor Schritt nach Einstellungen sowie welche Register in welcher Reihenfolge im Speicher setzen, ist

push {r2,r3,r4} 

unterscheidet sich von

push {r4,r2,r3} 

zum Beispiel

auch ursprünglich dort beachten Es gab keine Push/Pop-Anweisungen, sie kamen mit den echten Push/Pop-Thumb-Anweisungen, die nicht ldm/stm sind (weil sie nicht genug Bits zum Brennen haben, da r13 vier Bits von 16 spezifiziert sind, die ldm/stm, die sie haben beschränkt auf r0-r7). Genauso mussten Sie alle drei Register für drei Registeroperationen angeben, später lassen Sie den Assembler faul werden, lassen Sie die Daumen-Syntax für Arm-Befehle verwenden und dann schließlich die einheitliche Syntax, die die Dinge nicht nur komplizierter macht.

Denken Sie vor allem daran, dass Assemblersprachen im Allgemeinen nicht standardisiert sind. Sie werden nur durch die spezifische Assembler definiert Sie das Programm verwenden, das den Text liest, könnte jemand einfach diese in ihre Assembler

push (r1,r2) 
pop [r3,r4] 
push r2,r3,r4,r5 
str r3,r2 

als rechtliche Syntax ermöglichen. Sehen Sie sich die Unterschiede zwischen den Arm-Tools und den Gnu-Tools für die gleichen Befehlssätze an. Noch mehr Spaß beim Betrachten der GNU-Assembler-Syntax pdp-11 im Vergleich zur traditionellen pdp-11-Syntax. (Ja, es gibt ein gepflegtes pdp-11 Backend).

Also sollte Ihre Frage genauer sein, was Assembler Sie verwendet haben, obwohl wir ziemlich genau wussten, was Sie gefragt haben.

+0

Als ich die Frage stellte, erwartete ich eine einfache Antwort "Ja oder Nein". Aber du bist darüber hinaus gegangen und habe heute viel gelernt, ich wusste nicht, dass Assembler-Sprachen nicht Standard sind. Danke vielmals. –

Verwandte Themen