Forum: Mikrocontroller und Digitale Elektronik ARMv7 Instruktion BL


von Fritz (Gast)


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.

von 123 (Gast)


Lesenswert?

da hast du aber zumindest ein  bit ver bummelt.

0x1010 ist nicht 9.

von (prx) A. K. (prx)


Lesenswert?

Wenn das Wort nicht verdreht dargestellt ist, dann steht der Opcode 
1111101* nicht für BL, sondern für "data processing".

von Fritz (Gast)


Lesenswert?

Stimmt, das eine Bit ist eine Null..

Das ändert jedoch nichts an dem Inhalt von imm11. Der Befehl bl stimmt 
auch, denn so wird es mir im disassembly von coocox angezeigt.

von Fritz (Gast)


Lesenswert?

Menno, das ändert ja doch was in imm11...

von Fritz (Gast)


Lesenswert?

Aber nun versteh ich erst recht nicht, wie der Controller die Adresse 
0x8000430 aus den gegebenen Daten berechnet.

von (prx) A. K. (prx)


Lesenswert?

Was immer das ist: Der Opcode von BL fängt mit 1111.0 an (F0-F7), nicht 
mit 1111.1 (F8-FF). Wenn das BL ist, dann muss es verdreht dargestellt 
sein, F000F927.

von 123 (Gast)


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?

von Fritz (Gast)


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?

von Fritz (Gast)


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

von (prx) A. K. (prx)


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.

von Fritz (Gast)


Lesenswert?

Also habe ich es richtig dekodiert? Zuerst kommt F000 (das ist das erste 
Halbwort), dann kommt F927?

von Fritz (Gast)


Lesenswert?

Gut, dann bleibt also die Frage, wie der Controller die Adresse 
0x8000430 berechnet?

PC-relativ, das ist klar. Im PC steht 080001de

von Lattice User (Gast)


Lesenswert?

080001de + 127 * 2 + 4
(allex hex, Die letzte 4 weil der PC schon weiter ist)

von (prx) A. K. (prx)


Lesenswert?

Also weiter im Text. F000.F927:
  S     = 0
  imm10 = 0
  J1    = 1
  J2    = 1
  imm11 = 127
Disp:  0.1.1.000000000.0100100111
         1     8   0    1   2   7
also 0018.0127
  080001de + 4 + 180127*2 = 0830.0430

Passt nicht, also sind J1:J2 Käse und es ist nicht Thumb2 sondern 
Thumb1.

von Fritz (Gast)


Lesenswert?

OK, die 127 ist auch klar, die steht in imm11. Aber woher kommt die *2?

Und die 4 ist auch nicht ganz klar.

von 123 (Gast)


Lesenswert?

0xF000F927

S = 0
I1 = 0
I1 = 0
imm10 = 00 0000 0000
imm11 = 001 0010 0111

=> 0 0 0 0000000000 00100100111 0

PC + 0x252 + 2 * 2

der befehlt besteht ja 2 16bit worten

von (prx) A. K. (prx)


Lesenswert?

Oops, die J1/J2 werden ja komplementiert, dann passt es.

von 123 (Gast)


Lesenswert?

da steht I1 = not (Xor (S,J1))
gemein geimein

von (prx) A. K. (prx)


Lesenswert?

Fritz schrieb:

> OK, die 127 ist auch klar, die steht in imm11. Aber woher kommt die *2?
> Und die 4 ist auch nicht ganz klar.

Branches gehen von PC+4 aus und Displacements werden mit 2 
multipliziert, da es keine ungeraden Ziele geben kann.

von (prx) A. K. (prx)


Lesenswert?

123 schrieb:
> da steht I1 = not (Xor (S,J1))
> gemein geimein

Anders war die Kompatiblität zu Thumb nicht zu machen.

von Fritz (Gast)


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.

von (prx) A. K. (prx)


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.

von Fritz (Gast)


Lesenswert?

Ok, ich danke euch allen :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.