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