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?
Respuesta
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).
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.
Dependiente del sistema operativo. – amanuel2
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) –
CLD CLea la bandera de dirección, los datos continúan. STD SeTs la bandera de dirección, los datos van hacia atrás.
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.
- 1. ¿Qué hace NOPL en el sistema x86?
- 2. ¿Qué significa "push ebp" en ensamblaje x86?
- 3. ¿Qué debería saber al cambiar de MIPS a ensamblaje x86?
- 4. x86 modismos de ensamblaje
- 5. ¿Qué lenguaje ensamblador aprender?
- 6. ¿Qué hace la instrucción de ensamblaje LEAL?
- 7. ¿Qué hace la secuencia de instrucciones de ensamblaje "rep stos" x86?
- 8. Lenguaje de ensamblaje - Apiladora
- 9. Generando ensamblaje para un procesador x86
- 10. ¿Qué son las proyecciones de lenguaje WinRT?
- 11. ¿Qué está haciendo este ensamblaje en línea x86?
- 12. Lenguaje de ensamblaje para principiantes
- 13. ¿Qué diablos hace std :: bind (x, y) do?
- 14. ¿Qué significa el signo de dólar ($) en ensamblaje x86 al calcular longitudes de cadena como "$ - label"?
- 15. x86 Ensamblaje: instrucción INC y DEC y indicador de desbordamiento
- 16. lenguaje de ensamblaje funcional
- 17. ¿Qué son _Unwind_SjLj_Unregister y _Unwind_SjLj_Register?
- 18. análisis de código estático para lenguaje de ensamblaje
- 19. lenguaje apropiado para la asignación std :: string
- 20. Dibujando un marco de pila para el ensamblaje x86
- 21. ¿Qué operaciones son seguras para hilos en std :: map?
- 22. ¿Qué hace la instrucción de montaje ORG?
- 23. ¿Por qué se nombran los registros x86 tal como son?
- 24. ¿Para qué es el lenguaje M?
- 25. ¿Por qué std :: sin() y std :: cos() son más lentos que sin() y cos()? código
- 26. ¿Qué compiladores x86 C++ son multiproceso por sí mismo?
- 27. std :: function y std :: bind: ¿qué son y cuándo deberían usarse?
- 28. ¿Qué son ReservedCodeCacheSize y InitialCodeCacheSize?
- 29. ¿Qué son los Proxies WCF y para qué sirven?
- 30. ¿Qué significa un asterisco * antes de una dirección en el ensamblaje AT & T x86-64?
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. –