Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

ARM7TDMI Skoki bezwarunkowe (BL) - jak to robi kompiler

Awatar użytkownika
elektro255
-
-
Posty:3
Rejestracja:25 lut 2005, o 21:51
Lokalizacja:Siedlce
Kontaktowanie:
ARM7TDMI Skoki bezwarunkowe (BL) - jak to robi kompiler

Postautor: elektro255 » 29 lip 2006, o 11:11

Witam,
ostatnio bawię się troche w edycję softów w motoroloach, jednak nie moge rozszyfrować w jaki sposób kompiler liczy skoki bezwarunkowe.
W nocie katalogowej jest:
Cond+101L+Offset jednak jakoś to sie nie sprawdza w moim kodzie :)

Chodzi mi o skoki z ardresem powrotu (linkiem) BL
Dla bliskich skoków jest to odległość skoku, jednak dla długich to sie nie sprawdza.
Dla skoku dalekiego instrukcja ma 4 bajty:
np.:
F1 EC F9 0F dla skoku z adresu 1023733A do 1042355C
F6 50 FD 4A dla skoku z adresu 1023739C do 10087E34
F1 54 FF 66 dla skoku z adresu 102373CC do 1038C29C
F0 03 FD 99 dla skoku z adresu 102373E6 do 1023AF1C
F7 FF FF 1B dla skoku z adresu 102373EE do 10237228

Próbowałem liczyć tym sposobem: (adr1-adr2)/2 ale sprawdza sie tylko w niektorych przypadkach.

Myśle że ktoś kto sie zajmuje ARM na codzien powienien wiedzieć jak to liczy kompiler :)


P.S. Posiadam internet przez GPRS wiec nie moge ściągać żadnych kompilerów ASM dlatego zadaje te pytanie :)

michalko12
-
-
Posty:10
Rejestracja:5 lut 2006, o 20:05
Lokalizacja:Warszawa

Re: ARM7TDMI Skoki bezwarunkowe (BL) - jak to robi kompiler

Postautor: michalko12 » 17 wrz 2006, o 14:26

ostatnio bawię się troche w edycję softów w motoroloach,
Jakich Motorolach???
jednak nie moge rozszyfrować w jaki sposób kompiler liczy skoki bezwarunkowe.
W nocie katalogowej jest:
Cond+101L+Offset jednak jakoś to sie nie sprawdza w moim kodzie :)

Chodzi mi o skoki z ardresem powrotu (linkiem) BL
Dla bliskich skoków jest to odległość skoku, jednak dla długich to sie nie sprawdza.
Dla skoku dalekiego instrukcja ma 4 bajty:
np.:
F1 EC F9 0F dla skoku z adresu 1023733A do 1042355C
F6 50 FD 4A dla skoku z adresu 1023739C do 10087E34
F1 54 FF 66 dla skoku z adresu 102373CC do 1038C29C
F0 03 FD 99 dla skoku z adresu 102373E6 do 1023AF1C
F7 FF FF 1B dla skoku z adresu 102373EE do 10237228
ARM7TDMI jest oparty na architekturze v4T. W tej architekturze pole Conditional w postaci 1111 jest niedozwolone a z tego co podesłałeś wynika że tak jest. Nie wiem co rozumiesz pod pojęciem skoki dalekie i bliskie. Instrukcja BL obsługuje tylko jeden rodzaj offsetu i umożliwia skoki o 32M w przód i w tył (tryb ARM). Jeśli są potrzebne większe jest to realizowane w inny sposób.
Sposób dekodowania offsetu i realizacji skoku jest następujący:
24-bitowy operand który jest w kodzie U2 jest rozszerzany do 32-bitowej postaci,
następnie jest przesuwany o 2 bity w lewo (czyli mnożony przez 4)
i wynik ten dodawany jest do zawartości rejestru PC +8



Próbowałem liczyć tym sposobem: (adr1-adr2)/2 ale sprawdza sie tylko w niektorych przypadkach.

Myśle że ktoś kto sie zajmuje ARM na codzien powienien wiedzieć jak to liczy kompiler :)

Wróć do „ARM (STM32, NXP, Stellaris i inne)”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości