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
ret
Compile 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!