Skip to content

Glossary

Registre RDI

RDI est le registre d'index de destination 64 bits de x86-64, pointeur des opérations sur chaînes et premier argument de fonction sur System V.

RDI est un registre général 64 bits de l'architecture x86-64, qui étend EDI. Le nom signifie destination index (index de destination) : dans les instructions sur chaînes et blocs telles que movs, stos et scas, RDI est le pointeur de destination implicite, avancé automatiquement après chaque élément selon le drapeau de direction.

En tant que registre d'argument, les deux ABI divergent fortement. Dans la System V AMD64 ABI (Linux, macOS), RDI contient le premier argument entier/pointeur et est sauvegardé par l'appelant — la toute première chose passée à presque chaque fonction Linux atterrit donc ici. Dans la Microsoft x64 ABI (Windows), RDI n'est pas un registre d'argument ; il est sauvegardé par l'appelé (non volatil) et doit être préservé avant usage.

Sous-registres

asm
lea rdi, [buf]       ; pointeur de destination
mov al, 0
mov rcx, 256
rep stosb            ; remplit RCX octets en RDI avec AL (memset)
; edi = 32 bits de poids faible (met à zéro la moitié haute à l'écriture)
; di  = 16 bits de poids faible
; dil = 8 bits de poids faible

Pourquoi c'est important en rétro-ingénierie

Sur les binaires Linux, la valeur dans RDI juste avant un call est le premier argument — souvent un pointeur ou un descripteur de fichier — c'est donc généralement là que vous commencez à lire l'intention d'une fonction. Dans les boucles rep stos/movs, RDI marque le tampon en cours d'écriture, ce qui identifie immédiatement une cible memset ou memcpy.

Voir le concept général de registre et la référence assembleur. Les différences d'ordre des arguments sont traitées dans assembleur x86 vs x64. C'est le pendant du registre RSI, la source des mêmes opérations sur chaînes.