INSTTUTO TECNOLOGICO DE APIZACO

Slides:



Advertisements
Presentaciones similares
Laboratorio Lenguaje de Programación ING2101
Advertisements

Instrucciones de operación sobre datos
DATSI, FI, UPM José M. Peña Programación en C DATSI, FI, UPM José M. Peña Programación en C.
Compiladores e intérpretes
TEMA 2 Arquitectura de un Ordenador
Estructuras de Decisión I IF - THEN - ELSE
Estructuras de decisión en C
Funciones y recursividad
MANUAL EXPRESS DE C J.M.sevilla.
PHP-MYSQL OPERADORES EN PHP
Estructuras de control
Fundamentos de la Programación Estructurada
INTRODUCCION A LOS ALGORITMOS (Conceptos previos)
SEMANA 9_2.
DIAGRAMAS DE FLUJO Y PSEUDOCÓDIGO
FUNCIONES EN C.
Introducción a la programación
3. INTRODUCCIÓN A LA PROGRAMACIÓN
TC2015 Prof. Msc. Ivan Alejandro Escobar Broitman
Una breve introducción
Ingeniero Anyelo Quintero
VISUAL BASIC CONSOLA Todas las ordenes o instrucciones se digitan dentro de sub Main() y End Sub ÁREA DE TRABAJO: Las aplicaciones de consola son aquellas.
TEMA 6: DIVISIÓN DE POLINOMIOS
Organización y Estructura del Computador 1
Funciones y procedimientos
FUNCIONES EN C.
Subrutinas.
Asignatura: Computadores
Ingeniero Anyelo Quintero
Lenguaje Ensamblador integrantes: Esthela Vianey Vázquez Medina No.30
ISA (Instruction Set Architecture)
Archivos Programación.
Programación de Computadores
Lenguaje C.
MIPS Intermedio.
2.2 Registro de Banderas Conjunto de bits que nos dan información sobre el estado del procesador y sobre el resultado de la última operación efectuada.
Semana 5 Subprogramas..
Características de “C”
Características de “C” Y Esta conformado por un Ambiente Integrado. Y Es un Lenguaje de Nivel medio. Y Es un compilador. YContiene un conjunto de palabras.
FUNCIONES EN C.
© Prof. José Mª Foces Morán PCSpim: SPIM sobre Windows Ventana principal de PCSpim Consola: permite interactuar con el programa que está siendo.
DIVISIÓN DE POLINOMIOS 1
CI TEORIA semana 4 Estructura Algorítmica: SELECCIÓN
LENGUAJES DE PROGRAMACIÓN
SENTENCIAS DE CONTROL Ing. José Antonio Poma G..
PHP TODO SOBRE PHP.
ARQUITECTURA DE COMPUTADORES Semestre A-2009 Clase 13.
Juego de Preguntas y Respuestas
Unidad I: Registros e Interrupciones Facilitador: Ing. Eduardo Brando.
A este registro se le conoce también como registro de estado. Consta de 16 bits y únicamente 9 de ellos contiene información, indican el estado de la.
introducción al Lenguaje Ensamblador
While En este ciclo el cuerpo de instrucciones se ejecuta mientras una condición permanezca como verdadera en el momento en que la condición se convierte.
SEMANA 01_2.
INTRODUCCION A LA PROGRAMACION

introducción al Lenguaje Ensamblador
Práctica Profesional PHP.
Es un tipo especial de software que nos permite *Crear *Desarrollar *Programar otras aplicaciones. Haciendo uso de sus conocimientos lógicos y lenguajes.
CLASE 10. AGENDA 1 Repaso 2 Operadores 3 Directivas 14 Entrada y Salida de Datos.
Manual PHP Básico Camilo Cartagena.
División de un polinomio entre otro polinomio
Funciones Copyright © 2005 Unidad 1. Copyright © 2005 Objetivos del Aprendizaje Explicar la naturaleza y usos de las funciones. Describir algunas funciones.
PROGRAMACIÓN Grupo de Modelamiento de Sistemas
El microprocesador y su arquitectura
Lenguaje ensamblador Conceptos introductorios. Formatos de Instrucción. Modos de Direccionamiento. Conjunto de instrucciones básico. Introducción al Lenguaje.
MAXIMO COMUN DIVISOR. En matemáticas, se define el máximo común divisor(MCD) de dos o más números enteros al mayor número entero que los divide sin dejar.
Lenguaje ensamblador Resumen en diapositivas
Este material ha sido desarrollado para alumnos que cursan la asignatura de Programación Básica impartida en el primer semestre en la Facultad de Ingeniería.
MÁXIMO COMÚN DIVISOR  En matemáticas, se define el máximo común divisor(MCD) de dos o más números enteros al mayor número entero que los divide sin dejar.
Omar Herrera Caamal Rigoberto Lizárraga Luis Cetina Luna.
Transcripción de la presentación:

