2010-07-14 9 views
5

Questo potrebbe essere un problema un po 'esotiche, ma spero che qualcuno possa ancora aiutarmi un po', ;). Vorrei eseguire un programma C standard, tuttavia, ad un certo punto durante l'esecuzione del programma mi piacerebbe che un certo numero di istruzioni , che sono memorizzate in una RAM locale, siano eseguite . La memoria del gratta e vinci è accessibile per tutti i processi. Assumiamo questa memoria locale inizia all'indirizzo 0x80000000 e lo integrare questo nel codice seguente C fragementAccesso alla memoria del riquadro scratch da C

int main { 
int a=1; 
int b=2; 
int c=3;  

c = a + b; 

%goto address 0x80000000 and execute three instructions before continuing 
%program execution here 

return(0); 

}

Il contatore di programma dovrebbe passare attraverso le seguenti fasi, assumendo principale viene caricato sul 0x40000000

0x40000000 a=5; 
0x40000004 b=2; 
0x40000008 c=1; 
0x4000000C c=a+b; 
0x80000000 first instruction in the local scratch pad 
0x80000004 second instruction in the local scratch pad 
0x80000008 third instruction in the local scratch pad 
0x40000010 return(0); 

Qualcuno un'idea su come eseguire questa operazione? Devo usare le istruzioni di assembler jump o c'è qualcosa di più elegante.

Molte grazie, Andi

+2

fa il programma a 0x80000000 si comportano come una funzione? Cioè salverà lo stack correttamente ed eseguirà un salto indietro al chiamante? – bstpierre

risposta

0

per passare a una posizione fissa, è possibile dichiarare un tipo che è un puntatore ad una funzione, poi gettato il tuo indirizzo di quel tipo e chiamarlo come una funzione.

Se si desidera che questa area di memoria sia accessibile a processi diversi dal proprio programma, sarà necessario utilizzare le primitive di memoria condivisa del sistema operativo (Windows/Linux/OS X) per mappare un blocco di memoria per l'indirizzo scelto .

Suona come una pazza idea, ma potrebbe essere fatto funzionare. In bocca al lupo!

+0

Bene, ci sono processori embedded che vengono forniti con la memoria di Scratch Pad, quindi dovrebbe essere fattibile. Sfortunatamente, non ho visto alcun esempio che dimostri l'uso di tali memorie locali. Grazie per il tuo contributo, lo darò un'occhiata. – Rob

6

Supponendo che le istruzioni si comportano come una normale funzione, si può fare:

#include <stdio.h> 

void (*scratchpad_func)(void) = (void(*)(void))0x80000000; 

int main() 
{ 
    printf("before\n"); 
    scratchpad_func(); 
    printf("after\n"); 
    return 0; 
} 

Ovviamente, dovrete usare un sistema operativo in modalità reale, o saltare attraverso i cerchi qualunque sia la vostra combinazione OS/processore richiede di avere accesso diretto a tale spazio indirizzo.

(Su alcune architetture "si comportano come una funzione normale" è semplice come un "salto $ ra" alla fine, se non si tocca registri callee-salvato. Eg MIPS.)

+0

Sembra spaventoso, ma ci provo. Grazie per quello! – Rob

+0

-1 Non c'è nulla che garantisca che le istruzioni che si trovano all'indirizzo si comportino come una funzione. L'OP vuole eseguire un numero fisso di istruzioni che si trovano lì. –

+1

@Jens soffiava: in tal modo la qualificazione nella mia risposta ... – bstpierre

0

Beh un paio di suggerimenti

  1. È necessario assicurarsi che la memoria nel "blocco note" sia indirizzabile ed eseguibile.
  2. Assicurarsi che la sequenza di istruzioni nella posizione di memoria termina con un'istruzione ret
  3. call piuttosto che saltarci sopra.
1

Né colata l'indirizzo di un puntatore alla funzione né assemblatore inline è normalizzata, quindi nulla di che sarebbe portatile ;-)

Mappatura indirizzo fisso come menziona Carl è possibile con POSIX, ma poi di nuovo a fallo eseguire, non c'è un modo semplice.

Ciò che nessuno dei post precedenti risponde, è come tornare indietro dopo esattamente tre istruzioni ...

L'unico modo che posso pensare sarebbe davvero di copiare solo i tre istruzioni da qualche parte e effettuare un salto incondizionato immediatamente dopo. Quindi utilizzare un'istruzione assembler in linea per passare a quella posizione.

Problemi correlati