Neste laboratório vamos começar a programar em linguagem de montagem.
O nosso primeiro programa está
aqui.
Salve-o em um arquivo prog1.s
.
obs: Trate os trechos de código rotulados com "não mexa" como caixas pretas. Um desses trechos serve para imprimir o número que tiver sido armazenado em eax. Mais tarde no curso discutiremos o que ele contém.
Para compilar esse programa, basta chamar o gcc
:
> gcc -no-pie -o prog1 prog1.s(Pela terminação
.s
o gcc
sabe que
o programa está em assembly.)
Para executá-lo, faça como sempre:
> ./prog1
Compare o código assembly com o código C (comentado) e veja se você consegue entender a correspondência entre eles...
A modificação do programa C mostrada a seguir imprime apenas a soma dos elementos do array. Traduza essa modificação para assembly.
Na sua modificação, mantenha o contador (i) em %ebx e o endereço de nums em %r12.
/* int nums[] = {10, -21, -30, 45}; int main() { int i, *p; int sum = 0; for (i = 0, p = nums; i != 4; i++, p++) sum += *p; printf("%d\n", sum); return 0; } */
A modificação do programa C mostrada a seguir imprime apenas os elementos pares do array. Traduza essa modificação para assembly.
/* int nums[] = {10, -21, -30, 45}; int main() { int i, *p; for (i = 0, p = nums; i != 4; i++, p++) if ((*p % 2) == 0) printf("%d\n", *p); return 0; } */
Dicas:
Modifique o primeiro programa (prog1) para usar um array de bytes (char) ao invés de um array de inteiros de 32 bits. Para isso, troque a declaração
nums: .int 10, -21, -30, 45por
nums: .byte 10, -21, -30, 45e faça as modificações necessárias para acessar corretamente os elementos do array de bytes.
Atenção! O valor a ser impresso é um inteiro de 32 bits, armazenado em %eax. Você deve estender cada byte para o valor equivalente de 32 bits antes de imprimí-lo!