lunes, 17 de diciembre de 2018

NASM

NASM(The Netwide Assembler)

Es un  ensamblador libre  x80x86 y x86-64 diseñado para tener potabilidad, modularidad, es potable para cualquier sistema operativo y de fácil uso, debido a que esta diseñado para ser simple de usar.

Ejemplo de código ensamblador para obtener los números primos de un rango especifico

%include "asm_io.inc"
segment .data
Message db "Halle primos hasta: ", 0

segment .bss
Limit resd 1 ; halle primos hasta este l´ımite
Guess resd 1 ; la conjetura actual para el primo

segment .text
 global _asm_main
 _asm_main:
 enter 0,0 ; rutina de inicio
 pusha

 mov eax, Message
 call print_string
 call read_int ; scanf("%u", & limit );
 mov [Limit], eax

 mov eax, 2 ; printf("2\n");
 call print_int
 call print_nl
 mov eax, 3 ; printf("3\n");
 call print_int
 call print_nl

 mov dword [Guess], 5 ; Guess = 5;
 while_limit: ; while ( Guess <= Limit )
 mov eax,[Guess]
 cmp eax, [Limit]
 jnbe end_while_limit ; use jnbe ya que los n´umeros son sin signo

 mov ebx, 3 ; ebx is factor = 3;
 while_factor:
 mov eax,ebx
 mul eax ; edx:eax = eax*eax
 jo end_while_factor ; Si la respuesta no cabe en eax
 cmp eax, [Guess]
 jnb end_while_factor ; if !(factor*factor < guess)
 mov eax,[Guess]
 mov edx,0
 div ebx ; edx = edx:eax % ebx
 cmp edx, 0
 je end_while_factor ; if !(guess % factor != 0)

 add ebx,2 ; factor += 2;
 jmp while_factor
 end_while_factor:
 je end_if ; if !(guess % factor != 0)
 mov eax,[Guess] ; printf("%u\n")

 call print_int
 call print_nl
 end_if:
 add dword [Guess], 2 ; guess += 2
 jmp while_limit
 end_while_limit:

 popa
 mov eax, 0 ; retorna a C
 leave
 ret

Para compilar en windows haga uso de los siguientes comandos:
nasm -f prime.asm  
gcc -o prime prime.obj driver.c asm_io.obj 
prime.exe

El primer comando generara el archivo objeto en formato .obj para windows en caso de ser linux use -coff
El segundo comando enlaza los objetos para generar un ejecutable, note que antes de ejecutar el comando debe ya contar con el archivo drivers.c y asm_io.obj, los cuales se obtienen de los links mencionados en las referencias.


referencias:
https://es.wikipedia.org/wiki/Netwide_Assembler
Libro Lenguaje Ensamblador para PC
Paul A. Carter
18 de octubre de 2006
Recursos en Internet mencionados en el libro
Pagina del autor http://www.drpaulcarter.com/
Pagina de NASM en SourceForge http://sourceforge.net/projects/nasm/
DJGPP http://www.delorie.com/djgpp
Ensamblador con Linux http://www.linuxassembly.org/
The Art of Assembly http://webster.cs.ucr.edu/
USENET comp.lang.asm.x86
Documentación de Intel http://developer.intel.com/design/Pentium4/documentation.htm

No hay comentarios: