Computadores e Programaç˜ao (MAB-353 2015
Transcrição
Computadores e Programaç˜ao (MAB-353 2015
Computadores e Programação (MAB-353 2015-2) Lista1 (rev1) - Grupo de até 3 alunos - 100 pontos Primeira Parte (questões 1 a 3, 65 pontos), entrega definida para o dia 24/05/2016. Segunda Parte (questões 4 e 5, 35 pontos), entrega para o dia 31/05/2016 Grupo: ......................................................................... Questão 1 (25 pontos) Seja dado o código C abaixo: #include <stdio.h> void dump (void *p, int n) { unsigned char *p1 = p; while (n--) { printf("Endereco %p : %02X\n", p1, *p1);/* imprime a partir de um endereço p */ p1++; /* incrementa o ponteiro */ } } int main (void) { int i,j; j = 0x5fffffff; i = 0x0000ffff; int z = i*j; dump(&z, sizeof(z)); } /* imprime os bytes na memória em endereços crescentes */ 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, usando as representações acima, como feito em aula. d) (5) Gere o código de montagem sem otimização e justifique cada linha do código de montagem de main (não é preciso comentar a rotina dump), desconsiderando as linhas iniciadas com ponto, que são indicações ao compilador gcc. e) (2) As variáveis x, y e z estão representadas em que registrador ou posição de memória? f) (3) Gere o código com otimização -O1 e justifique comente cada linha do código de montagem. g) (5) Assumindo que agora x, y e z sejam definidos como long long int qual seria o novo valor de z em hexa? Justifique analiticamente e deduza a resposta que seria obtida obtida. 1 Questão 2 Chamada de rotina e código de montagem. (20 pontos) int rotina (unsigned int x) { unsigned int y; y = x/......; /* divisor inteiro a ser descoberto pela engenharia reversa */ return y; } O código C acima foi compilado e gerado o seguinte código de montagem (removidas as linhas de diretivas do gcc): rotina: movl $-252645135, %edx movl %edx, %eax mull 4(%esp) movl %edx, %eax shrl $4, %eax ret ................................................................. ................................................................. ................................................................. ................................................................. ................................................................. ................................................................. a) (10) Comente cada linha do código de montagem e descubra o divisor inteiro com base neste código. 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) (5) Qual o valor do divisor inteiro desconhecido? Justifique. c) (5) A compilação foi feita de forma otimizada ou não? Justifique com argumentos sólidos. Questão 3 (20 pontos) a) (10) Faça a engenharia reversa para descobrir o que foi apagado nas lacunas. #include <stdio.h> main(){ int y = .....; int x; .... = .......................................; printf(" %d \n", ..............); return ......... ; } b) (10) Justifique cada linha do código de montagem gerado e associe ao código C a ser descoberto: main: pushl %ebp movl %esp, %ebp andl $-16, %esp subl $32, %esp movl $3, 24(%esp) ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ 2 cmpl $0, 24(%esp) jne .L2 cmpl $0, 24(%esp) je .L3 movl $1, %eax cltd idivl 24(%esp) testl %eax, %eax je .L3 .L2: movl $1, %eax jmp .L4 .L3: movl $0, %eax .L4: movl %eax, 28(%esp) movl 28(%esp), %eax movl %eax, 4(%esp) movl $.LC0, (%esp) call printf movl 28(%esp), %eax leave ret ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ ........................................................................ Questão 4 (20 pontos) Consultando o código de montagem, faça a engenharia reversa e descubra as linhas apagadas e/ou lacunas do código C. Comente todas as linhas do código de montagem, procurando associar à linha do código C, quando for o caso. main(){ int a[........]; int x=0; int i=0; ...........................; while(...............){ a[i+1] = ..............................................; ..........................; } for (..................;.........................;....................) { ............................................... continue; /* avança para próxima interaç~ ao do for */ x = .......................................; } printf(....................., ...........); } .LC0: .string "%d\n" main: pushl %ebp ............................................................. movl %esp, %ebp ............................................................. pushl %esi ............................................................. pushl %ebx ............................................................. andl $-16, %esp ............................................................. subl $64, %esp ............................................................. 3 movl $1, 24(%esp) ............................................................. leal 24(%esp), %ebx ............................................................. movl %ebx, %esi ............................................................. leal 60(%esp), %ecx ............................................................. movl %ebx, %eax ............................................................. .L3: movl (%eax), %edx ............................................................. negl %edx ............................................................. addl %edx, %edx ............................................................. movl %edx, 4(%eax) ............................................................. addl $4, %eax ............................................................. cmpl %ecx, %eax ............................................................. jne .L3 ............................................................. addl $40, %esi ............................................................. movl %ebx, %eax ............................................................. movl $0, %ecx ............................................................. .L6: movl (%eax), %edx ............................................................. leal (%ecx,%edx), %ebx ............................................................. testl %edx, %edx ............................................................. cmovns %ebx, %ecx ............................................................. addl $4, %eax ............................................................. cmpl %esi, %eax ............................................................. jne .L6 ............................................................. movl %ecx, 4(%esp) ............................................................. movl $.LC0, (%esp) ............................................................. call printf leal -8(%ebp), %esp ............................................................. popl %ebx ............................................................. popl %esi ............................................................. popl %ebp ............................................................. ret ............................................................. Questão 5 (15 pontos) Dado o código C e o correpondente código de montagem, procure determinar o valor no define que foi apagado e justifique pela engeharia reversa. #define N ..... #define M ..... #define L ..... typedef int mat1[N][M]; typedef int mat2[M][L]; int func(mat1 A, mat2 B, int i , int j , int k){ int x; x = A[i][j]*B[j][k]; return x; } func: pushl %ebp ...................................................... movl %esp, %ebp ...................................................... subl $16, %esp ...................................................... movl 16(%ebp), %eax ...................................................... imull $52, %eax, %edx ...................................................... 4 movl 8(%ebp), %eax ...................................................... addl %eax, %edx ...................................................... movl 20(%ebp), %eax ...................................................... movl (%edx,%eax,4), %edx ...................................................... movl 20(%ebp), %eax ...................................................... sall $2, %eax ...................................................... leal 0(,%eax,8), %ecx ...................................................... subl %eax, %ecx ...................................................... movl 12(%ebp), %eax ...................................................... addl %eax, %ecx ...................................................... movl 24(%ebp), %eax ...................................................... movl (%ecx,%eax,4), %eax ...................................................... imull %edx, %eax ...................................................... movl %eax, -4(%ebp) ...................................................... movl -4(%ebp), %eax ...................................................... leave ...................................................... ret ...................................................... 5
Documentos relacionados
Computadores e Programaç˜ao (MAB-353) Lista 1 v.0
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 ...
Leia mais