Está en la página 1de 5

CADENAS Y ARREGLOS

Instrucciones primitivas de cadena


El conjunto de instrucciones IA-32 tiene cinco grupos de instrucciones para procesar arreglos de bytes,
palabras y dobles palabras. No se limitan a los arreglos de cadenas.

Instrucción Descripción
MOVSB, MOVSW, Mover datos de cadena: copia los datos de la memoria direccionada por ESI
MOVSD a la memoria direccionada por EDI.
CMPSB, CMPSW, CMPSD Comparar cadenas: compara el contenido de dos ubicaciones de memoria
direccionadas por ESI y EDI.
SCASB, SCASW, SCASD Explorar cadenas: compara el acumulador (AL, AX, o EAX) con el contenido
de la memoria direccionada por EDI.
STOSB, STOSW, STOSD Almacenar datos de cadena: almacena el contenido del acumulador en la
memoria direccionada por EDI.
LODSB, LODSW, LODSD Cargar acumulador desde cadena: carga la memoria direcciona por ESI al
acumulador.

Cada instrucción en la tabla anterior utiliza en forma explícita a ESI, EDI o ambos registros para
direccionar la memoria. Las referencias al acumulado implican el uso de AL, AC o EAX, dependiendo del
tamaño de los datos de la instrucción.

En los programas en modo protegido, ESI es de maneta automática un desplazamiento en el segmento


por DS; y EDI es de manera automática un desplazamiento en el segmento diseccionado por ES. DS y ES
siempre se establecen con el mismo valor, y no se pueden cambiar. Por otro lado, en el modo de
direccionamiento real, los programadores de ASM manipulan con frecuencia a ES y DS.

Uso de prefijo de repetición Por sí sola, una instrucción de primitiva cadena solo 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.

REP Repite mientras que ECX > 0


REPZ, REPE Repite mientras la bandera Cero este en uno y ECX > 0
REPNZ, REPNE Repite mientras la bandera Cero este en cero y ECX > 0

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
de forma automática. La bandera Dirección determina si ESI y EDI se va a incrementar o decrementar.

Instrucción Función Valor que se agrega o se resta a ESI y EDI


MOVSB Mueve (copia ) bytes 1
MOVSW Mueve (copia ) palabras 2
MOVSD Mueve (copia ) dobles palabras 4

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. La bandera de direccionamiento determina el incremento o
decremento de ESI y EDI.

CMPSB Compara bytes


CMPSW Compara palabras
CMPSD Compara dobles palabras

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 esta 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 (REPZ), la cadena o
arreglo se explora mientras que ECX > 0, y el valor en AL/AX/EAX coincida con un valor en memoria, o
cuando ECX = 0.

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.

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.

Procedimientos de cadenas seleccionadas


Procedimiento str_compare

El procedimiento str_compare compara dos cadenas. El formato de la llamada es:

INVOKE Str_compare, ADDR cadena1, ADDR cadena2

Este procedimiento compara las cadenas en orden hacia delante, empezando en el primer byte. La
comparación es sensible al uso de mayúsculas y minúsculas, ya que los códigos ASCII son distintos para
las letras mayúsculas y minúsculas. El procedimiento no devuelve valor, pero las banderas Acarreo y
Cero pueden interpretarse como se muestra a continuación usando los argumentos cadena 1 y
cadena2.

Relación Bandera Acarreo Bandera Cero Bifurca si es verdadero


cadena1 < cadena2 1 0 JB
cadena1 == cadena2 0 1 JE
cadena1 > cadena2 0 0 JA

Procedimiento Str_lenght

El procedimiento Str_lenght devuelve la longitud de una cadena en el registro EAX. Al llamarlo, hay que
pasarle el desplazamiento de la cadena. Por ejemplo:

INVOKE Str_lenght, ADDR micadena

Procedimiento Str_copy

El procedimiento Str_copy copia una cadena con terminación nula, de una ubicación de origen a una
ubicación de destino. Antes de llamar a este procedimiento, debemos asegurarnos de que el operando
de destino sea lo bastante grande como para poder almacenar la cadena que se va a copiar. La sintaxis
para llamar a Str_copy es:

