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 -o ex1 ex1.s
e execute-o, verificando seu resultado.
int filtro(int x, int lim) { if (x < lim) return 0; else return x; }
#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; }
gcc -Wall -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 retCompile os dois módulos juntos (
gcc -Wall -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!