INF1018 - Software Básico

Chamadas de funções em Assembly

  1. Execute o seguinte comando no terminal: ls -ls

    Considere agora o programa C a seguir:

      #include <stdlib.h>
      int main() {
        system("ls -ls");
        return 0;
      }
    
    Este programa chama a função system, da biblioteca padrão de C. Essa função executa o comando especificado na cadeia que é passada como parâmetro da função.

    Traduza a função main para assembly, criando um arquivo ex1.s. Aproveite o seguinte esqueleto para criar o seu arquivo assembly:

      .data
      s1: .string "ls -ls"
    
      .text
      .globl main
      main:
      /* prologo */
        pushq %rbp
        movq  %rsp, %rbp
    
      /* coloque seu codigo aqui */
    
      /* finalizacao */
        leave
        ret
    
    "Compile" seu programa com o comando gcc -Wall -no-pie -o ex1 ex1.s e execute-o, verificando seu resultado.


  2. Considere agora o programa a seguir, composto por dois módulos (arquivos) C:
    • arquivo filtro.c:
      int filtro(int x, int lim) {
        if (x < lim)
          return 0;
        else
          return x;
      }
      
    • arquivo main.c:
      #include <stdio.h>
      #define LIM 1
      
      int filtro(int x, int lim);
      
      int nums[5] = {3,-5,7,8,-2};
      
      int main() {
        int i;
        int *p = nums;
        for (i = 0; i < 5; i++) {
          printf("%d\n", filtro(*p,LIM));
          p++;
        }
        return 0;
      }
      
    Compile os dois módulos juntos (gcc -Wall -no-pie -o ex2 filtro.c main.c) e execute o programa gerado, verificando seu resultado.

    Traduza agora a função main para assembly, criando um novo arquivo mainasm.s. Aproveite o esqueleto abaixo para criar o seu arquivo assembly.

    Importante! Na sua tradução, use os registradores %rbx e %r12 para armazenar valores que você não quer perder quando chamar printf...

      .data
      nums: .int 3, -5, 7, 8, -2
      s1:   .string "%d\n"
    
      .text
      .globl main
      main:
      /* prologo */
         pushq %rbp
         movq  %rsp, %rbp
         subq  $16, %rsp
         movq  %rbx, -8(%rbp)
         movq  %r12, -16(%rbp)
    
      /* coloque seu codigo aqui */
    
      /* finalizacao */
         movq -8(%rbp), %rbx
         movq -16(%rbp), %r12
         leave
         ret
    
    Compile os dois módulos juntos (gcc -Wall -no-pie -o ex2asm filtro.c mainasm.s), execute o programa gerado e verifique se o resultado é o mesmo obtido pelo programa com a main em C!