Computadores e Programaç˜ao (MAB-353) Lista 1 v.0
Transcrição
Computadores e Programaç˜ao (MAB-353) Lista 1 v.0
Computadores e Programação (MAB-353) Lista 1 v.0 - Em grupo de no máximo três alunos 100 pontos - Entrega em 30/04/2015 (15 dias de prazo) Prof. Paulo Aguiar (DCC/IM/UFRJ) Questão 1 (20 pontos) a) (5) Crie um arquivo de texto em Linux de nome arq contendo apenas a letra a. Obtenha o número de bytes deste arquivo. Usando um editor binário liste o conteúdo deste arquivo. Copie a tela do editor binário do seu Linux e coloque-a como resposta. b) (5) Altere agora este arquivo para que ele contenha a letra â (a com acento circunflexo). Obtenha o número de bytes deste arquivo. Usando um editor binário liste o conteúdo deste arquivo. Copie a tela do editor binário do seu Linux e coloque-a como resposta. c) (10) Pesquise e descubra como o final de um arquivo é determinado em Linux. Resuma o resultado de sua pesquisa citando a(s) fonte(s). Caso encontre mais de uma resposta, procure determinar a correta e compare os resultados. Questão 2 Geração de Máscara. (20 pontos) Escreva um código para implementar a seguinte função: /* Gere uma máscara que indica a posição do 1 mais à direita. Assuma w=32. Por exemplo 0XFF00 − > 0x100, e 0x6600 −− > 0x200. Se x=0, então retorne 0. */ int rightmost one (unsigned x) { ... return ...; } Sua função deve seguir as regras de codificação ao nı́vel de bit para inteiros (página 120 do livro texto), exceto que você pode assumir que o tipo int tem w = 32 bits. Explique a lógica de sua solução. Questão 3 Representação de números em C2. (20 pontos) Justifique porque -12345 representado como um número unsigned short int (16 bits) sem sinal resulta em 53191? Justifique passo a passo a sua resposta. Questão 4 Chamada de rotina e código de montagem. (20 pontos) int rotina (unsigned int x) { unsigned int y; y = x/7; return y; 1 } main (void){ printf("%d\n",rotina(7)); } O código acima foi compilado e gerado o código de montagem (removidas as linhas de diretivas do gcc): rotina: movl 4(%esp), %ecx movl $613566757, %edx movl %ecx, %eax mull %edx movl %ecx, %eax subl %edx, %eax shrl %eax addl %edx, %eax shrl $2, %eax ret .LC0: .string "%d\n" main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $16, %esp movl $1, 4(%esp) movl $.LC0, (%esp) call printf leave .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... .................................................................... a) (5) Comente cada linha do código de montagem da rotina rotina e demonstre que ele de fato executa as instruções em C e y é retornado com o valor x/7. Faça o passo a passo, como feito em sala de aula. Você precisa justificar a existência de cada linha de código. Faça as conversões que forem necessárias para justificar a ação do gcc. Não deixe de comentar nenhuma linha. b) (3) No código C, main chama rotina (7). E no código de montagem, o quê acontece? Explique. c) (3) A rotina rotina cria um registro de ativação? Explique. d) (5) Comente e justifique cada linha do código de montagem de main. e) (4) A compilação foi feita de forma otimizada ou não? Justifique com argumentos sólidos. Questão 5 Código de montagem. (20 pontos) Seja dado o código C: #include <stdio.h> void dump (void *p, int n) { unsigned char *p1 = p; while (n--) { printf("Endereco %p : %02X\n", p1, *p1); /* imprime n bytes a partir de um endereço p */ p1++; /* incrementa o ponteiro */ } 2 } int main (void) { long long int x, y, z; x = 0x3FFFFFFF; y = 0x5FFFFFFF; z = x * y; dump(&z, sizeof(z)); /* imprime os bytes na memória em endereços crescentes */ } Compilando sem otimização foi gerado o seguinte código de montagem para main: main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $48, %esp movl $1073741823, 32(%esp) movl $0, 36(%esp) movl $1610612735, 40(%esp) movl $0, 44(%esp) movl 36(%esp), %eax imull 40(%esp), %eax movl %eax, %edx movl 44(%esp), %eax imull 32(%esp), %eax leal (%edx,%eax), %ecx movl 40(%esp), %eax mull 32(%esp) addl %edx, %ecx movl %ecx, %edx movl %eax, 24(%esp) movl %edx, 28(%esp) movl $8, 4(%esp) leal 24(%esp), %eax movl %eax, (%esp) call dump leave ret .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. a) (4) Comente cada linha do código de main e explique a sua correspondência com o código C. Compilando com otimização, agora foi gerado o código abaixo: main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp leal 24(%esp), %eax movl %eax, (%esp) movl $8, 4(%esp) movl $1, 24(%esp) movl $1073741823, 28(%esp) call dump leave .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. .............................................................. 3 b) (4) Justifique cada linha deste código de montagem. Explique o que a otimização fez, comparando os dois códigos de montagem gerados a partir do mesmo código C. Faça seus comentários. c) A rotina main foi modificada e as variáveis x e y foram suprimidas, sendo z calculada direto pela multiplicação dos valores. int main (void) { long long int z; z = 0x3FFFFFFF * 0x5FFFFFFF; dump(&z, sizeof(z)); /* imprime os bytes na memória em endereços crescentes */ } c1) (4) Edite um arquivo meu.c com este novo main, com a rotina dump inclusa, e compile com as opções -m32 -O1 -o meu, para gerar o aquivo excutável meu. Se a compilação gerar alguma mensagem, copie a tela e cole a mensagem aqui como resposta. Rode o executáve meu e copie a tela de saida. c2) (4) Gere o código de montagem em meu.s compilando meu.c com as opções -m32 -O1 -S. Imprima o código de montagem de main e comente linha a linha, justificando a saı́da que foi impressa. c3) (4)Tente explicar o que aconteceu e entenda o comportamento do C na multiplicação para obtenção de z. 4
Documentos relacionados
Computadores e Programaç˜ao (MAB-353 2015
a) (3) Converta x e y em representação 2**n - 1. b) (2) Compile o código acima em 32 bits (gcc -m32) e obtenha o valor de z em hexa. c) (5) Explique e justifique claramente o resultado de z, usa...
Leia mais