assembly - secundaria - que se enseña en esi
¿Propósito de los registros de ESI y EDI? (5)
¿Cuál es el propósito real y el uso de los registros EDI y ESI en el ensamblador?
Sé que se usan para operaciones de cuerda por una cosa.
¿Alguien puede dar un ejemplo?
Además de las operaciones de cadena (MOVS / INS / STOS / CMPS / SCASB / W / D / Q etc.) mencionadas en las otras respuestas, quería agregar que también hay más instrucciones de ensamblaje x86 "modernas" que se usan implícitamente en menos EDI / RDI:
La instrucción SSE2 MASKMOVDQU
(y la venidera AVX VMASKMOVDQU
) escribe selectivamente bytes de un registro XMM en la memoria apuntada por EDI / RDI.
Además de los registros que se utilizan para operaciones masivas, son útiles para su propiedad de ser preservados a través de una llamada a función (llamada preservada) en convención de llamadas de 32 bits. El ESI, EDI, EBX, EBP, ESP se conservan en llamada, mientras que EAX, ECX y EDX no se conservan en la llamada. Los registros conservados en la llamada son respetados por la función de la biblioteca C y sus valores persisten a través de las llamadas a funciones de la biblioteca C.
Jeff Duntemann en su libro de lenguaje ensamblador tiene un código de ensamblaje de ejemplo para imprimir los argumentos de línea de comando. El código usa esi y edi para almacenar contadores, ya que no se modificarán con la función de biblioteca C printf. Para otros registros como eax, ecx, edx, no hay garantía de que no sean utilizados por las funciones de la biblioteca C.
https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
Consulte la sección 12.8 Cómo ve C los argumentos de la línea de comandos.
Tenga en cuenta que las convenciones de llamadas de 64 bits son diferentes de las convenciones de llamadas de 32 bits, y no estoy seguro de si estos registros se conservan o no.
Hay algunas operaciones que solo puede hacer con DI / SI (o sus contrapartes extendidas, si no aprendió ASM en 1985). Entre estos están
REP STOSB
REP MOVSB
REP SCASB
Que son, respectivamente, operaciones para almacenar, cargar y escanear repetidamente (= masa). Lo que debes hacer es configurar SI y / o DI para apuntar a uno o ambos operandos, tal vez poner un conteo en CX y luego dejar que se rompa. Estas son operaciones que funcionan en un grupo de bytes a la vez, y ponen la CPU en modo automático. Como no está codificando explícitamente bucles, lo hacen de manera más eficiente (generalmente) que un bucle codificado a mano.
En caso de que se lo pregunte: dependiendo de cómo configure la operación, el almacenamiento repetido puede ser algo tan simple como perforar el valor 0 en un gran bloque contiguo de memoria; Me parece que MOVSB se utiliza para copiar datos de un búfer (bueno, cualquier grupo de bytes) a otro; y SCASB se utiliza para buscar un byte que coincida con algún criterio de búsqueda (no estoy seguro de si solo está buscando igualdad, o qué, puede buscarlo :))
Eso es más de lo que son esas reglas.
Opcodes como MOVSB y MOVSW que copian datos de manera eficiente de la memoria apuntada por ESI a la memoria apuntada por EDI. Así,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
SI
= Índice de origen
DI
= Índice de Destino
Como otros han indicado, tienen usos especiales con las instrucciones de cadena. Para la programación en modo real, el registro del segmento ES
debe usarse con DI
y DS
con SI
como en
movsb es:di, ds:si
SI y DI también se pueden usar como registros de índice de propósito general. Por ejemplo, el código fuente C
srcp [srcidx++] = argv [j];
compila en
8B550C mov edx,[ebp+0C]
8B0C9A mov ecx,[edx+4*ebx]
894CBDAC mov [ebp+4*edi-54],ecx
47 inc edi
donde ebp+12
contiene argv
, ebx
es j
y edi
tiene srcidx
. Observe que la tercera instrucción usa edi
mulitplied por 4 y agrega ebp
offset por 0x54 (la ubicación de srcp
); los corchetes alrededor de la dirección indican indirección.
AX
= acumulador
DX
= acumulador de doble palabra
CX
= contador
BX
= registro base
Parecen registros de propósito general, pero hay una serie de instrucciones que (¿inesperadamente?) Usan uno de ellos, pero ¿cuál? - implícitamente.