Você terminou todos os laboratórios anteriores (em especial, o lab 8???)? Se não, termine agora.
Escreva em assembly uma função para imprimir cada caracter
de uma string recebida como parâmetro.
A função recebe um único parâmetro char*
(ponteiro para string a ser impressa).
Use a função putchar
para imprimir cada caracter:
int putchar(int c);e termine mandando imprimir o caracter '\n'.
putchar
deve obedecer a convenção de
chamada de procedimentos, ou seja, o parâmetro deve ser colocado na pilha.
Faça os exercícios abaixo segundo as regras de tradução vistas em sala.
Considere o código abaixo:
struct X { int c; struct X *next; }; int add (struct X *x) { int a = 0; for (; x != NULL; x = x->next) a += x->c; return a; }Traduza a função
add
para assembly e use a função
main
dada a seguir para testá-la.
#include<stdio.h> #define MAX 10 /* MAX tem que ser maior que 1!!!! */ struct X { int c; struct X *next; }; int add (struct X *x); int main (void) { struct X x[MAX]; int i; for (i=0;i<MAX;i++) x[i].c = i; for (i=MAX-1;i>1;i--) x[i].next = &(x[i-1]); x[0].next = &(x[MAX-1]); x[1].next = NULL; printf ("resultado de add: %d\n", add(x)); return 0; }
Assumindo a definição anterior para a estrutura X
,
traduza a função abaixo para assembly:
int add2 (struct X *x) { if (x == NULL) return 0; else return x->c + add2(x->next); }
Refaça os exercícios anteriores assumindo que a estrutura X
tem a definição abaixo:
struct X { char c; struct X *next; };
Dicas:
Considere o código abaixo:
int f (int x) { return x+2; } void map2 (int* um, int * outro, int n) { int i; for (i=0; i<n; i++) *(outro+i) = f(*(um+i)); }Codifique a função
map2
e a função f
em assembly.
Teste com uma main
escrita em C como essa a seguir:
#include <stdio.h> #define N 10 void map2 (int* um, int * outro, int n); int main (void) { int i; int a[N], b[N]; for (i=0;i<N;i++) a[i] = i; map2(a,b,N); for (i=0;i<N;i++) printf("%d\n",b[i]); return 1; }