Está en la página 1de 5

7.1.

Manejo de matrices
Ya vimos las matrices en el captulo 3.1.12. y convinimos en definirlas de forma homognea y dejar las heterogneas para las estructuras. Recordaremos que un ejemplo de matrices son las cadenas de caracteres. Muchas de las instrucciones usadas en el trabajo con matrices usan las asociaciones DS:SI, ES:DI; donde SI es el puntero origen y DI el destino. Como venimos trabajando con archivos de tipo "COM", DS=ES, esto no siempre ser as en programas de tipo "EXE", en este caso debemos tener especial cuidado con este detalle. Sin embargo es posible modificar los registros por defecto insertndolos a mano, por ejemplo, LODSB coge su dato de [DS:SI], pero si ponemos "LODSB [SS:SI]" lo leer de [SS:SI]. Normalmente las instrucciones que usan esa asociacin se encargan de incrementar o decrementar el valor de SI-DI para que apunten al siguiente elemento, en funcin de la bandera de direccin (si es nula incrementar; si activa, decrementar), la instruccin "CLD" se encarga de anularla y "STD" de activarla. La cuanta de este incremento depende del tamao de los datos con los que se trabaje, as si stos son de tipo byte, el incremento ser de 1 unidad; si de word, de 2 unidades. Obsrvese asmismo que, mientras MASM establece el tamao de los datos segn la capacidad del destino, no as NASM ni FASM, que exijen su explicitacin; as, si "MOVS" es admisible en MASM, no as en NASM ni en FASM que reclaman el uso de "MOVSB" o "MOVSW" para byte o word respectivamente. Puesto que las instrucciones de cadena renen el proceso de datos con la actualizacin de los ndices de origen y destino de stos, a menudo se utilizan en conjuncin con los prefijos REP, construyendo as pequeos bucles ultrarrpidos especialmente indicados para inicializar una zona de memoria a un valor determinado, mover un bloque de memoria a otra posicin o buscar un dato por la memoria.

7.1.1. Instrucciones comunes


7.1.1.1. LODS
Significado Sintaxis Accin byte word LoaD String element=Cargar elemento de cadena LODS, LODSB, LODSW AL=byte ptr [DS:SI], SI=SI+1 AX=word ptr [DS:SI];SI=SI+2 implcito Ninguna

Modo de direccionamiento Banderas modificadas

Copia en AL si byte o en AX si word el byte o word respectivamente apuntado por DS:SI. Tabla 07-01 - LODS LODSCM1 Cdigo LODSCF1 Cdigo LODSCN1 Cdigo Resultado en pantalla

[bin] [bin] [bin] Source 07-01 - Va recogiendo en AL los valores de una tabla en memoria Observemos del uso de "LODS" en lugar de "LODSB", ello es posible debido a que el argumento que le ponemos lleva typecast, con lo que reconoce el tamao implcitamente. Sin embargo, tanto en FASM como en NASM no es lcito el uso de "LODS", obligatoriamente ha de ser "LODSB" o "LODSW".

7.1.1.2. STOS
Significado Sintaxis Accin byte word STOre String Element=Almacena Elemento de cadena STOS, STOSB, STOSW byte ptr [DS:SI]=AL, DI=DI+1 word ptr [DS:SI]=AX;DI=DI+2 Ninguna

Modo de direccionamiento implcito Banderas modificadas Copia en ES:DI el valor de AL si byte o AX si word. Tabla 07-02 - STOS STOSCM1 STOSCF1 STOSCN1 Resultado en pantalla Cdigo [bin] Cdigo [bin] Cdigo [bin]
********************* ********************* ********************* ********************* ********************* *********************

Source 07-02 - Rellena la pantalla con '*' en blanco sobre negro Ya sabemos que STOS utiliza ES:DI, con lo que apuntamos ES al segmento de vdeo que se encuentra en la direccin 0B800h y hacemos que DI apunte al inicio anulndolo. CX=80*25 que es el nmero de palabras que posee la pantalla de vdeo y actuar como contador del bucle que generamos con REP.

7.1.1.3. MOVS
Significado Sintaxis Accin byte word MOVe String element=Mueve elemento de cadena MOVS, MOVSB, MOVSW Byte ptr [ES:DI]=byte ptr [DS:SI], SI=SI+1, DI=DI+1 Word ptr [ES:DI]=word ptr [DS:SI];SI=SI+2, DI=DI+2 Ninguna

Modo de direccionamiento implcito Banderas modificadas Copia en ES:DI un byte o word de DS:SI. Tabla 07-03 - MOVS MOVSCM1 MOVSCF1 MOVSCN1 Resultado en pantalla

Cdigo [bin]

Cdigo

Cdigo

[bin] [bin] Source 07-03 - Invierte el orden de las letras en una cadena de caracteres

C:\Trabajo\AOE\Codigos\Cap07>MOVSCF1 odatruH orellabaC rotciV osnoflA

Este programa muestra por pantalla el nombre con las letras cambiadas de orden. Para ello usamos MOVSB que copia el cada byte de DS:SI a ES:DI y va incrementando SI y DI cada vez, por lo que debemos decrementar dos veces DI puesto que ste recorre el bfer desde el final al inicio. Es interesante cmo hemos valorado la constante "Lon": "$" es un valor numrico que indica "hasta aqu" y Nombre es otro valor numrico que apunta al inicio del nombre. La versin NASM es ligeramente diferente bsicamente porque no podemos poner "$" de final de cadena al bfer puesto que est en la seccin bss, por lo que debemos hacerlo manualmente (revsese porque es otra forma de hacer esto mismo).

7.1.1.4. SCAS
Significado Sintaxis Accin byte word SCAn String element=Busca elemento de cadena SCAS, SCASB, SCASW CMP AL,byte ptr [ES:DI], DI=DI+1 CMP AX,word ptr [ES:DI];DI=DI+2 OF, SF, ZF, AF, PF, CF

Modo de direccionamiento implcito Banderas modificadas Realiza la bsqueda del valor de AL o AX a partir de la direccin [ES:DI]. Tabla 07-04 - SCAS SCASCM1 SCASCF1 SCASCN1 Resultado en pantalla Cdigo [bin] Cdigo [bin] Cdigo [bin]
C:\Trabajo\AOE\Codigos\Cap07>SCASCM1 V esta en la posicion 9 en Alfonso Victor Caballero Hurtado

Source 07-04 - Encuentra un caracter dentro de una cadena de caracteres En AL metemos el valor a buscar "V" dentro de la cadena apuntada por ES:DI. En esta ocasin utilizamos el prefijo REPNE delante de SCASB para construir el bucle, como sabemos, la diferencia entre REP y REPNE es que el primero slo termina cuando CX=0 y el segundo termina cuando CX=0 cuando ZF=1.

7.1.1.5. CMPS
Significado Sintaxis byte Accin Modo de word COMPare String element=Comparar elemento de cadena LODS, LODSB, LODSW CMP byte ptr [DS:SI],byte ptr [ES:DI], SI=SI+1, DI=DI+1 CMP word ptr [DS:SI],word ptr [ES:DI]; SI=SI+2, DI=DI+2 implcito

direccionamiento Banderas modificadas OF, SF, ZF, AF, PF, CF Realiza la bsqueda del valor del byte de [DS:SI] a partir de la direccin [ES:DI]. Tabla 07-05 - CMPS CMPSCM1 CMPSCF1 CMPSCN1 Resultado en pantalla Cdigo [bin] Cdigo [bin] Cdigo [bin]
; C:\Trabajo\AOE\Codigos\Cap07>CMPSCN1 ; Alfonso Victor Caballero Hurtado es igual a Alfonso Victor Caballero Hurtado

Source 07-05 - Compara dos cadenas de caracteres En esta ocasin comparamos dos cadenas enteras, para ello formamos un bucle con REPZ que se repite mientras CX>0 y ZF=1 y CMPSB compara los bytes apuntados por DS:SI y ES:DI.

7.1.1.6. XLAT
Significado Sintaxis Accin byte word implcito Ninguna Table Look-up Translation=Traduccin tabla look-up XLAT, XLATB AL=byte ptr [DS:BX]+AL

Modo de direccionamiento Banderas modificadas

BX se utiliza como puntero al origen de la tabla en memoria que utiliza XLAT y AL como ndice de desplazamiento dentro de sta, tal que sumada a BX alcanza el valor que se ingresar en AL. Tabla 07-06 - XLAT XLATCM1 Cdigo XLATCF1 Cdigo XLATCN1 Cdigo Resultado en pantalla

[bin] [bin] [bin] Source 07-06 - Convierte un nmero ASCII a BCD desempaquetado Este programa traduce un nmero en formato ASCII a BCD desempaquetado, para ello definimos una tabla traductora XLATtab donde los 30h primeros bytes son morralla. Con LODSB cargamos los bytes de NumASCII apuntado por SI en AL, con XLATB nos posicionamos en XLATtab apuntado por BX y saltamos AL bytes, el valor al que llegamos lo almacenamos en AL. Con STOSB guardamos AL en Buffer apuntado por DI.

7.1.1.7. Bsqueda de cadenas


InSTRCM1 InSTRCF1 InSTRCN1 Resultado en pantalla Cdigo Cdigo Cdigo
C:\Trabajo\AOE\Codigos\Cap07>InStrCM1

[bin]

[bin]

alfonso fue encontrado en la posicion 19h [bin] Source 07-07 - Buscamos una cadena dentro de otra

Buscamos la cadena "alfonso" dentro de la frase "el alfil del ajedrez de alfonso victor". Los caracteres "$" situados al final de cada uno de ellos es para poder imprimirlos mejor, pero en la longitud del texto no se cuenta. El procedimiento que hace la bsqueda se llama "EnCadena" que trabaja en dos pasos: empieza buscando la primera ocurrencia de la primera letra de "Cadena" dentro de "Texto", si no la encuentra hemos acabado y si la halla busca las siguientes letras de "Cadena" correlativamente en "Texto", si no estn todas volvemos a empezar hasta que hayamos consumido la longitud de "Texto". Si hubo xito, la bandera de cero est nula y AX contiene la posicin en "Texto" donde se encontr "Cadena". Si fracas la bsqueda devuelve la bandera de cero activada. Obsrvese que 19h = 25d. Adems hemos usado por primera vez una rutina para imprimir en pantalla nmeros hexadecimales, en este caso de tamao byte.

7.1.1.8. Reemplazar cadenas


RpSTRCM1 RpSTRCF1 RpSTRCN1 Resultado en pantalla Cdigo Cdigo Cdigo
C:\Trabajo\AOE\Codigos\Cap07>RpStrCN1 Romance: que por mayo era por mayo cuando hace la calor, cuando los trigos... Romance: que por enero era por enero cuando hace la calor, cuando los trigos...

[bin]

[bin]

[bin]

Source 07-08 - Reemplazamos una cadena dentro de otra Aprovechando el cdigo anterior, creamos uno nuevo que busca todas las ocurrencias de "mayo" en el extracto del romance del prisionero cambindolo por "enero".