dans l'architecture Intel 64, il y a les registres rax..rdx qui sont simplement des registres à usage général A..D.
Mais il existe également des registres appelés rsi et rdi qui sont les registres "index source" et "index destination". pourquoi ces registres ont-ils des noms réels (par rapport à juste A, etc.)?
Que signifient réellement "index source" et "index de destination"? Et y a-t-il une convention qui dit que ces registres devraient être utilisés dans des circonstances spécifiques?
Ces registres étaient à l'origine implicitement utilisés dans des instructions répétitives, par exemple MOVSB
, qui copient un octet de DS:SI
(DataSegment: SourceIndex) vers ES:DI
(ExtraSegment: DestinationIndex), à la temps des ordinateurs 16 bits avec mémoire segmentée en mode réel. Et aussi comme registres d'index dans les modes d'adressage 16 bits comme [bx + si]
.
À l'heure actuelle, ces registres sont par exemple utilisés pour transmettre les deux premiers paramètres de fonction (entier) dans ABI x86_64 d'UNIX , loin de leur fonction d'origine. (Voir aussi Quelles sont les conventions d'appel pour les appels système UNIX et Linux sur i386 et x86-64 )
Les noms des nouveaux registres rXX
64 bits montrent clairement que les anciens noms de registres ne sont là que pour la familiarité et la rétro-compatibilité. (Mais notez que certaines instructions ne fonctionnent toujours qu'avec certains registres, par exemple rep movsb
ne fonctionne que comme memcpy(rdi, rsi, rcx)
, et est en fait pourquoi RDI et RSI ont été choisis comme les 2 premiers registres de passage d'arg dans le système x86-64 ABI V système: certaines fonctions appellent memset
ou memcpy
avec leurs 1 ou 2 premiers arguments, donc l'inline rep movsb/d
est moins cher dans ce cas.)