Subido por Jaime Ricardo Lagunas Piñón

Strings

Anuncio
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
[email protected] con tu nombre.
Descargar