ARMv7 Instruktion BL

Gast #3092071
Lesenswert?
• ▲
▼
Hi,

ich versuche gerade zu verstehen, wie der Controller den Weg zur main() 
findet. Nach einem Reset wird der resethandler aufgerufen, an dessen 
Ende die main aufgerufen wird. Im assembly sieht das ganze so aus:

0x080001de:   bl 0x8000430 <main>

An der Adresse 0x080001de liegen die Daten, die als og Befehl 
interpretiert werden: F927F000
Nun habe ich in der architecture reference manual 
(http://www.pjrc.com/arm/pdf/doc/DDI0403D_arm_architecture_v7m_reference_manual.pdf, 
S. A7-248) nach bl geschaut und den syntax vor mir liegen. Das Feld 
imm10 ist null, das Feld imm11 enthält 227h.

F   |9   |2   |7   |F   |0   |0   |0
1111.1010.0010.0111|1111.0000.0000.0000
......xxx xxxx xxxx........yy yyyy yyyy

x = imm11
y = imm10

Wie kommt nun der ARM dazu, von 0x080001de nach 0x8000430 zu springen?

1deh + 227h = 405h. Bis zur 430h fehlt noch ein Stück. Wie ist der 
Befehl bl händisch nachzurechnen? Aus der manual werd ich nicht schlau.
Gast #3092140
Lesenswert?
• ▲
▼
gibt noch mal den genauen hex string an.

Wir reden von dem Befehl von Seite A7-248?

XXX und YYY sind verdeht.

wie hast du die werte ausgelesen. 16 bit / 32 bit?

Ich hab irgendwie das gefühl du dekodierst da die falschen bytes.
was kommt nach 0xF000?
Gast #3092159
Lesenswert?
• ▲
▼
Jap, ist verdreht dargestellt.
Im Speicher an der Adresse 0x080001de steht folgendes (Auszug ausm 
HEXeditor): 00 F0 27 F9
Somit ist 00 das LSB und F9 das MSB?!

Richtig rum steht da also F927F000, oder nicht? Und so sollte das auch 
als 32BitBefehl interpretiert werden, nicht wahr?
Gast #3092168
Lesenswert?
• ▲
▼
Und da im Disassembler BL steht und ich dem DA glaube, muss F927F000 
irgendwie mit dem Muster des BL-Befehls zusammenpassen. Eine andere 
Datei lieferte mir an der Stelle FA73F000, weswegen ich die 2 Bytes 
gedreht habe, da es sonst nicht ins Muster passt.
F0 = 11110000
FA = 11111010
#3092171
Lesenswert?
• ▲
▼
Vorsicht Falle. Thumb-Befehle sind halbwortweise angeordnet, nicht 
wortweise. Auch wenn sie 32 Bits lang sein sollten. Das erste Halbwort 
signalisiert ggf dass es ein 32-Bit Befehl ist. Somit steht das linke 
Halbwort vor dem rechten im Speicher. Deshalb sind die Bits in der Ref 
mit 15...0 15...0 nummeriert, nicht 31...0.

00 F0 27 F9 ist also F000.F927.
Gast #3092226
Lesenswert?
• ▲
▼
Gut, ich habs gleich.

Bin jetzt auch für imm32 bei 24e.

Im manual steht PC = PC + imm32. An dieser Stelle ist PC noch immer 
080001de ?

Nun bleibt noch die Frage, woraus ersichtlich wird, dass man da noch was 
addieren muss.
#3092242
Lesenswert?
• ▲
▼
Fritz schrieb:
> Im manual steht PC = PC + imm32. An dieser Stelle ist PC noch immer
> 080001de ?

Nein, eben nicht.

> Nun bleibt noch die Frage, woraus ersichtlich wird, dass man da noch was
> addieren muss.

Ich weiss grad nicht wo das in der Ref steht, aber bei ARMs steht der PC 
am Anfang der Befehlsausführung immer auf addr+4, und zumindest bei 
nativen ARMs manchmal auch auf addr+8.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.