INSTTUTO TECNOLOGICO DE APIZACO ENSAMBLADOR X86: NUMERO PRIMO

INTRODUCCION Este pequeño ejercicio de ensamblador es para las arquitecturas x86 (procesador Intel y Amd 32 bits) y utiliza la sintaxis de Nasm, un ensamblador libre, gratuito y que puede ser utilizado en diferentes plataformas como Windows y Linux. Las funciones externas utilizadas son sacadas de la biblioteca C estándar. De este modo no tendrás problemas ligados a la maquina que utilizas para hacer este ejercicio: no depende del sistema operativo utilizado. Únicamente depende de la arquitectura x86.

NOCIONES ABORDADAS EN ESTE EJERCICIO. Las funciones con parámetro de entrada y valor de salida Las instrucciones de salto (jmp, jz/je etc...) La aritmética teniendo cuenta del tipo de variable (con signo, sin signo) La división

ENUNCIADO El objetivo es escribir una función en ensamblador capaz de determinar si un entero sin signo es un número primo o no. Habrá un solo parámetro de entrada de tipo entero sin signo que representará el número a testear. El valor de retorno deber ser 1 si el número es primo o 0 si no es primo.

ENUNCIADO Esto seria lo que daría esta función en C: int es_primo(unsigned int n); //El modelo de esta función //Ejemplo de uso: unsigned int nb = 3; if (es_primo(nb) == 1){ printf("El numero %d es primo!, nb); } Será necesario insertar este código: extern printf, scanf seccion .data ingresar db 'Ingrese un numero!', 0xa, 0x0 sí db 'C es un numero primo', 0xa, 0x0 no db 'No es un numero primo', 0xa, 0x0 format_d db '%d', 0x0 seccion .text global main es_primo: ;Inserte el código aquí! main: push ebp mov ebp, esp ;

ENUNCIADO Dejamos espacio para un entero en la pila ;El que ingresaremos con scanf sub esp, 4 ;Frase de bienvenida push ingresar call printf add esp, 4 ;Solicitamos al usuario ingresar un numero push esp ;Direccion del entero push format_d ; %d call scanf add esp, 8 ;Llamamos a nuestra función con el entero ingresado push dword [esp] call es_primo ;Probamos el retorno (eax == 0 ?) test eax, eax ;Si es igual a cero => no es primo jz noPrimo ;Si no push sí call printf ;Vamos al final de la función para no ;ingresar en la sección noPrimo jmp quit noPrimo: push no call printf quit: leave ret

PARA RECORAR Un número primo es un número que puede ser dividido únicamente por él mismo o por 1. Si es dividido por otro numero, el resto de la división no será igual a 0. Los saltos condicionales no son los mismos para números con signo que para números sin signo. Lo mismo para los operadores de multiplicación/división. El valor de retorno de una función se coloca en el registro eax

EXPLICACON El algoritmo utilizado en esta solución es bastante simple, así no lo parezca, una vez traducido en el ensamblador (al igual que con casi todos los algoritmos en ensamblador). Esto es lo que hemos hecho. Partimos del principio que nuestro numero n es primo. Dividimos sucesivamente n entre todos los números menores a n hasta el número 2 incluido. Si es divisible por alguno de estos números (es decir su resto es igual a cero), entonces paramos el test y concluimos que nuestro numero no es primo. Si nuestro numero es desde un inicio menor o igual a 2, no hacemos ningún test y decimos que es primo.

EXPLICACION Esquemáticamente está es nuestra idea: Funcion es_primo (n: entero sin signo) : entero divisor = n primo = 1 Mientras n <= 2 Hacer divisor = divisor - 1 resto = n mod divisor Si resto == 0 Entonces primo = 0 salir del bucle FinSi FinMientras Fin devolver primo

EXPLICACION Para ello utilizamos la instrucción div que divide eax entre un registro dado como parámetro, en este caso es ecx que es nuestro divisor y que es restado en cada test. Es una división para números sin signo (si no utilizar idiv). El cociente se coloca en eax (nuestro numero n, recargado en cada pasada en la bucle) y el resto es colocado en edx. Únicamente tenemos que testear el resto. Este bucle de divisiones está situado bajo la etiqueta “divisiones”. Este es un algoritmo que podría ser optimizado, pero no es el objetivo aquí…después de todo no son los números primos que nos interesan sino el ensamblador.