web-dev-qa-db-fra.com

Registres Intel 64, rsi et rdi

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?

28
Jonathan.

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.)

18
delehef