INF1018 - Software Básico

Aulas de Laboratório

Laboratório 8 - Funções em Assembly

  1. Considere o arquivo abaixo:

    .text
    
    .global	add
    add:	push	%ebp
    	mov	%esp, %ebp
    
    	mov	8(%ebp), %eax
    	add	12(%ebp), %eax
    
    	mov	%ebp, %esp
    	pop	%ebp
    	ret
    
    Esse arquivo define uma função add, equivalente a definição em C int add (int a, int b) { return a+b; }

    Escreva, em C, uma função main que chame essa função add. Por exemplo,

    #include <stdio.h>
    
    int add (int a, int b);
    
    int main (void) {
       printf("%d\n", add(4,5));
       return 0;
    }
    
    Compile os dois programas juntos (algo como gcc -Wall -m32 -o lab7 add.s main.c; o gcc se encarrega de ligá-los) e execute o resultado.
  2. Modifique a função para retornar a soma de três parâmetros int. Modifique sua main para testar a nova função.

  3. Traduza para assembler a função C add1 mostrada abaixo:

    int add1 (int *a, int n) {
      int i;
      int s = 0;
      for (i=0; i<n; i++) s += *a++;
      return s;
    }
    
    Modifique sua main para testar essa nova função.
  4. Traduza para assembler a função C foo mostrada abaixo.
    (A sua tradução deverá representar a indexação do array a!)

    void foo (int a[], int n) {
      int i;
      int s = 0;
      for (i=0; i<n; i++) {
        s += a[i];
        if (a[i] == 0) {
          a[i] = s;
          s = 0;
        }
      }
    }
    
    Modifique sua main para testar essa nova função.
  5. Codifique a função fat, com a definição abaixo, em assembly. Teste-a com uma função main escrita em C.

    int fat (int n) {
      if (n==0) return 1;
      else return n*fat(n-1);
    }