Come altri hanno notato, l'istruzione "jmp relativo" per x86-64 è limitata a uno spostamento firmato a 32 bit, utilizzato come offset relativo rispetto al contatore del programma.
OP chiesto perché non è presente un salto relativo con offset a 64 bit. Non posso parlare per i progettisti di Intel, ma sembra abbastanza chiaro che questa istruzione semplicemente non sarebbe molto utile, specialmente con la disponibilità della jmp relativa a 32-bit. L'unica volta che sarebbe necessario è quando il tuo programma aveva una dimensione di 2+ gigabyte, in modo che la jmp relativa a 32 bit non potesse raggiungerla da qualsiasi punto al suo interno. Hai visto qualche file oggetto 2Gb recentemente? Quindi l'apparente utilità per tali istruzioni sembra davvero piccola.
Principalmente quando i programmi diventano molto grandi, iniziano a essere suddivisi in elementi più gestibili che possono evolvere a velocità diverse. (DLL sono un esempio di questo). Interfacciare tra tali elementi è fatto con mezzi più arcani (vettori di salto, ecc.) Per garantire che le interfacce rimangano costanti di fronte all'evoluzione. Un parente jmp estremamente lungo può essere utilizzato per raggiungere da un'applicazione a un punto di ingresso in un altro modulo, ma il costo effettivo del caricamento di un indirizzo assoluto in un registro e di una chiamata indiretta al registro è abbastanza piccolo in pratica che non è Vale la pena ottimizzare. Il design moderno della CPU si basa sull'ottimizzazione di dove si mettono i transistor per massimizzare le prestazioni.
Giusto per essere completo, l'x86 (molte versioni) ha istruzioni relative jmp molto brevi (offset con segno a 8 bit). In pratica, anche le istruzioni relative jmp a 32 bit sono raramente necessarie, specialmente se si dispone di un buon generatore di codice che può riorganizzare blocchi di codice. Intel probabilmente avrebbe potuto escluderli per lo stesso motivo; Sospetto che la loro utilità sia abbastanza alta da giustificare i transistor.
La domanda di "grandi operandi letterali" si presenta in modi divertenti in molte architetture. Se si esamina la distribuzione dei valori letterali nel codice, si scoprirà che i valori piccoli (0,1, codici carattere ASCII) coprono una percentuale piuttosto buona; quasi tutto il resto sono indirizzi di memoria. Quindi non hai bisogno di "grandi valori letterali" nei programmi ma devi gestire gli indirizzi di memoria in qualche modo. Il chip Sparc ha notoriamente "carica letteralmente il valore basso nel registro" (che significa "piccole costanti") e meno spesso usato "carica letteralmente il valore alto" (per riempire i bit superiori in un registro) usato come seconda istruzione per creare costanti grandi, e usato meno spesso. Ciò mantiene il codice piccolo, tranne quando hai bisogno di una grande costante; codice piccolo significa più alto tasso di recupero delle istruzioni efficace e che contribuisce alle prestazioni.
fonte
2014-11-16 13:08:21
L'istruzione di salto ha una versione offset a 32 bit. Se l'offset si adatta a 32 bit, è possibile utilizzare la versione offset a 32 bit e salvare alcuni byte (su un indirizzo assoluto a 64 bit o altro). –
Grazie per il commento. Qual è l'istruzione della versione offset a 64 bit? – WindChaser
Non credo ci sia una versione offset a 64 bit. –