11 - Revisão
Na aula de hoje iremos revisar nossas atividades com Assembly e representação de inteiros.
Quando tiver dúvidas, chame o professor ou os ninjas!
Importante
Esta aula tem duas partes:
- Exercícios de revisão (
ex1.c,ex2.c,ex3.ceex4.c)- Siga o roteiro para desenvolvê-los
- Simulado de prova
- Veja mais detalhes no final do roteiro!
Ex1.c
Abra o código-fonte ex1.c e confira a função main. Compile e execute o exercício 1. Em seguida, responda:
Exercise 1
Answer
O valor -1 em complemento de 2 é representado como uma sequência de 1's. Ao ser atribuído em uma unsigned short, teremos dezesseis 1's, mas que serão interpretados como unsigned. Somando $2^0 + 2^1 + \dots + 2^{15} = 65535$
Exercise 2
Answer
A variável será de 2 bytes sem sinal, assim o maior valor é $2^{16}-1 = 65535$
Exercise 3
Answer
Apenas os 16 bits menos significativos serão considerados.
Ex2.c
Neste exercício iremos fazer engenharia reversa de Assembly para C. Os códigos-fonte estão disponíveis no repositório, mas evite abri-los antes de ter feito pelo menos uma primeira versão da engenharia reversa.
Compile o ex2.c com
Abra o arquivo ex2.o com o gdb sem abrir o código-fonte e responda:
Exercise 4
Answer
Funções func1 e func2. Sem variáveis globais.
Analise a função func1 com o gdb e responda:
Exercise 5
Exercise 6
Answer
A operação é vec[0] = 0 ou *vec = 0. Como a operação é um MOV, então (%rdi) representa uma dereferenciação de ponteiro.
Tip 1
Veja a seção Acesso a elementos constantes da aula 09 - Arrays
Exercise 7
Answer
A operação é vec[2] = 20. Em 0x4(%rdi), indicamos que queremos acessar o endereço %rdi + 4 bytes.
Tip 2
Acese na aula 05-Condicionais a explicação sobre as variântes da instrução mov
Analise a função func2 com o gdb e responda:
Exercise 10
Answer
É uma operação aritmética onde o valor armazenado em %rax é multiplicado por 5 e armazenado em %edx.
Exercise 11
Answer
É uma operação aritmética onde o valor armazenado em %edx é somado consigmo mesmo e armazenado em %edx. Isto é equivalente a fazer var = var * 2.
Exercise 12
Answer
Supondo que %eax representa a variável i, então a junção das duas operações é equivalente a fazer i * 10, cujo resultado é armazenado em %edx.
Exercise 13
Ex3.c
Neste exercício iremos fazer engenharia reversa de Assembly para C. Os códigos-fonte estão disponíveis no repositório, mas evite abri-los antes de ter feito pelo menos uma primeira versão da engenharia reversa.
Compile o ex3.c com:
Abra o arquivo ex3 com o gdb sem abrir o código-fonte e responda:
Exercise 14
Answer
Variável global v_global. Funções func1, func2, func3, func4 e main.
Exercise 15
Answer
Ambas fazem operações com registradores. Porém func2 faz a leitura de algum valor de memória e armazenando no retorno da função, uma variável global. Já func1 apenas faz uma operação aritmética com o parâmetro recebido.
Tip 3
Fique atento a chamadas de variáveis globais. Utilize o comando x para imprimir o conteúdo de um endereço. Veja mais em https://sourceware.org/gdb/current/onlinedocs/gdb#Memory
Exemplo:
Exercise 17
Ex4.c
Neste exercício iremos fazer engenharia reversa de Assembly para C. Os códigos-fonte estão disponíveis no repositório, mas evite abri-los antes de ter feito pelo menos uma primeira versão da engenharia reversa.
Compile o ex4.c com:
Abra o arquivo ex4 com o gdb sem abrir o código-fonte e responda:
Exercise 18
Tip 4
Observe sempre as chamadas de variáveis globais e strings (relativos a %rip) e acessos à stack (relativos a %rsp).
Simulado de prova
Além dos exercícios de revisão feitos na aula, no Blackboard da disciplina está disponível o arquivo simulado_ai.zip.
Para baixar o arquivo acesse no Blackboard:
Conteudo / Simulado AI / Donwload e entrega do simulado da AI
Siga as orientações no Blackboard para fazer o downloado do simulado, na AI, vocês receberão um arquivo semelhante a este. No dia da prova, você terá que baixar o zip, descompactar, resolver os exercícios, compactar novamente e anexar no Blackboard.
Importante
Leia o README.md ou README.html para saber o que é esperado em cada questão e como você será avaliado