Red de conocimiento informático - Conocimiento sistemático - Pregunta de la asamblea: ¿Qué significan movsb y cld?

Pregunta de la asamblea: ¿Qué significan movsb y cld?

Primero, hablemos de MOVSB ​​​​(MOVe String Byte): la instrucción de transferencia de cadenas, que transfiere datos por bytes (MOVSW transfiere cadenas por palabras). Las direcciones de origen y destino de la cadena están controladas por dos registros SI y DI. Por ejemplo, N bytes de la dirección DS:SI se copian a la dirección señalada por ES:DI, y el contenido de DS:SI permanece sin cambios después de la copia.

La instrucción REP (REPeat) significa "repetir" y se denomina "instrucción de prefijo de repetición". Dado que las cadenas se transmiten, sería problemático si el programador las escribiera palabra por palabra (byte por byte). Por lo tanto, es necesario utilizar un registro para controlar la longitud de la cadena y utilizar una pequeña cantidad de código para lograr el propósito de la transmisión única. Este registro es CX Antes de ejecutar cada instrucción, se juzgará si el valor de CX es 0 (cuando es 0, la repetición finaliza, cuando no es 0, el valor de CX se reduce en 1) para establecer el. número de ejecuciones repetidas. Por lo tanto, después de configurar el valor CX, se puede utilizar REP MOVSB ​​​​.

CLD (indicador CLear Direction) borra el indicador de dirección, incluso si el valor de DF es 0, y cambia la dirección de forma incremental para ajustar la dirección de ejecución del puntero actual al realizar operaciones de cadena. El resultado de esta instrucción es opuesto a STD (indicador de dirección SeT), es decir, el valor de DF se establece en 1.

; El ejemplo transfiere 100 bytes de datos en el segmento de datos actual comenzando en el desplazamiento 1000H a la celda que comienza en el desplazamiento 2000H

; Incrementa el; dirección del puntero

push DS ; El segmento de datos actual, por lo tanto, insertado en el almacenamiento de la pila

pop ES ; Make ES=DS

mov SI, 1000H; valor del puntero de la cadena de origen

mov DI, 2000H; valor inicial del puntero de la cadena de destino

mov CX, 100; establecer el tiempo del ciclo

Siguiente paso:

lodsb ; Obtener un byte

stosb ; Guardar un byte

bucle Siguiente ; Realizar un bucle CX veces

; lo anterior:

cld ; incremento de dirección

....

mov CX, 100 ; bucle CX veces

Siguiente paso:

movsb; transfiere un byte de datos a la vez

bucle Siguiente

O escritura más simple:

cld

;

......

mov CX,100; repetir el comando movsb CX veces

rep movsb