INVOKE Str_copy, ADDR origen, ADDR destino

El procedimiento no devuelve valores.

Procedimiento Str_trim

El procedimiento Str_trim elimina todas las ocurrencias de un carácter a la derecha, seleccionando de


una cadena con terminación nula. La sintaxis para llamar a este procedimiento es:

INVOKE Str_trim, ADDR cadena, car_a_eliminar

La lógica para este procedimiento es interesante, ya que hay revisar una variedad de casos posibles.

Podemos usar el procedimiento Str_trim para eliminar todos los espacios del final de una cadena. La
manera más sencilla de truncar caracteres de una cadena es insertar un byte nulo justo antes de los
caracteres que se desean retener. Cualquier carácter después del byte nulo se vuelve insignificante.
Procedimiento Str_ucase

El procedimiento Str_ucase convierte todos los caracteres de una cadena a mayúscula. No devuelve un
valor. Al llamar este procedimiento, hay que pasarle el desplazamiento de una cadena:

INVOKE Str_ucase, ADDR micadena

Arreglos bidimensionales
Ordenamiento de filas y columnas

Desde la perspectiva de un programador de lenguaje ensamblador, un arreglo bidimensional es una


abstracción de alto nivel de un arreglo unidimensional. Los lenguajes de alto nivel seleccionan uno de
dos métodos para ordenar las filas y columnas en memoria: orden por filas (row-major) y orden por
columnas ( column-major). Cuando se utiliza el orden por filas (el más común), la primera fila va seguido
en la memoria por el primer elemento de la segunda fila. Cuando se utiliza el orden por columnas, los
elementos den la primera columna aparecen al principio del bloque de memoria. El último elemento en
la primera columna va seguido en la memoria por el primer elemento de la segunda columna.

1 2 30 4 5
Arreglo lógico: 0 0 0 0
6 7 80 9 A
0 0 0 0
B C D E F0
1 2 3 4 5 6 7 8 9 A0 B0 C0 D0 E F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Orden por filas

1 6 B 2 7 C 3 8 D 4 9 E 5 A F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Orden por columnas

Si implementa un arreglo bidimensional en lenguaje ensamblador, puede elegir cualquiera de los dos
métodos de ordenamiento. En este capítulo utilizando el orden por las filas. Si escribe subrutinas en
lenguaje ensamblador para un lenguaje de alto nivel, debe seguir l orden especificando en su
documentación.

El conjunto de instrucciones IA-32 incluye dos tipos de operandos (base-índice y base-índice-


desplazamiento), ambos adecuados para las aplicaciones con arreglos.

Operandos base-índice
Un operando base-índice suma los valores de dos registros (llamados base e índice), produciendo una
dirección de desplazamiento

[base + índice]

Los corchetes son necesarios. En modo de 32 bits, cualquier registro de propósito general de 32 bits
puede ser registro de base o índice. En modo de 16 bits, el registro debe ser BX o BP.

0150 0155 0157

1 2 3 4 5 6 7 8 9 A B C D E F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

[ebx] [ebx + esi]

Ejemplo de base-índice

Operandos base-índice-desplazamiento

Un operando base-índice-desplazamiento combina un desplazamiento, un registro base, un registro


índice y un factor de escala opcional para producir una dirección efectiva. He aquí los formatos:

[base + índice + desplazamiento]

desplazamiento[base + índice]

Desplazamiento puede ser ser el nombre de una variable o expresión constante. En modo de 32 bits,
puede utilizarse cualquier registro de propósito general de 32 bits para la base y el índice. En modo de
16 bits, el operando base debe ser BX o BP y el operando índice debe ser SI o DI. Los operandos base-
índice-desplazamiento se adaptan muy bien al procesamiento de arreglos bidimensionales. El
desplazamiento puede ser el nombre de un arreglo, el operando base puede guardar el desplazamiento
de la fila y el operando índice puede guardar el desplazamiento de la columna.

0150 0164 018C

1 2 3 4 5 6 7 8 9 A B C D E F
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

tabla tabla[ebx] tabla[ebx + esi * 4]

tam fila = 0014h

Ejemplo de base-índice-desplazamiento

También podría gustarte