0% encontró este documento útil (0 votos)
46 vistas12 páginas

Cadenas

El documento describe las matrices y cadenas en ensamblador, incluyendo su sintaxis y cómo manipularlas mediante instrucciones primitivas. Explica cómo mover, comparar, cargar y almacenar datos en cadenas y arreglos bidimensionales de manera eficiente usando instrucciones como MOVSB, CMPSB, SCASB y STOSB. También cubre el uso de prefijos de repetición para procesar arreglos enteros con una sola instrucción.

Cargado por

Danna Croch
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
46 vistas12 páginas

Cadenas

El documento describe las matrices y cadenas en ensamblador, incluyendo su sintaxis y cómo manipularlas mediante instrucciones primitivas. Explica cómo mover, comparar, cargar y almacenar datos en cadenas y arreglos bidimensionales de manera eficiente usando instrucciones como MOVSB, CMPSB, SCASB y STOSB. También cubre el uso de prefijos de repetición para procesar arreglos enteros con una sola instrucción.

Cargado por

Danna Croch
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

4.

2 Matrices
Una matriz es un array multidimensional. Se definen igual que los arreglos excepto que se requiere
un índice por cada dimensión. Una matriz bidimensional se podría representar gráficamente como
una tabla con filas y columnas.

Su sintaxis es la siguiente:

arry sdword 2 dup (?) Arry [2][5];


sdword 5 dup (?)

Ejemplo

4.3 Cadenas
Ahora se estudiará las técnicas para procesar cadenas, con el objetivo de escribir código eficiente.
Empezaremos con las instrucciones para mover, comparar, cargar y almacenar bloques de datos. A
continuación presentaremos varios procedimientos para el manejo de cadenas y por último se
muestra cómo manipular arreglos bidimensionales.

4.3.1 Instrucciones primitivas de cadenas


El conjunto de instrucciones de la arquitectura IA-32 tiene cinco grupos de instrucciones para
procesar arreglos de bytes, palabras y dobles palabras. Aunque se llaman primitivas de cadenas, no
se limitan a los arreglos de cadenas. Cada instrucción en la siguiente tabla utiliza en forma implícita
a ESI, EDI o ambos registros para direccionar la memoria. Las referencias al acumulador implican el
uso de AL, AX o EAX, dependiendo del tamaño de los datos de la instrucción. Las primitivas de
cadenas se ejecutan con eficiencia, ya que se repiten e incrementan los índices de los arreglos de
manera automática.

Tabla de Instrucciones primitivas de cadenas

4.3.2 Bandera Dirección Las instrucciones de primitiva de cadenas incrementan o decrementan


a ESI y EDI, según el estado de la bandera Dirección. Esta bandera puede modificarse en forma
explícita, usando las instrucciones CLD y STD:
CLD ; borra la bandera Dirección (dirección de avance), le asigna un valor 0.
STD ; activa la bandera Dirección (dirección de retroceso), le asigna el valor 1.

Si olvidamos activar la bandera Dirección antes de una instrucción primitiva de cadena, podemos
tener grandes problemas. El código resultante se ejecuta de manera inconsistente, según el estado
arbitrario de la bandera Dirección.
4.3.3 Las instrucciones MOVSB, MOVSW y MOVSD
Las instrucciones MOVSB, MOVSW y MOVSD copian datos de la ubicación de memoria a la que
apunta
ESI, hasta la ubicación de memoria a la que apunta EDI. Los dos registros se incrementan o
decrementan en forma automática (según el valor de la bandera Dirección):

MOVSB; Mueve (copia) bytes


MOVSW; Mueve (copia) palabras
MOVSD; Mueve (copia) dobles palabras

Puede utilizar un prefijo de repetición con MOVSB, MOVSW y MOVSD. La bandera Dirección
determina si ESI y EDI se van a incrementar o a decrementar. El tamaño del incremento o
decremento se muestra a continuación:

MOVSB; 1 Valor que se agrega o se resta a ESI y EDI


MOVSW; 2
MOVSD; 4

Ejemplo: copiar arreglo de dobles palabras Suponga que queremos copiar 20 enteros tipo doble
palabra, de origen a destino. Una vez que se copia el arreglo, ESI y EDI apuntan una posición (4
bytes) más lejos del final de cada arreglo:

4.3.4 Las instrucciones CMPSB, CMPSW y CMPSD


Las instrucciones CMPSB, CMPSW y CMPSD comparan un operando de memoria al que apunta ESI,
con un operando de memoria al que apunta EDI:

CMPSB; Compara bytes


CMPSW; Compara palabras
CMPSD; Compara dobles palabras

