Considere o programa abaixo:
#include <stdio.h>
char S2[] = {65, 108, 111, 32, 123, 103, 97, 108, 101, 114, 97, 125, 33, 0};
int main (void) {
char *pc = S2;
while (*pc)
printf ("%c", *pc++);
printf("\n");
return 0;
}
Uma tradução deste programa para assembly está
aqui.
Compare o código assembly com o código C, e veja se você
consegue entender a correspondência entre eles.
Nos próximos exercícios, escreva PRIMEIRO o código C para resolver
o que se pede, teste-o, e em seguida traduza-o para assembly
(os dois códigos são necessários na entrega).
Modifique o programa C anterior para imprimir somente as letras diferentes de 'a' (o código ASCII do caractere 'a' é 97).
Teste sua modificação em C e depois faça a mesma modificação no código assembly.
Escreva em C um programa que imprima os quadrados dos números de 1 a 10 e depois traduza-o para assembly.
Esse programa não deve utilizar um array de inteiros global! Utilize uma variável inteira para obter os valores de 1 a 10.
Para calcular o quadrado de um valor, você pode multiplicá-lo por si mesmo.
Em assembly, use a instrução imull, por exemplo:
imull %eax, %eax
Note que agora você vai precisar de uma string de formatação
para imprimir um valor inteiro:
Sf: .string "%d\n"
Traduza agora para assembly o programa abaixo, lembrando o que foi visto em
sala sobre o cálculo do endereço de cada posição de um array:
end(a[i]) = end(a) + i * sizeof(T), onde T é o tipo dos elementos de a
Atenção: esse
programa não é igual ao visto no laboratório 6!
No laboratório 6, percorremos os arrays com o uso de ponteiros.
Você deve, agora, traduzir a operação de indexação do array
usada no código C.
#include <stdio.h>
int nums[4] = {65, -105, 111, 34};
int main (void) {
int i;
int s = 0;
for (i=0;i<4;i++)
s = s+nums[i];
printf ("soma = %d\n", s);
return 0;
}
Dica: Você pode usar um registrador auxiliar, por exemplo %rcx, para fazer o cálculo do endereço do elemento do array. Lembre-se que ele deve ser um registrador de 64 bits, para que você possa fazer a soma com o endereço do início do array.
Vamos voltar ao programa do exercício 3 do laboratório 6, com uma modificação: agora o programa imprime os elementos pares e maiores que zero do array:
/*
int nums[] = {10, -21, -30, 45};
int main() {
int i, *p;
for (i = 0, p = nums; i != 4; i++, p++)
if (((*p % 2) == 0) && (*p > 0))
printf("%d\n", *p);
return 0;
}
*/
Traduza essa modificação.
Repare que, depois de testar uma das condições, dependendo do resultado
desse teste, não é necessário testar a segunda condição.
Este tipo de avaliação de expressões com operadores lógicos é chamada curto-circuito, e ocorre quando a avaliação do segundo operando da expressão somente é realizada se o resultado da avaliação do primeiro operando não é suficiente para determinar o valor da expressão.