1 / 10

INSTTUTO TECNOLOGICO DE APIZACO

INSTTUTO TECNOLOGICO DE APIZACO. ENSAMBLADOR X86: NUMERO PRIMO. INTRODUCCION.

Download Presentation

INSTTUTO TECNOLOGICO DE APIZACO

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. INSTTUTOTECNOLOGICODEAPIZACO ENSAMBLADOR X86: NUMERO PRIMO

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

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

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

  5. ENUNCIADO • Esto seria lo que daría esta función en C: intes_primo(unsignedint n); //El modelo de esta función //Ejemplo de uso: unsignedintnb = 3; if (es_primo(nb) == 1){ printf("El numero %d es primo!, nb); }Será necesario insertar este código: externprintf, scanfseccion .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_ddb '%d', 0x0 seccion .text global maines_primo: ;Inserte el código aquí! main: pushebpmovebp, esp;

  6. ENUNCIADO • Dejamos espacio para un entero en la pila ;El que ingresaremos con scanf sub esp, 4 ;Frase de bienvenida push ingresar callprintfaddesp, 4 ;Solicitamos al usuario ingresar un numero pushesp ;Direccion del entero pushformat_d ; %d callscanfaddesp, 8 ;Llamamos a nuestra función con el entero ingresado pushdword [esp] calles_primo ;Probamos el retorno (eax == 0 ?) test eax, eax ;Si es igual a cero => no es primo jznoPrimo ;Si no push sí callprintf ;Vamos al final de la función para no ;ingresar en la sección noPrimojmpquitnoPrimo: push no callprintfquit: leaveret

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

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

  9. EXPLICACION • Esquemáticamente está es nuestra idea: Funciones_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 FinSiFinMientras Fin devolver primo

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

More Related