Tamaño: 11102
Comentario:
|
Tamaño: 5154
Comentario:
|
Los textos eliminados se marcan así. | Los textos añadidos se marcan así. |
Línea 76: | Línea 76: |
Realizar un programa que analizando un bit en el registro r3 active una alarma si este bit es 0, el nro de bit a analizar está guardado en el registro r4, la alarma se activa escribiendo un 1 en el bit 16 de r6 | Usando instrucciones Shift ingresar un número en AX y multiplicarlo por 7 |
Línea 78: | Línea 78: |
archivo fuente [[attachment:alarma_s_ex1.s|ex1.s]] archivo fuente [[attachment:alarma_ex1.s|ex1.s]] |
archivo fuente [[attachment:shift_ex1.s|ex1.s]] |
Línea 83: | Línea 81: |
Realizar una serie de subrutinas que realizen diferentes comparaciones, devolviendo r0 = 0 si estas comparaciones fueron falsas y r0<>0 si fueron verdaderas, las comparaciones son las siguientes | Salvar al los registros AX y BX, luego borrar los mismos para finalmente recuperar los datos del Stack |
Línea 85: | Línea 83: |
* r1<100 y r1>20 * r1<100 o r2>20 * r1 = 10 o r1 = 15 o r1 = 20 * r1 = 10 y r2 = 15 y r3 = 20 archivo fuente [[attachment:compara_ex1.s|ex1.s]] |
archivo fuente [[attachment:stack_ex1.s|ex1.s]] |
Línea 93: | Línea 86: |
Realizar un programa que dado un numero guardado en R1 lo multiplique por 10, de dos formas distintas, usando la instrucción mul y por corrimiento | Dividir AX por 7 y Multiplicar BX por 23 |
Línea 95: | Línea 88: |
archivo fuente [[attachment:multip_ex1.s|ex1.s]] | archivo fuente [[attachment:mul_ex1.s|ex1.s]] |
Línea 98: | Línea 91: |
Realizar un programa que dado un numero guardado en R1 y otro en R2, calcule el resultado de elevar R1 a la potencia de R2 y guardar el resultado en R3 (R3 = R1^R2) | Realizar un programa que: dado un vector de byte ya cargado, busque el final del mismo (byte = 0h) y termine dejando en EBX la longitud del mismo. |
Línea 100: | Línea 94: |
archivo fuente [[attachment:potencia_ex1.s|ex1.s]] | archivo fuente [[attachment:cad_ex1.s|ex1.s]] ===== Ejercicio 5 ===== Realizar un programa que: dado un vector de byte ya cargado de 10 elementos, sume los mismos y termine con el resultado de la suma en AX. archivo fuente [[attachment:sumv_ex1.s|ex1.s]] ==== Práctico de Aula no Desarrollados ==== ===== Ejercicio 1 ===== Realizar un programa ejemplo para cada tipo de direccionamiento, este programa ejemplo debe sumar dos números. *Direccionamiento por registro. *Direccionamiento inmediato. *Direccionamiento directo. *Direccionamiento base más índice. *Direccionamiento relativo por registro. *Direccionamiento relativo base más índice. ===== Ejercicio 2 ===== Realizar un programa que dada dos variables word previamente cargadas con sendos numero con signo, realice la suma de las mismas y la resta, el tamaño del resultado deben ser tal que no puedan producirse desborde cualquiera sean los números a sumar o restar. (Cuando nos referimos a una cadena o variable previamente cargada, significa que en el momento en que declaran el vector o variable en el programa se ingresan los valores, como en el caso de los ejercicios resueltos 4 y 5) ===== Ejercicio 3 ===== Realizar un programa que mediante corrimiento divida por 8 un número con signo previamente cargado en una variable word. (Explicar que instrucción uso para el corrimiento y porque) ===== Ejercicio 4 ===== Usando únicamente las instrucciones de corrimiento y rotación, realice la multiplicación de un número previamente cargado en el acumulador AX por 0Bh, sabiendo que el resultado no será mayor a 16 bits, realice el mismo ejemplo con la función de multiplicación MUL, calcule cuantos ciclos de reloj utiliza cada procedimiento. ===== Ejercicio 5 ===== Realizar un programa que mediante corrimiento cuente la cantidad de unos que hay en una cadena de 4 bytes previamente cargada, el resultado debe quedar en AL. |
Línea 103: | Línea 138: |
Realizar un programa que dada una cadena con terminación nula guardada en VECT, la pase a mayúscula, guardando el resultado en el mismo vector VECT nota:la cadena de entrada solo contendrá valores alfabéticos o espacio en blanco ('a' - 'z','A' - 'Z') archivo fuente [[attachment:cadena_ex1.s|ex1.s]] ===== Ejercicio 7 ===== Realizar un programa que dado un vector de 16 halfword con signos, guarde en R1 el resultado de su promedio archivo fuente [[attachment:promedio_ex1.s|ex1.s]] ===== Ejercicio 8 ===== Realizar un programa que sume los word de un vector VECTW sin signo en las posiciones indicadas por un segundo vector VECTB de 20 byte,el resultado guardarlo en R1 ejemplo VECTB = 1,3,2,0,2...... VECTW = 1,111,222,333,444,555,666,...... se suman 111+333+222+1+222... archivo fuente [[attachment:punt_ex1.s|ex1.s]] ===== Ejercicio 9 ===== Dado un vector de 16 words con signo, realizar un programa que encuentre el elemento del vector mas cercano a la media del mismo. archivo fuente ex1.s ===== Ejercicio 10 ===== Dada una cadena de caracteres con terminación nula la cual contiene palabras separadas por espacio, realizar un programa que pase a minúscula todas las letras con excepción de la primera de cada palabra que deberá ser pasada a mayúscula, además, las palabras de menos de 3 letras deberán quedar en minúscula ejemplo entrada VECT = "El mUndo dE Hoy",0 salida VECT = "el Mundo de Hoy",0 archivo fuente [[attachment:may_min_ex1.s|ex1.s]] ===== Ejercicio 11 ===== Se debe realizar un programa que calcule de los 100 primeros números naturales cuales son primos usando el método de la "Criba de Eratóstenes". El método se resume en estos pasos: * se carga un vector de 99 elementos con los números naturales del 2 hasta 100 * se comienza por el numero 2, lo dejamos y eliminamos a partir de allí todos los números múltiplo de 2 * luego nos corremos hasta el próximo número no borrado ( en este caso el 3) y eliminamos todos los múltiplos de 3 * el siguiente numero sin eliminar será el 5, lo dejamos y eliminamos todos los múltiplos de 5 * así vamos avanzando, cuando llegamos a un número que no ha sido eliminado lo dejamos y a partir de allí eliminamos los múltiplos de él Al final copiamos a un nuevo vector todos los números no eliminados. archivo fuente [[attachment:criba_ex1.s|ex1.s]] ===== Ejercicio 12 ===== Se debe realizar un programa que invierta la posición de las letras en cada una de las palabras guardadas en un vector. Las características de este vector a tener en cuenta son: * Las palabras en el mismo están separadas por uno o varios espacios. * No existen signos de puntuación. * El vector termina con nulo. ejemplo vec1 = " Las palabras en el mismo están separadas por uno o varios espacios ",0 resultado vec1 = " saL sarbalap ne le omsim nátse sadarapes rop onu o soirav soicapse ",0 archivo fuente [[attachment:may_min_ex1.s|ex1.s]] ===== Ejercicio 13 ===== Partiendo de una cadena de caracteres y 10 vectores de 10 punteros cada uno, se pide realizar un programa que guarde en esos vectores las palabras encontradas en la cadena de la siguiente forma: En el primer vector todas las palabras que tengan menos de 3 letras, luego en el segundo las que tengan 4 letras, en el próximo 5, hasta llegar al décimo vector, donde se guardarán aquellas que tengan mas de 11 letras. En caso de poseer mas de 10 palabras de una clase, no se guardarán. Nota: no es necesario guardar las palabras en otro vector, simplemente con guardar el puntero de comienzo de la palabra y luego cambiar el espacio que separa esta de la próxima por Nulo es suficiente. archivo fuente ex1.s ===== Ejercicio 14 ===== Dada una cadena de bytes sin signo de terminación nula, por cada elemento de esta cadena se sacará el promedio del mismo con los tres bytes anteriores guardando este valor en una segunda cadena en la posición correspondiente. La excepción a esta regla son los tres primeros valores que son guardados directamente en la segunda cadena sin calculo de promedio. Ejemplo cadena1 = 2,14,7,8,9,2,.......,0 salida cadena2 = 2,14,7,7,9,6 donde 2 <- 2, 14 <- 14, 7 <- 7, 7 <- prom(2+14+7+8), 9 <- prom(14+7+8+9), 6 <- prom(7+8+9+2) archivo fuente [[attachment:prom_vector_ex1.s|ex1.s]] ===== Ejercicio 15 ===== Una cadena de caracteres debe se encriptada, para ello se utilizará un método muy básico, el cual consiste en sumar al código ascii de cada letra en la cadena a encriptar el código ascii del caracter correspondiente de una clave, cada vez que se alcanza el final de esta, se vuelve a comenzar con su primer caracter. Ejemplo aencrip = 'h','o','l','a',' ','m','u','n','d','o',0 clave = 'f','1','2',0 resultado = 'h'+'f' , 'o'+'1' , 'l'+'2' , 'a'+'f' , ' '+'1' , 'm'+'2' , 'u'+'f' , 'n'+'1' , 'd'+'2' , 'o'+'f' archivo fuente [[attachment:clave_ex1.s|ex1.s]] ===== Ejercicio 16 ===== En un vector de caracteres, el cual posee solo palabras separadas por espacios, se debe buscar la palabra mas larga, luego, formar otro vector con las mismas palabras con el agregado a cada una de n caracteres '_' donde n es la diferencia entre la palabra mas larga y la palabra actual ejemplo {{{ entrada = "igualar el largo de las palabras",0 salida = "igualar_ el______ largo___ de______ las_____ palabras",0 }}} archivo fuente ex1.s ===== Ejercicio 17 ===== Realizar un programa que elimine de un vector de byte sin signo previamente cargado, los números múltiplos de 4. El vector se denomina vec1 y termina con 0 ejemplo {{{ entrada en vec1 = 80,5,6,18,4,5,20,19,0 salida en vec1 = 5,6,18,5,19,0 }}} archivo fuente ex1.s ===== Ejercicio 18 ===== Dado dos vectores previamente cargado de caracteres alfanuméricos (letras mayúsculas y minúsculas del alfabeto ingles, espacios y números) y terminación nula, desarrollar un programa que copie del vector 1 a un nuevo vector 3 donde se insertará por cada caracter que coincida con el primer caracter del vector 2 (COMPARACIÓN CASE INSENSITIVE) el propio vector 2 (sin su primer caracter) Ejemplo {{{ Entrada vector1 = "insertar en 1 la palabra 1" vector2 = "1mundo" Salida vector3 = "insertar en mundo la palabra mundo" }}} archivo fuente [[attachment:inspalabra_ex1.s|ex1.s]] ===== Ejercicio 19 ===== Dado dos vectores previamente cargados de caracteres alfanuméricos (letras mayúsculas y minúsculas del alfabeto ingles, espacios y números) y terminación nula, desarrollar un programa que cuente la cantidad de veces que el vector 2 se repite en el vector 1. Ejemplo {{{ Entrada vector1 = "esto es una prueba de palabras repetidas" vector2 = "es" Salida cantidad = 2 }}} archivo fuente [[attachment:contarrep_ex1.s|ex1.s]] ===== Ejercicio 20 ===== Dado un vector previamente cargado de caracteres alfanuméricos (letras mayúsculas y minúsculas del alfabeto ingles, espacios y números) y terminación nula, desarrollar un programa que por cada carácter verifique cuantos caracteres a continuación están repetidos, se dispone para guardar los datos de dos vectores, uno donde se dispone el carácter (tipo byte) y en otro la cantidad de repeticiones de ese carácter (tipo halfword). Ejemplo {{{ Entrada vector = "fssdffjlllleiiiilv4" Salida letras = 'f','s','d','f','j','l','e','i','l','v','4' cantidad = 1 , 2 , 1 , 2 , 1 , 4 , 1 , 4 , 1 , 1 , 1 }}} archivo fuente [[attachment:contarletrasrep_ex1.s|ex1.s]] |
Realizar un programa que: Divida por 10 a cada elemento de un vector de Word previamente cargado, el vector no tiene longitud definida, se debe dividir hasta encontrar un 0h, los resultado se guardan en el mismo vector y deberá ser Word para evitar sobreflujo, el resto de la división de descarta. |
Trabajo Práctico Nro.4 Assembler
Este práctico, tiene como objetivo ejercitarse en la programación del assembler del x86, como así también conocer las herramientas necesarias para resolver las diferentes instancias de un proyecto (Escritura del código, compilación, enlace y simulación).
Para la realización de los prácticos en esta primera etapa, utilizaremos el mismo nombre del archivo fuente y el de los archivos en binario, distinguiendo a cada ejemplo o ejercicio por el nombre del directorio que utilizamos.
Tendremos entonces, dentro del directorio de cada ejercicio los siguientes archivo:
Archivo de entrada
ex1.s archivo en texto del programa en assembler
Este archivo está constituido por un encabezado que es fijo para todos los ejemplos
.intel_syntax noprefix .file "ex1.s" # secciones .section .data # variables # PROGRAMA .section .text .global _start _start: ...... ...... int 0x80 .end
Archivos de salida
ex1.o archivo objeto
ex1 archivo ejecutable
Compilar y Enlazar
Para compilar deberemos utilizar el compilador de assembler provisto por las binutils denominado as
as --gstabs -o ex1.o ex1.s
en este caso generaremos un archivo objeto denominado ex1.o Luego para enlazar usaremos el ld de la forma
ld -o ex1 ex1.o
finalmente, creamos un archivo ex1, el cual será nuestro proyecto ya enlazado y listo para correr
Debug y simulación
Al terminar de compilar un proyecto y al no disponer ninguna salida en los primeros ejercicios, recurrimos al gdb como herramienta para ver como funciona el programa recién creado La herramienta gdb puede correr sola invocando directamente
gdb ex1
o por medio de una interfaz grafica, para esto instalamo la aplicación kdbg y luego llamando a esta herramienta como
kdbg ex1
Ejercicios
Ejercicio 1
Sumar 2 nro de 32 bits contenidos en AX BX y CX DX respectivamente, guardando el resultado en AX BX. AX BX = 0134A23Bh CX DX = BD02E329h
Resultado
AX BX = BE378564 (Resultado)
archivo fuente ex1.s
Ejercicio 2
Usando instrucciones Shift ingresar un número en AX y multiplicarlo por 7
archivo fuente ex1.s
Ejercicio 3
Salvar al los registros AX y BX, luego borrar los mismos para finalmente recuperar los datos del Stack
archivo fuente ex1.s
Ejercicio 4
Dividir AX por 7 y Multiplicar BX por 23
archivo fuente ex1.s
Ejercicio 5
Realizar un programa que: dado un vector de byte ya cargado, busque el final del mismo (byte = 0h) y termine dejando en EBX la longitud del mismo.
archivo fuente ex1.s
Ejercicio 5
Realizar un programa que: dado un vector de byte ya cargado de 10 elementos, sume los mismos y termine con el resultado de la suma en AX.
archivo fuente ex1.s
Práctico de Aula no Desarrollados
Ejercicio 1
Realizar un programa ejemplo para cada tipo de direccionamiento, este programa ejemplo debe sumar dos números.
- Direccionamiento por registro.
- Direccionamiento inmediato.
- Direccionamiento directo.
- Direccionamiento base más índice.
- Direccionamiento relativo por registro.
- Direccionamiento relativo base más índice.
Ejercicio 2
Realizar un programa que dada dos variables word previamente cargadas con sendos numero con signo, realice la suma de las mismas y la resta, el tamaño del resultado deben ser tal que no puedan producirse desborde cualquiera sean los números a sumar o restar. (Cuando nos referimos a una cadena o variable previamente cargada, significa que en el momento en que declaran el vector o variable en el programa se ingresan los valores, como en el caso de los ejercicios resueltos 4 y 5)
Ejercicio 3
Realizar un programa que mediante corrimiento divida por 8 un número con signo previamente cargado en una variable word. (Explicar que instrucción uso para el corrimiento y porque)
Ejercicio 4
Usando únicamente las instrucciones de corrimiento y rotación, realice la multiplicación de un número previamente cargado en el acumulador AX por 0Bh, sabiendo que el resultado no será mayor a 16 bits, realice el mismo ejemplo con la función de multiplicación MUL, calcule cuantos ciclos de reloj utiliza cada procedimiento.
Ejercicio 5
Realizar un programa que mediante corrimiento cuente la cantidad de unos que hay en una cadena de 4 bytes previamente cargada, el resultado debe quedar en AL.
Ejercicio 6
Realizar un programa que: Divida por 10 a cada elemento de un vector de Word previamente cargado, el vector no tiene longitud definida, se debe dividir hasta encontrar un 0h, los resultado se guardan en el mismo vector y deberá ser Word para evitar sobreflujo, el resto de la división de descarta.