Diferencia entre revisiones de «Ejercicios varios Itanium (Organización del Computador II)»
De Cuba-Wiki
(Ejercicios de Martin y Palla) |
(Sumador hecho por facu) |
||
(No se muestra una edición intermedia del mismo usuario) | |||
Línea 1: | Línea 1: | ||
== Sumador == | |||
Sumador de numeros grandes. Los valores estan hardcodeados en la seccion data, no se reciben como parametro. El resultado se baja a Salida, no en r8. | |||
section .text | |||
global _start | |||
_start: | |||
clc | |||
mov ecx, 5 | |||
xor ebx, ebx | |||
_loop: | |||
mov eax, [entrada1 + ebx * 4] | |||
adc eax, [entrada2 + ebx * 4] | |||
mov [salida + ebx * 4], eax | |||
inc ebx | |||
loop _loop | |||
mov eax, 1 | |||
int 80h | |||
section .data | |||
entrada1 dd 321321, 5523532, 23123, 521412, 6654221 | |||
entrada2 dd 11, 11, 11, 11, 11 | |||
salida dd 0, 0, 0, 0, 0 | |||
== Fibonacci == | == Fibonacci == | ||
Codigo en IA64 para calcular el kesimo numero de Fibonacci. Es iterativa, no recursiva. Recibe como parametro el kesimo numero a calcular y lo devuelve en r8. | Codigo en IA64 para calcular el kesimo numero de Fibonacci. Es iterativa, no recursiva. Recibe como parametro el kesimo numero a calcular y lo devuelve en r8. | ||
Línea 6: | Línea 31: | ||
.align 64 | .align 64 | ||
.global fibo | .global fibo | ||
.proc fibo | .proc fibo | ||
fibo: | fibo: | ||
alloc loc0=ar.pfs, 1, 4, 0, 0;; | alloc loc0=ar.pfs, 1, 4, 0, 0;; | ||
Línea 21: | Línea 45: | ||
mov loc2= loc3;; | mov loc2= loc3;; | ||
br.cloop.dptk.few ciclo1;; | br.cloop.dptk.few ciclo1;; | ||
// FinCiclo1 | |||
mov ar.pfs=loc0;; | mov ar.pfs=loc0;; | ||
mov r8 = loc2; | mov r8 = loc2; | ||
br.ret.sptk.many b0;; | br.ret.sptk.many b0;; | ||
.endp fibo | .endp fibo | ||
== Collatz == | == Collatz == | ||
Verifica la conjetura de collatz para todos los numeros de 2 a n. El parametro es n. No calcula de a varios al mismo tiempo. | Verifica la conjetura de collatz para todos los numeros de 2 a n. El parametro es n. No calcula de a varios al mismo tiempo. | ||
Línea 36: | Línea 58: | ||
.align 64 | .align 64 | ||
.global coll | .global coll | ||
.proc coll | .proc coll | ||
coll: | coll: | ||
alloc loc0=ar.pfs, 1, 3, 1, 0;; | alloc loc0=ar.pfs, 1, 3, 1, 0;; | ||
Línea 44: | Línea 65: | ||
ciclo1: | ciclo1: | ||
mov loc1= loc2;; //Meto el i en r | mov loc1= loc2;; // Meto el i en r | ||
ciclo2: | ciclo2: | ||
br.call.sptk.few b2=oper;; | br.call.sptk.few b2=oper;; | ||
mov loc1= r8;; | mov loc1= r8;; | ||
cmp.ge p2, p1 = loc1, loc2;; //Comparo r con i, salto mientras no r<i | cmp.ge p2, p1= loc1, loc2;; // Comparo r con i, salto mientras no r<i | ||
(p2)br.cond.dptk.many ciclo2;; //Salto a ciclo2 | (p2)br.cond.dptk.many ciclo2;; // Salto a ciclo2 | ||
//FinCiclo2 | // FinCiclo2 | ||
add loc2= 1, loc2;; //Incremento el i | add loc2= 1, loc2;; // Incremento el i | ||
cmp.eq p2, p1= loc2, in0;; //Comparo | cmp.eq p2, p1= loc2, in0;; // Comparo | ||
(p1) br.cond.dptk.many ciclo1;; //Salto si el i todavia no llego a n | (p1) br.cond.dptk.many ciclo1;; // Salto si el i todavia no llego a n | ||
//FinCiclo1 | // FinCiclo1 | ||
mov ar.pfs=loc0;; | mov ar.pfs=loc0;; | ||
mov r8 = 1; | mov r8 = 1; | ||
br.ret.sptk.many b0;; | br.ret.sptk.many b0;; | ||
.endp coll | |||
.proc oper | .proc oper | ||
oper: | oper: | ||
alloc loc0=ar.pfs, 1, 3, 0, 0;; | alloc loc0= ar.pfs, 1, 3, 0, 0;; | ||
and loc1= 1, in0;; | and loc1= 1, in0;; | ||
cmp.eq p1,p2 = 0, loc1;; //Levanta p1 si es par, p2 si impar | cmp.eq p1,p2= 0, loc1;; // Levanta p1 si es par, p2 si impar | ||
//Si es par | // Si es par | ||
(p1)shl in0= in0, 1;; | (p1)shl in0= in0, 1;; | ||
//Si es impar | // Si es impar | ||
(p2)add loc2= in0, in0;; | (p2)add loc2= in0, in0;; | ||
(p2)add in0= loc2, in0, 1;; | (p2)add in0= loc2, in0, 1;; | ||
Línea 82: | Línea 100: | ||
mov ar.pfs= loc0;; | mov ar.pfs= loc0;; | ||
br.ret.sptk.many b2;; | br.ret.sptk.many b2;; | ||
.endp oper | .endp oper |
Revisión del 13:43 4 oct 2006
Sumador
Sumador de numeros grandes. Los valores estan hardcodeados en la seccion data, no se reciben como parametro. El resultado se baja a Salida, no en r8.
section .text global _start _start: clc mov ecx, 5 xor ebx, ebx _loop: mov eax, [entrada1 + ebx * 4] adc eax, [entrada2 + ebx * 4] mov [salida + ebx * 4], eax inc ebx loop _loop mov eax, 1 int 80h
section .data entrada1 dd 321321, 5523532, 23123, 521412, 6654221 entrada2 dd 11, 11, 11, 11, 11 salida dd 0, 0, 0, 0, 0
Fibonacci
Codigo en IA64 para calcular el kesimo numero de Fibonacci. Es iterativa, no recursiva. Recibe como parametro el kesimo numero a calcular y lo devuelve en r8.
.text .align 64 .global fibo .proc fibo fibo: alloc loc0=ar.pfs, 1, 4, 0, 0;; add in0= -2, in0;; mov ar.LC= in0; mov loc1= r0;; mov loc2= 1;; ciclo1: add loc3= loc1, loc2;; mov loc1= loc2;; mov loc2= loc3;; br.cloop.dptk.few ciclo1;; // FinCiclo1 mov ar.pfs=loc0;; mov r8 = loc2; br.ret.sptk.many b0;; .endp fibo
Collatz
Verifica la conjetura de collatz para todos los numeros de 2 a n. El parametro es n. No calcula de a varios al mismo tiempo.
.text .align 64 .global coll .proc coll coll: alloc loc0=ar.pfs, 1, 3, 1, 0;; mov loc2= 2;; ciclo1: mov loc1= loc2;; // Meto el i en r ciclo2: br.call.sptk.few b2=oper;; mov loc1= r8;; cmp.ge p2, p1= loc1, loc2;; // Comparo r con i, salto mientras no r<i (p2)br.cond.dptk.many ciclo2;; // Salto a ciclo2 // FinCiclo2 add loc2= 1, loc2;; // Incremento el i cmp.eq p2, p1= loc2, in0;; // Comparo (p1) br.cond.dptk.many ciclo1;; // Salto si el i todavia no llego a n // FinCiclo1 mov ar.pfs=loc0;; mov r8 = 1; br.ret.sptk.many b0;; .endp coll .proc oper oper: alloc loc0= ar.pfs, 1, 3, 0, 0;; and loc1= 1, in0;; cmp.eq p1,p2= 0, loc1;; // Levanta p1 si es par, p2 si impar // Si es par (p1)shl in0= in0, 1;; // Si es impar (p2)add loc2= in0, in0;; (p2)add in0= loc2, in0, 1;; mov r8= loc0;; mov ar.pfs= loc0;; br.ret.sptk.many b2;; .endp oper