sexualidad secundaria resumen que lineamientos ley enseña educacion definicion curriculares analisis assembly x86

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.

Aunque no puedo recordar dónde lo vi, pero this confirma la mayor parte, y this (diapositiva 17) otros:

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.