Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18
  1. #1

    [C/MIPS] Address to OpCode

    Sto lavorando su un R4000, considerando queste due righe scritte in C:

    codice:
    // routine mips
    int code[21]={0x23BDFFF4, 0xAFA20008, 0xAFA30004, 0xAFA80000, 0x00000000, 0x00000000, 0x00421021, 0x00631821, 0x00021400, 0x00431021, 0x8C480000, 0x84C301EC, 0xA5030000, 0x25080002, 0xAC480000, 0x8FA80000, 0x8FA30004, 0x8FA20008, 0x23BD000C, 0x0A7082E1, addr_new_vet};
    
    // ottengo l'indirizzo di dove è stata allocata la funzione scritta in mips
    unsigned int addr_code = (int)&code;
    Partendo dal valore in addr_code, come ottengo il relativo opCode (espresso come stringa di 32 bit) per un salto incondizionato j (jump) all'indirizzo della routine mips?

    Considerando che l'encoding del salto è:
    ooooooii iiiiiiii iiiiiiii iiiiiiii
    o = 6 bit per l'istruzione j(000010)
    i = 26 bit per la label

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    La domanda non è chiara ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Ciao di nuovo ...allora cerco di fare un esempio.
    Considera che addr_code valga 0x09fbf5e8, quindi significa, che la mia routine mips è stata allocata a quell'indirizzo, ora devo saltare a quell'indirizzo, ciò significa in codice mips: j 0x09fbf5e8, in memoria tale salto è scritto come 0x0a7efd7a.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Ma quel codice in C è scritto per un sistema in cui l'indirizzo è a 32 bit non a 26.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Ma infatti la label a 26 bit da sola non è rappresentativa, i 26 bit della label vanno considerati con i 6 bit dell'istruzione (in questo caso j) 6bit di istruzione +26bit di label codificata = istruzione a 32bit, ed ecco che per effettuare un salto a 0x09fbf5e8, in memoria troviamo scritto 0x0a7efd7a.

  6. #6
    Ho provato con questa soluzione, ma non è del tutto corretta:
    unsigned int opcode_addr_code = addr_code >> 2;
    opcode_addr_code += 0x08000000;

    ora opcode_addr_code contiene 0x0a7efd7a

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Perché shifti di 2 bit a destra?

    Io pensavo a qualcosa del genere

    unsigned int jmp_code = (addr_code & 0x03FFFFFF) | 0x08000000;

    ma non penso ancora di aver compreso appieno il problema.

    Non mi hai ancora detto con quale sistema e compilatore C stai lavorando.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    E' sempre una psp e il compilatore si chiama psp-gcc della Minimalist PSPSDK. Ma non vedo di cosa te ne fai di queste informazioni, l'unica cosa che devi sapere è che stiamo lavorando su un processore R4000.

    Comunque su alcune dispense trovate su internet:

    instruction:
    j
    opcode/function:
    000010
    operation:
    pc += i << 2

    Non saprei cos'altro dirti per farti capire a cosa dovrei arrivare.

  9. #9
    Comunque la tua risposta con il mio esempio, ha funzionato, la proverò anche con altri indirizzi.

  10. #10
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,472
    Originariamente inviato da valeriobb87
    E' sempre una psp
    Mica mi ricordo ogni risposta ... devi indicarlo sempre ...

    Ma non vedo di cosa te ne fai di queste informazioni
    l'unica cosa che devi sapere è che stiamo lavorando su un processore R4000.
    Perché, l'avevi detto?

    Comunque ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.