programacion programa libro lenguaje instruction instrucciones hacer etiquetas ensamblador ejemplos como assembly x86

assembly - programa - ¿Qué son las CLD y las ETS para el lenguaje ensamblador x86? ¿Qué hace el DF?



programacion en ensamblador (5)

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 el ajuste y la limpieza de la bandera de dirección?


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


CLD: borra el indicador DF en el registro EFLAGS. Cuando el indicador DF se establece en 0, las operaciones de cadena incrementan los registros de índice (ESI y / o EDI).

Aquí hay un ejemplo simple:

section .text global main main: mov ecx, len mov esi, s1 mov edi, s2 cld ; redundant because DF is already guaranteed to be 0 on function entry ; but included for illustration purposes loop_here: lodsb ; AL=[esi], ESI+=1 (because DF=0, otherwise ESI-=1) add al, 02 stosb ; [edi]=AL, EDI+=1 (because DF=0, otherwise EDI-=1) loop loop_here ; like dec ecx / jnz but without setting flags ; ECX=0, EDI and ESI pointing to the end of their buffers mov edx, len-1 ;message length, not including the terminating 0 byte mov ecx,s2 ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) xor ebx,ebx int 0x80 ;call kernel: sys_exit(0) section .data s1: db ''password'', 0 ; source buffer len equ $-s1 section .bss s2: resb len ; destination buffer

(reúna y conéctese con nasm -felf32 caesar.asm && gcc -no-pie -m32 caesar.o -o caesar . O nasm -felf32 caesar.asm && gcc -no-pie -m32 caesar.o -o caesar en un ejecutable estático con esto como _start lugar de main si lo desea).

(En este ejemplo se intentó implementar el cifrado César).


CLD: borra el indicador de dirección para que los punteros de cadena se incrementen automáticamente después de cada operación de cadena

STD: std se usa para establecer el indicador de dirección en un 1, de modo que SI y / o DI disminuyan automáticamente para apuntar al siguiente elemento de cadena cuando se ejecuta una de las instrucciones de la cadena. Si se establece el indicador de dirección, SI / DI será disminuyó en 1 para cadenas de bytes y 2 para cadenas de palabras.

Esta respuesta puede ser útil para usted.


Si usa Windows, entonces de acuerdo con la convención de llamadas STDCALL -

Bajo STDCALL, la bandera de dirección es clara en la entrada y debe devolverse clara.

Entonces, si establece DF, entonces antes de una llamada a la API, debe borrarlo.


El indicador de dirección se utiliza para influir en la dirección en la que las instrucciones de cadena compensan los registros del puntero. Estas son las mismas instrucciones que se pueden usar con el prefijo REP para repetir la operación. (Aunque lods no es muy útil con rep ).

Las instrucciones de cadena son: MOVS (copiar mem a mem), STOS (tienda AL / AX / EAX / RAX), SCAS (cadena de exploración), CMPS (cadena de comparación) 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ños de operandos de byte, palabra, palabra y palabra.

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 que ECX sea ​​cero o alguna otra condición, dependiendo del sabor del prefijo REP ), mientras que si el indicador es 1 , el puntero se decrementa.

Por ejemplo, MOVS copia una palabra desde [ds:esi] a [es:edi] (o rdi en modo de 64 bits), y hace esto: (Consulte la sección "Operación" en la entrada del manual de referencia de ISA vinculado extraída de Intel PDFs)

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, realiza este ECX, y las modernas CPU x86 han optimizado el microcódigo de "cadenas rápidas" que realiza la copia (o almacenamiento de stos ) con operaciones internas de 16 bytes o 32 bytes. Consulte también esta sección de preguntas y respuestas sobre el ancho de banda de la memoria y la función ERMSB . (Tenga en cuenta que solo se optimizan de esta manera las rep movs y de rep movs , no las de repne/repe scas o cmps ).