Ejemplo:
Ejemplo: comparación de dos cadenas
Por lo general, las cadenas se comparan relacionando caracteres individuales en secuencia,
empezando al principio de las cadenas. Por ejemplo, los primeros tres caracteres de “AABC” y
“AABB” son idénticos. En la cuarta posición, el código ASCII para “C” (en la primera cadena) es
mayor que el código ASCII para “B” (en la segunda cadena). Por ende, la primera cadena se
considera mayor que la segunda. De manera similar, si las cadenas “AAB” y “AABB” se comparan,
la segunda cadena tiene un valor más grande. Los primeros tres caracteres son idénticos, pero
existe un carácter adicional en la segunda cadena.
4.3.5 Las instrucciones SCASB, SCASW y SCASD
Las instrucciones SCASB, SCASW y SCASD comparan un valor en AL/AX/EAX con un byte, palabra o
doble palabra, respectivamente, la cual está direccionada por EDI. Las instrucciones son útiles
cuando se busca un valor individual en una cadena o arreglo. Si se combinan con el prefijo REPE (o
REPZ), la cadena o arreglo se explora mientras ECX > 0, y el valor en AL/AX/EAX coincida con cada
valor subsiguiente en memoria. El prefijo REPNE explora hasta que AL/AX/EAX coincida con un
valor en memoria, o cuando ECX = 0.

Explorar en busca de un carácter que coincida En el siguiente ejemplo buscamos la letra F en


la cadena alfa. Si se encuentra la letra, EDI apunta una posición más allá del carácter que coincidió.
Si no se encuentra la letra, JNZ termina el programa:

4.3.6
Las

instrucciones STOSB, STOSW y STOSD


Las instrucciones STOSB, STOSW y STOSD almacenan en memoria el contenido de AL/AX/EAX,
respectivamente, en el desplazamiento al que apunta EDI. EDI se incrementa o decrementa con
base en el estado de la bandera Dirección. Cuando se utilizan con el prefijo REP, estas instrucciones
son útiles para rellenar todos los elementos de una cadena o arreglo con un solo valor. Por
ejemplo, el siguiente código inicializa cada byte en cadena1 con 0FFh:
4.3.7 Las instrucciones LODSB, LODSW y LODSD
Las instrucciones LODSB, LODSW y LODSD cargan un byte o palabra de la memoria en ESI, hacia
AL/ AX/EAX, respectivamente. ESI se incrementa o decrementa según el estado de la bandera
Dirección. El prefijo REP se utiliza raras veces con LODS, ya que cada nuevo valor que se carga en
el acumulador sobrescribe su contenido anterior. En vez de ello, LODS se utiliza para cargar un solo
valor. En el siguiente ejemplo, LODSB sustituye a las dos instrucciones siguientes (suponiendo que
la bandera Dirección esté en cero):
mov al,[esi] ; mueve byte hacia AL
inc esi ; apunta al siguiente byte

En estos ejemplos se mueve carácter por carácter del string1 al string2 sin la utilización de alguna
función de cadena.
Nota:
mov SI, OFFSET Var1
Equivale a:
Lea SI, Var1

En estos ejemplos se mueve carácter por carácter del string1 al string2 con la utilización de alguna
función de cadena.

En
este ejemplo solo se mueve la letra a y se podría implementar de la siguiente manera de una forma
más sencilla.

Pero qué pasa si la cadena tiene más


de un carácter.

4.3.8 prefijo de repetición


Por sí sola, una instrucción de primitiva de cadena sólo procesa un solo valor de memoria o un par
de valores. Si agregamos un prefijo de repetición, la instrucción se repite usando a ECX como
contador. El prefijo de repetición nos permite procesar un arreglo completo mediante una sola
instrucción. Se utilizan los siguientes prefijos de repetición:
Ejemplo: copiar una cadena En el siguiente ejemplo, MOVSB se mueve 10 bytes a partir de
cadena1,
hacia cadena2. El prefijo de repetición primero evalúa ECX > 0 antes de ejecutar la instrucción
MOVSB. Si ECX = 0, la instrucción se ignora y el control pasa a la siguiente línea en el programa. Si
ECX > 0, ECX se decrementa y la instrucción se repite:

Qué hace el siguiente código?

4.3.7 Arreglos de cadenas


Ejercicios
Ejercicio 1: Escribe un programa que pida nueve números enteros y los almacene en una matriz
3x3. Presentar un menú, 1) Introducir valores, 2) Mostrar Matriz, 3) Calcular la suma de los
números de cada fila y mostrar por pantalla el número de fila con mayor suma, 4) Mostrar el
Máximo valor por fila, 5) Mostrar el Máximo valor por columna y 6) Salir.

Ejercicio 2: crear la siguiente interface gráfica e implementar los métodos solicitados


Esta instrucciones les pueden ser útiles para darle color el fondo y las letras

RGB 240,240,240 ;RGB(R,G,B)


invoke SetBkColor,hdc,eax

RGB 0,128, 92
invoke SetTextColor,hdc,eax

También podría gustarte