2012-03-09 222 views
19

bueno, sé que CLD borra la bandera de dirección y STD establece la bandera de dirección. , pero ¿cuál es el punto en la configuración y el indicador de dirección de limpieza?¿Qué son CLD y STD para el lenguaje de ensamblaje x86? ¿Qué hace DF?

+1

Ugh, el número de errores que causó el bit. Mi código de Turbo Pascal estaba salpicado de ensamblaje en línea para restablecerlo. –

Respuesta

29

El indicador de dirección se usa para influir en la dirección en la que las instrucciones de cadena desplazan los registros de puntero. Estas son las mismas instrucciones que se pueden usar with the REP prefix para repetir la operación. (Aunque lods no es muy útil con rep).

Las instrucciones de cadena son: MOVS (copia de memoria para MEM), STOS (tienda de AL/AX/EAX/RAX), SCAS (cadena de exploración), CMPS (compárese cadena), y LODS (cadena de carga). También hay ins/outs para copiar entre la memoria y un puerto IO. Cada una de estas instrucciones está disponible en tamaño de byte, palabra, dword y qword operando.

En pocas palabras, cuando el indicador de dirección es 0, las instrucciones funcionan incrementando el puntero a los datos después de cada iteración (hasta ECX es cero o alguna otra condición, dependiendo del sabor del prefijo REP), mientras que si la bandera es 1, el puntero se decrementa.

Por ejemplo, movsd copias un DWORD [ds:esi]-[es:edi] (o RDI en el modo de 64 bits), y hace esto: (Ver la sección "operación" en la entrada manual de referencia ISA vinculado extraído de archivos PDF de Intel)

dword [es:edi] = dword [ds:esi]  // 4-byte copy memory to memory 
if (DF == 0) 
    esi += 4; 
    edi += 4; 
else // DF == 1 
    esi -= 4; 
    edi -= 4; 
fi 

con un prefijo REP, lo hace a veces ECX, y las CPU x86 modernas han optimizado microcódigo "cadenas rápidas" que hace la copia (o stos almacenamiento) con 16 bytes o 32 bytes operaciones internas. Vea también this Q&A about memory bandwidth and the ERMSB feature. (Tenga en cuenta que solo rep stos y rep movs están optimizados de esta manera, no en repne/repe scas o).

2

Si utiliza Windows, a continuación, de acuerdo con la convención de llamada STDCALL -

Bajo STDCALL, el indicador de dirección es clara a la entrada y deben ser devueltos clara.

Así que si configura DF, entonces antes de una llamada API debe borrarlo.

+0

Dependiente del sistema operativo. – amanuel2

+0

Esto es común para la mayoría de las convenciones de llamadas de 32 bits/64 bits, incluyendo i386 System V y x86-64 System V. Le permite a usted (o al compilador) alinear eficientemente 'rep movsd' /' rep stosd' sin instrucciones CLD. (En el moderno x86, a menudo solo avanzan rápidamente hacia arriba, con DF = 0) –

6

CLD CLea la bandera de dirección, los datos continúan. STD SeTs la bandera de dirección, los datos van hacia atrás.

0

CLD: claro indicador de dirección de modo que punteros de cadena Incremento automático después de cada operación de cadena

STD: std se utiliza para establecer el indicador de dirección para un 1 para que SI y/o DI será automáticamente decrementa a señale el siguiente elemento de cadena cuando se ejecuta una de las instrucciones de cadena. Si se configura la bandera de dirección, SI/DI se reducirá en 1 para cadenas de bytes y 2 para cadenas de palabras.

Esta respuesta puede ser útil para usted.

Cuestiones relacionadas