Ejercicios varios Itanium (Organización del Computador II)
De Cuba-Wiki
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
Llamadas
Suma
Ejercicio hecho en la teorica en el laboratorio sobre como llamar funciones en Itanium. Incluye el c y el assembler llamado, que a su vez llama otra funcion en assembler. El programa solamente llama dos numeros.
.text .align 32 .global suma .proc suma suma: alloc loc0=ar.pfs, 2, 2, 2, 0;; mov out0=in0 mov out1=in1 mov loc1=b0;; br.call.sptk.many b0=otro;; mov b0=loc1;; mov ar.pfs=loc0;; br.ret.sptk.many b0;; .endp suma
.proc otro otro: alloc loc0=ar.pfs, 2, 1, 0, 0;; add r8=in0,in1;; br.ret.sptk.many b0;; .endp otro
#include <stdio.h> #include <stdlib.h> extern int suma(int a, int b); int main(void) { int a, b; printf("Ingrese "); scanf("%i", &a); scanf("%i", &b); printf("La suma es %i", suma(a,b)); return 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