2016-07-14 16 views
0

Ich versuche derzeit ARM-Montage für Cortex-M-Kerne zu verstehen.Cortex M4 Thumb Assembly Adresse

Ich weiß, dass Funktionen im Thumb-Modus (der einzige Modus, den der Kern unterstützt) von ihrer Adresse aufgerufen werden und das LSB der Adresse hoch ist, um anzuzeigen, dass das Ziel ein Thumb-Code ist.

Bei der Montage schreibe ich vor der Funktion „Reset_Handler“ im Anschluss an dem Assembler zu sagen, dass die Daten auf dem Etikett ausführbar sind/eine Funktion:

.type Reset_Handler, %function 
    Reset_Handler: 
    MOV R0, R0 # just do something 

Wenn ich lade jetzt die Adresse des Etiketts

LDR R0, =Reset_Handler 

das LSB von R0 gesetzt ist.

Muss ich diese .type-Direktive vor jedes Etikett setzen, das ich als Funktion für indirekte Aufrufe verwenden möchte?

Oder gibt es eine Möglichkeit, den Assembler automatisch die richtige Adresse zu entscheiden?

Wenn ich den Code der Funktion in RAM kopieren und die Adresse dieser Funktion laden will, muss ich das LSB selbst löschen, um die "echte" Adresse zu erhalten, wo die Daten liegen, habe ich recht?

Ist in diesem Fall die Anweisung .type erforderlich? Ich weiß, dass es notwendig ist, sobald ich die Adresse in die Vektortabelle setzen möchte, da dies erfordert, dass das LSB gesetzt wird.

+0

welchen Assembler verwenden Sie (die Assemblersprache ist vom Assembler definiert, ist sie nicht allgemein universell) –

Antwort

2

Nun, es gibt zwei Arten von Adressen (Etiketten). Ein Typ ist eine Adresse, die Sie anrufen möchten, die Adresse des Einstiegspunktes einer Funktion und für den Daumen benötigt der bx oder pop den lsbit-Satz. Die andere ist die Adresse für ein Datenelement, der Anfang einer Zeichenfolge, der Anfang eines Arrays, was auch immer, und das möchte nicht, dass das Isbit beschädigt wird, da dies einen Ausrichtungsfehler verursachen würde. Wenn Sie also vor der Verwendung von bx keinen Code zu OR hinzufügen wollen, möchten Sie, dass der Assembler entweder eine Lösung hat, wenn Sie das Label definieren oder wenn Sie das Label verwenden.

Also für gnu Assembler benötigen Sie .thumb_func vor dem Etikett (und wahrscheinlich andere Möglichkeiten, es zu tun), für Ihren Assembler scheint es, dass Sie brauchen, was Ihr Assembler benötigt.