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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren