Bienvenido: Ingresar
location: Diferencias para "WebHome/TrabajosPracticos/PracticoASM3"
Diferencias entre las revisiones 1 y 4 (abarca 3 versiones)
Versión 1 con fecha 2012-05-15 17:15:31
Tamaño: 65
Comentario:
Versión 4 con fecha 2012-05-15 20:53:24
Tamaño: 5154
Comentario:
Los textos eliminados se marcan así. Los textos añadidos se marcan así.
Línea 1: Línea 1:
Escribe acerca de WebHome/TrabajosPracticos/PracticoASM3 aquí. = 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 [[attachment:suma64_ex1.s|ex1.s]]

===== Ejercicio 2 =====
Usando instrucciones Shift ingresar un número en AX y multiplicarlo por 7

archivo fuente [[attachment:shift_ex1.s|ex1.s]]

===== Ejercicio 3 =====
Salvar al los registros AX y BX, luego borrar los mismos para finalmente recuperar los datos del Stack

archivo fuente [[attachment:stack_ex1.s|ex1.s]]

===== Ejercicio 4 =====
Dividir AX por 7 y Multiplicar BX por 23

archivo fuente [[attachment:mul_ex1.s|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 [[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.

===== 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.

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.

UntitledWiki: WebHome/TrabajosPracticos/PracticoASM3 (última edición 2012-08-22 18:43:04 efectuada por GuillermoSteiner)