Manipulación de Strings Lenguaje ensamblador Manipulación de Strings En este punto, las instrucciones presentadas han manejado datos definidos como un solo byte, palabra o palabra doble. Sin embargo, a veces es necesario mover o comparar campos de datos que excedan estas longitudes. Por ejemplo, puede querer comparar las descripciones o nombres a fin de clasificarlas en orden ascendente. Los elementos en este formato son conocidos como datos de cadena de caracteres (o sólo datos de cadena) y puede ser de carácter o numérico. Para procesar una cadena de caracteres, el lenguaje ensamblador proporciona cinco instrucciones para cadenas: Table of contents MOVS LODS STOS CMPS SCAS Mueve un byte, palabra o palabra doble desde una localidad en memoria a otra. Carga desde memoria un byte en el AL, una palabra en el AX o una palabra doble en el EAX. Almacena el contenido de los registros AL, AX o EAX en memoria. Compara localidades de memoria de un byte, palabra o palabra doble. Compara el contenido de AL, AX o EAX con el contenido de una localidad de memoria. Características de las operaciones con cadenas de caractéres Una instrucción de cadena puede especificar el procesamiento repetitivo de un byte, palabra o (en el 80386 y procesadores posteriores) palabra doble a un tiempo. Cada instrucción de cadena tiene una versión para byte, palabra o palabra doble y supone el uso de los registros ES:DI o DS:SI. El DI y SI deben contener direcciones de desplazamiento válidas. Maneras de codificar las instrucciones de cadena Básicamente existen dos maneras de codificar instrucciones de cadena. En la tabla siguiente, la segunda columna muestra el formato básico para cada operación, la cual utiliza los operandos implicados listados en la tercer columna (por ejemplo, si codifica una instrucción MOVS, incluya operandos como MOVS BYTE1 ,BYTE2, en donde la definición de los operandos indican la longitud del movimiento) Tabla de operaciones e instrucciones- cadenas La segunda manera de codificar instrucciones de cadena es la práctica usual, como se mostró en las columnas cuarta, quinta y sexta. Usted carga las direcciones de los operandos en los registros DI y SI y codifica, por ejemplo, MOVSB, MOVSW y MOVSD sin operandos. Las instrucciones de cadena suponen que el DI y el SI contienen direcciones de desplazamiento válidas que hacen referencia a bytes en memoria. El registro SI está asociado por lo común con el DS (segmento de datos) como DS:SI. El registro DI siempre está asociado con el registro ES (segmento extra) como ES:DI. En consecuencia, MOVS, STOS, CMPS y SCAS necesitan que un programa .EXE inicialice el registro ES en general pero no necesariamente, con la misma dirección que la del registro DS: PREFIJO DE REPETICIÓN DE CADENA Una instrucción asociada, el prefijo REP, provoca que una instrucción para cadena se realice de manera repetitiva un número específico de veces. El prefijo REP inmediatamente antes de una instrucción de cadena, como REP MOVSB, proporciona una ejecución repetida con base en un contador inicial que usted establece en el registro CX. REP ejecuta la instrucción de cadena, disminuye el CX y repite la operación hasta que el contador en el CX sea cero. De esta manera, puede manejar cadenas de caracteres de casi cualquier longitud. Durante la ejecución, las instrucciones CMPS y SCAS también establecen las banderas de estado, de modo que la operación puede terminar de manera inmediata al encontrar una condición especificada. Las variaciones de REP para este propósito son las siguientes: • REP Repite la operación hasta que el CX llegue a cero. • REPE o REPZ Repite la operación mientras la bandera de cero (ZF) indique igual o cero. Se detiene cuando la ZF indica diferente o cero o cuando CX llega a cero. • REPNE o REPNZ Repite la operación mientras la ZF indica diferente o cero. Se detiene cuando la ZF indica igual o cero o cuando CX llega a cero. Para el 80286 y procesadores más avanzados, el uso de las operaciones con palabra o palabra doble puede proporcionar un procesamiento más rápido. Ahora examinaremos en detalle las operaciones de cadena. MOVS: MOVER UNA CADENA DE CARACTERES ● ● MOVS combinada con un prefijo REP y una longitud en el CX puede mover cualquier número de caracteres. Aunque tú no codifiques los operandos, la instrucción se parece a esto: [etiqueta:] REP MOVSn [ES:DI, DS:SI] MOVS: MOVER UNA CADENA DE CARACTERES ● ● ● Para la cadena receptora, los registros segmento:desplazamiento son ES:DI; para la cadena emisora los registros segmento desplazamiento son DS:SI. Como resultado, al inicio de un programa . EXE inicialice el registro ES junto con el registro DS y, antes de ejecutar el MOVS, utilice LEA para inicializar los registros DI y SI. Dependiendo de la bandera de dirección, MOVS incrementa o disminuye los registros DI y SI en 1 para un byte, en 2 para una palabra y en 4 para una palabra doble. MOVS: MOVER UNA CADENA DE CARACTERES ● ● ● Para la cadena receptora, los registros segmento:desplazamiento son ES:DI; para la cadena emisora los registros segmento desplazamiento son DS:SI. Como resultado, al inicio de un programa . EXE inicialice el registro ES junto con el registro DS y, antes de ejecutar el MOVS, utilice LEA para inicializar los registros DI y SI. Dependiendo de la bandera de dirección, MOVS incrementa o disminuye los registros DI y SI en 1 para un byte, en 2 para una palabra y en 4 para una palabra doble. Parte 1 En la figura el procedimiento C10MVSB utiliza MOVSB para mover de byte en byte un campo de 10 bytes NAME1 a NAME2. La primer instrucción, CLD, pone en cero la bandera de dirección de modo que el MOVSB procesa los datos de izquierda a derecha. Al inicio de la ejecución, por lo regular la bandera de dirección se encuentra en cero, pero aquí por precaución está codificado CLD. Parte 2 Las dos instrucciones LEA cargan los registros SI y DI con los desplazamientos de NAME1 y NAME2, respectivamente. Ya que el cargador del DOS para un programa .COM de manera automática inicializa los registros DS y ES, las direcciones segmento:desplazamiento son correctas para ES:DI y DS:SI. Una instrucción MOV inicializa el CX con 10 (la longitud de NAME1 y de NAME2).. Parte 3 Ahora la instrucción REP MOVSB realiza lo siguiente: • Mueve el byte de la extrema izquierda de NAME1 (direccionado por DS:SI) al byte de extrema izquierda de NAME2 (direccionado por ES:DI). • Incrementa el DI y SI en uno para los siguientes bytes a la derecha. • Disminuye el CX en 1. • Repite esta operación, 10 ciclos en total, hasta que el CX se convierte en cero Parte 3-b Puesto que la bandera de dirección es cero y MOVSB incrementa DI y SI, cada iteración procesa un byte más a la derecha, como NAME1 +1 a NAME2+1, y así en forma sucesiva. Al final de la ejecución, el CX contiene 00, el DI contiene la dirección de NAME2+10, y el SI contiene la dirección de NAME1 +10 Si la bandera de dirección es uno, MOVSB disminuiría DI y SI, provocando que el procesamiento ocurriera de derecha a izquierda. Pero en ese caso, para mover los contenidos de manera adecuada tendría que inicializar el SI con NAME1 +9 y el DI con NAME2+9. Parte 4 El procedimiento siguiente de la figura 12-1, D10MVSW, utiliza MOVSW para mover cinco palabras desde NAME2 a NAME3. Al final de la ejecución, el CX contiene 00, el DI contiene la dirección de NAME3 + 10, y el SI contiene la dirección de NAME2+10. Ya que MOVSW incrementa los registros DI y SI en 2, la operación sólo necesita de cinco ciclos. Para procesar de derecha a izquierda, inicialice el SI con NAME1+8 y el DI con NAME2+8. ACTIVIDAD Observa el siguiente video (https://youtu.be/Bm9BQ36-P98) En ese video se hace una explicación de algunas de las instrucciones que hemos visto responde a estas preguntas: ¿Para qué se usa LEA? ¿Por qué se usa offset? ¿Por qué usamos db? ¿Cuántos bits usa el código ascii? Agrega las respuestas después de esta diapositiva y ponle tu nombre a la presentación súbela a la plataforma asimismo envíala al correo jaime.lagunas@Gmail.com con tu nombre.