x64 - the art of assembly language en español
Intel 64, rsi y rdi registra (1)
en la arquitectura Intel 64 hay los registros rax..rdx que son simplemente registros de propósito general A..D.
Pero también hay registros llamados rsi y rdi que son los registros de "índice de origen" y "índice de destino". ¿Por qué estos registros tienen nombres reales (en comparación con solo A, etc.)?
¿Qué significa realmente "índice de origen" e "índice de destino"? ¿Y hay alguna convención que diga que estos registros deberían usarse en circunstancias específicas?
Estos registros originalmente se usaron implícitamente en instrucciones repetitivas, por ejemplo MOVSB
, que copian un byte de DS:SI
(DataSegment: SourceIndex) a ES:DI
(ExtraSegment: DestinationIndex), en el momento de las computadoras de 16 bits con memoria segmentada en modo real Y también como registros de índice en modos de direccionamiento de 16 bits como [bx + si]
.
En este momento, estos registros se utilizan, por ejemplo, para transmitir los primeros dos parámetros de función (enteros) en x86_64 ABI de UNIX , lejos de su propósito original. (Consulte también ¿Cuáles son los convenios de llamada para las llamadas de sistema UNIX y Linux en i386 y x86-64 )
Los nombres de los nuevos rXX
64 bits muestran claramente que los nombres de registros antiguos solo están aquí para familiaridad y compatibilidad rXX
. (Pero tenga en cuenta que algunas instrucciones aún funcionan solo con algunos registros, por ejemplo, rep movsb
solo funciona como un memcpy(rdi, rsi, rcx)
, y de hecho es por eso que RDI y RSI fueron elegidos como los primeros 2 registros de aprobación de argumentos en el ABI x86-64 del sistema V: algunas funciones llaman memset
o memcpy
con sus primeros 1 o 2 argumentos, por lo que en ese caso la rep movsb/d
es más barata.)