Algunos en ensamblador
; basado en el siguiente código de alto nivel
;_________________________________________________________________
; if ((anio % 4 == 0) && ((anio % 100 != 0) || (anio % 400 == 0)))
; System.out.println("El año es bisiesto");
; else
; System.out.println("El año no es bisiesto");;_________________________________________________________________
;
; Usando Linux y gcc:
; nasm -f elf bis.asm
; gcc -o bis bis.o driver.c asm_io.o
;
%include "asm_io.inc"
;
; inicializamos segmentos de datos
;
segment .data
;
; referencias de mensajes
;
prompt1 db "Este programa te dice si tu año es bisiesto, introduce tu año: ", 0 ;
outmsg1 db "Tu año es bisiesto. ", 0
outmsg2 db "Tu año noes bisiesto.", 0
segment .bss
;
; Segmentos no inicializados
;
input1 resd 1
;
; código del segment .text
;
segment .text
global asm_main
asm_main:
enter 0,0 ; declaramos pila e inicializamos variables en 0
pusha ; empujamos datos a la pila
mov eax, prompt1 ; mueve primer mensaje desalida a eax
call print_string ; pinta primer mensaje
call read_int ; lee entero
mov [input1], eax ; guarda año en input1
cdq ; prepara edx para capturar residuo
mov ecx, 4 ; mueve a ecx 4 para primer condición
idiv ecx ; divide eax/ecx guarda en eax el cociente y en ebx el residuo
cmp edx, 0 ; comparaedx con 0
je and ; si el residuo es 0 salta a and
mov eax, outmsg2 ; mueve a eax el resultado 2
call print_string ; pinta el resultado 2
call print_nl ; brinca de linea
jmp next ; salto a fin para que no ponga todos los mensajes
and:
; aqui saltó si el resultado fue 0
mov eax, [input1] ; mete en eax año
mov ecx,100 ; mueve a ecx 100 para segunda condición
cdq ; prepara edx para capturar residuo
idiv ecx ; divide eax/ecx guarda en eax el cociente y en ebx el residuo
cmp edx, 0 ; compara edx con 0
jne bis ; si edx diferente de 0 salta a bis
je or ; si edx igual a 0 salta a or
bis:
mov eax, outmsg1 ; mueve a eax primer mensaje de resultado
callprint_string ; pinta primer mensaje de resultado
call print_nl ; brinca linea
jmp next ; salto a fin para que no ponga todos los mensajes
or:
mov eax, [input1] ; mueve a eax el año nuevamente
mov ecx, 400 ; mueve a ecx 400 para cumplir tercer condición
cdq ; prepara edx para capturar residuo
idiv ecx ; divide eax/ecxcmp edx, 0 ; compara edx con 0
je bis2 ; si son iguales salta a bis2
jne nobis ; si son diferentes salta a nobis
bis2:
mov eax, outmsg1 ; mueve a eax primer mensaje de resultado
call print_string ; pinta primer mensaje de resultado
call print_nl ; pinta en nueva linea
jmp next ; salto a fin para que noponga todos los mensajes
nobis:
mov eax, outmsg2 ; mueve a eax segundo mensaje de resultado
call print_string ; pinta segundo mensaje de resultado
call print_nl ; pinta nueva linea
next:
popa
mov eax, 0 ; return back to C
leave
ret
; programa que te diceel factorial de algun numero
; Usando Linux y gcc:
; nasm -f elf fact.asm
; gcc -o fact fact.o driver.c asm_io.o
;
%include "asm_io.inc"
;
; inicializamos segmentos de datos
;
segment .data
;
; referencias de mensajes
;
prompt1 db "Este programa calcula el factorial, introduce tu numero: ", 0 ;
outmsg1 db "El factorial de tu numero es: ", 0
segment .bss...
Regístrate para leer el documento completo.