MIPS32 asembler - instrukcja skoku J (26-parametr)

Nov 19, 2003 16 Replies

Czy kto¶ tu moze bawi siê procesorkami MIPS i asemblerem? Próbujê sobie zastosowaæ instrukcjê J (skok d³ugi) w MIPS32 i mam pewne k³opoty z zakodowaniem jej w jêzyku maszynowym :-)



Wed³ug ksi±¿ki opcode binarnie jest 000010 i do tego jest doklejone pozosta³e 26 bitów w postaci adresu docelowego... Z tego co wyczyta³em, skok mo¿e obj±æ zasiêg 256MB maksymalnie. Te 26 bitów adresu docelowego do wpisania jako parametr uzyskuje siê przez obciêcie górnych 4 zostawiaj±c dolne 28 i potem przesuwaj±c w prawo o dwa bity (dziel±c przez liczbê 4).



Chcê skoczyæ spod wektora reset (spod adresu BFC00000) pod adres BFD00000. Do tego celu chcia³em wykorzytaæ instrukcjê J bo w³a¶ciwie pasuje - zakres skoku jest mniejszy od 256 no i chcia³em pobawiæ siê czym¶ nowym zamiast zastosowaæ zwyczajny skok wzglêdem przesuniêcia... No i nie wychodzi. To znaczy disasembler podaje mi ¿e mój opcode oznacza co¶ innego ni¿ ja chcê aby oznacza³. Wstawiam mu warto¶æ BF40000 pod adres BFC00000 a ten mi mówi, ¿e to siê t³umaczy na



BFC00000: 0BF40000 J 8FD00000



Czyli jest ósemka zamiast B w adresie docelowym skoku. Dlaczego? Czy tak to jest dziwnie w asemblerze kodowane? Czy mo¿e to b³±d jaki¶?


Skoki bezwarunkowe w RISC to de facto skoki wzgledne wg. zawartosci PC (tak jest w ARM, ARC, MIPS pewnie te¿). Operandem jest offset a nie adres docelowy, dlatego assembler powinien miec jakas forme zapisu ktora pozwoli na automatyczne wyliczenie offsetu na podstawie adresu docelowego (w podanym przez ciebie przykladzie pole offsetu powinno miec wartosc 0x100000>>2=0x40000 sprobuj wpisac 0x08040000 i zobacz jak to przeczyta dissasembler, wg, mnie powinno to zostac zinterpretowane jako PC=PC+0x40000<<2). Usilujesz wdusic mu adres docelowy i to jest wg. mnie przyczyna sieczki jaka zwraca ci disassembler (to wyglada tak jakby instrukcja byla kodowana nie na 6 a na 4 bitach, operand ma wtedy 28 bitow a po przesunieciu 0xbf40000 o dwa miejsca dostajesz wlasnie 0x8fd00000).

Obejscie tego problemu to:

-skok przez 32 bitowa zawartosc rejestru

-bezposredni wpis do PC zawartosci innego rejestru

-poprawne wyliczenie offsetu do instrukcji

Sprobuje jeszcze sciagnac liste instrukcji MIPS i jak znajde cos ciekawego to dam znac.

B.

U¿ytkownik "Pszemol" snipped-for-privacy@PolBox.com napisa³ w wiadomo¶ci news: snipped-for-privacy@poczta.onet.pl...

U¿ytkownik "Pszemol" snipped-for-privacy@PolBox.com napisa³ w wiadomo¶ci news: snipped-for-privacy@poczta.onet.pl...

recznie kompilujesz (asemblujesz) ?

czy masz jakies narzedzie do tego ? jesli tak to czy asembler nie przyjmuje skoku do etykiety ?

nie musialbys tak recznie rzezbic

Takie tylko drobiazgi - chcia³em "poprawiæ" kod ju¿ skompilowany.

Mam asembler i kompilator C ale jako¶ asembler uparcie t³umaczy skoki do etykiet jako skoki wzglêdne, z offsetem (BEQ) i nie mogê go "zmusiæ" do zastosowania instrukcji J. Asembler w MIPSach jest trochê dziwny, bo ma wiele swobody w t³umaczeniu ludzkiego mnemonika na ró¿ny kod maszynowy w zale¿no¶ci od konktekstu... Je¶li bawi³e¶ siê kiedy¶ jakim¶ MIPSem to wiesz, ¿e nie ma w nim np. instrukcji NOP a t± funkcjê pe³ni "SLL r0, r0, 0" czyli "shift left zero times register zero" :-)))

Nie muszê, ale po przeczytaniu opisu tej instrukcji uzna³em, ¿e to trywialne i postanowi³em w u³amku minuty podmieniæ kod :-) Skoñczy³o siê na dobrych 20 minutach ¶lêczenia nad ekranem monitora i pukaniem siê w g³owê "co jest grane" :-)) Dlatego zaciekawi³o mnie to teraz i ju¿ nie popuszczê mimo i¿ problem dawno rozwi±za³em inn± metod± - po prostu ciekaw jestem dlaczego to nie dzia³a³o tak jak chcia³em aby dzia³a³o...

Dziêki za zainteresowanie... ale niestety nie jest to instrukcja z offsetem lecz w argumencie jest po prostu 28 dolnych bitów adresu docelowego. Przez obciêcie niepotrzebnych dwu najm³odszych bitów uzyskuje siê wielko¶ci 26 bitów. Op-code jest 6-bitowy:

000010 a potem w nastêpnych 26 bitach jest w³a¶nie adres skoku. Cytat z "MIPS32T Architecture For Programmers Volume II: The MIPS32T Instruction Set":

"Format: J target MIPS32 (MIPS I)

Purpose: To branch within the current 256 MB-aligned region

Description: This is a PC-region branch (not PC-relative); the effective target address is in the "current" 256 MB-aligned region. The low 28 bits of the target address is the instr_index field shifted left 2 bits. The remaining upper bits are the corresponding bits of the address of the instruction in the delay slot (not the branch itself). Jump to the effective target address.

Programming Notes: Forming the branch target address by catenating PC and index bits rather than adding a signed offset to the PC is an advantage if all program code addresses fit into a 256 MB region aligned on a 256 MB boundary. It allows a branch from anywhere in the region to anywhere in the region, an action not allowed by a signed relative offset."

I co Ty na to?

Tak, wiem ¿e s± inne mo¿liwo¶ci skoków, ale ten J z 26-bitowym argumentem "wszed³ mi na ambit" i chcia³bym go rozgry¼æ... :-))

¦ci±gnij, ¶ci±gnij - pewnie siê zdziwisz :-) Link masz np tu:
formatting link

Pewnego piêknego dnia Pszemol przemówi³(a) ludzkim g³osem:

pogorszy³o ci siê, czy ktos siê pod ciebie podszywa ?

Czy my siê mo¿e znamy? Sorry, ale nie kojarzê kolegi...

U¿ytkownik "Pszemol" snipped-for-privacy@PolBox.com napisa³ w wiadomo¶ci news: snipped-for-privacy@poczta.onet.pl...

Si±d¼ sobie z karteczk± kratkowanego papieru, zapisz sobie adres docelowy, wytnij 28 starszych bitów, przesun w lewo o dwa miejsca i dorzuc do kodu operacji i kod rozkazu gotowy. Tak przynajmniej wynika z powyzszego PDFa. A w liscie instrukcji ¿adnych dziwów nie widzê.

BTW. Jedziemy prosto po ko¶ci? Bez OS?

Niekoniecznie, moje pytanie dotyczy³o raczej niewyciêtego cytatu i odpowiadania nad nim. Pomy¶l o modemowcach.

Pomy¶la³em i w³a¶nie to by³ efekt przemy¶leñ... Po czterech dniach przerwy samo "co o tym my¶licie" nie mia³o sensu, wiêc przypomnia³em swój problem aby nie musieli modemowcy zbyt wiele szukaæ :-)

Ja te¿ nie, zrobi³em jak mówisz, disassembler mi napisa³ cudy jakie¶... Dlatego zapyta³em na grupie, licz±c na to, ¿e znajdzie mi kto¶ b³±d kto jest z MIPSami do¶wiadczony i zechcia³by sobie zrobiæ ³amig³ówkê.

Chwilowo jechali¶my po ko¶ci bo debuggujê bootloader. Docelowo ma to chodziæ z Windows CE 4.2 (czyli .NET). Fajowa zabawka. Przy rdzeniu 400MHz ca³kiem szybka...

OK, gdyby kogo¶ interesowa³o rozwi±zanie problemu to go podajê: Disasembler jakiego u¿ywa³em pomyli³ siê i st±d to ca³e zamieszanie :-)) Najwyra¼niej jest skopana funkcja disasemblacji w YAMONie. Teraz u¿ywam debuggera harwarowego NetICE-1000 z funkcj± disasemblacji pamiêci i mi pokazuje tak jak trzeba. Ale chece... Dziêki wszystkim za próby pomocy.

Nie znam MIPSa ale z tego co opisujesz to jak chcesz skoczyc do BFD00000. TO najpier obcinasz te najstarsze 4 bity to masz FD00000. Teraz przesuwasz o 2 bity to bedziesz mial 3F80000. Nie napisales gdzie to sie dopisuje ten OpCode Ale to Twoje BF4000 to mi jakos nie pasuje w zadna strone.

Pozdro Grzechu

Pasuje, pasuje... FD00 przesuniête w lewo o dwa bity to 3f40. Zlepi³y Ci siê chyba bity w D skoro wysz³o Ci 8. D to binarnie

1101, przesuniête w prawo o dwa daje 4 nie 8 na s±siedniej cyfrze. Zreszt± - napisa³em, ¿e to disasembler siê pomyli³... nie czytasz!

No tak 4 anie 8 to jasne. A w ogole yo to teraz zauwazylem porzednie posty watku. To znaczy skok sie wykonuje taj jak trzeba Dawno nie zagladalem na ta grupe. Mozliwe ze dizasembler pisze nie to co trzeba. Juz widzilem wieksze knoty niz to.

No wlasnie disasembler byl zknocony. To jest kod o nazwie YAMON. To skrót od "Yet Another MONitor" :-))

Nawiasem mówiac, szukam zródel do tego programu...

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required