2014-11-26 3 views
5

Wir sind innerhalb write_four_registers_and_readback() und nächste Befehl delay(10) zu nennen:.n Suffix zum Verzweigungsbefehl?

004002a4: b.n 0x4002f4 <write_four_registers_and_readback+172> 
78    delay(10); 

Vom ARM Instruction Set erfahren wir, dass b Zweig ist, gefolgt von einer zwei Buchstaben mnemonic

Beispiel:

CMP R1,#0 ; Compare R1 with zero and branch to fred 
      ; if R1 was zero, otherwise continue 
BEQ fred ; to next instruction. 

Aber diese .n scheint nicht in der Tabelle der Zwei-Buchstaben-Mnemonics enthalten sein ... ehrlich gesagt ist es kein zwei-Buchstaben-Mnemo NIC entweder. Was heißt das.

Außerdem, was bedeutet die Nummer 0x4002f4? Ist es nur eine absolute Darstellung der Adresse <>? Oder etwas anderes - Punkt 4.4.3 Assembler syntax scheint nicht zu erklären.

Gerät ist SAM4S und Toolchain ist arm-none-eabi-gcc.

+2

'0x4002f4' ist die Zieladresse, und Text in' <> 'ist der beste Versuch des Disassemblers, ihn in symbolische Form zu konvertieren. –

Antwort

7

Sie haben ziemlich altes Referenzmaterial, aber eine moderne Toolchain. Als Thumb-2 eingeführt wurde, führte ARM auch eine neue Unified Assembler Language ein, die das Schreiben von Code ermöglicht, der entweder mit ARM oder Thumb mit (möglicherweise) keiner Modifikation zusammengebaut werden kann. Die meisten, wenn nicht alle, kürzlichen Toolchains sind auf UAL voreingestellt (obwohl viele die Legacy-Syntax immer noch auf irgendeine Weise unterstützen).

In UAL, der .n und .w Suffixe Mnemonik anzuwenden, die beide einen 16-Bit Thumb ("narrow") und 32-Bit Thumb-2 ("breit") -Codierung *. Wenn nicht spezifiziert, wählt der Assembler automatisch eine geeignete Codierung aus, aber wenn eine bestimmte Codierung erwünscht ist (z. B. Erzwingen einer 32-Bit-Codierung, wo der Assembler die 16-Bit-Version auswählen würde, um den Code für die Cache-Ausrichtung aufzufüllen), dann das Suffix kann angegeben werden.

Disassemblierer geben im Allgemeinen die Suffixe aus, um sicherzustellen, dass die Ausgabe, wenn sie durch einen Assembler zurückgegeben wird, genau denselben Objektcode ergibt.

Also, was Sie dort haben, ist eine 16-Bit-Thumb-Verzweigungsbefehl zu Adresse 0x4002f4, die zufällig 172 Bytes nach dem Symbol write_four_registers_and_readback ist.

* Technisch gesehen sind alle ARM-Kodierungen auch "breit" und können daher ein .w Suffix haben, aber in diesem Fall ist es völlig überflüssig.