07 - Loops¶
Arquivo ex1
¶
Utilize como base o código assembly abaixo (arquivo ex1
) e responda os itens.
Dump of assembler code for function soma_2n:
0x066a <+0>: mov $0x1,%eax
0x066f <+5>: jmp 0x676 <soma_2n+12>
0x0671 <+7>: shr %edi
0x0673 <+9>: add $0x1,%eax
0x0676 <+12>: cmp $0x1,%edi
0x0679 <+15>: ja 0x671 <soma_2n+7>
0x067b <+17>: repz retq
Exercise
Localize no código acima as instruções de saltos (jmp
ou condicionais j*
). Desenhe setas indicando para qual linha do código elas pulam.
Answer
Há um salto de soma_2n <+5>
para soma_2n <+12>
e outro de soma_2n <+15>
para soma_2n <+7>
Exercise
Analise o fluxo de saltos do seu código. Existe um loop? Entre quais linhas?
Answer
O loop ocorre entre as linhas +5
e +15
.
Exercise
Qual é a condição do loop acima? Ou seja, qual condição precisa ser verdade para que o loop continue rodando?
-
%edi > 1
-
%edi < 1
-
%edi > 0
-
%eax > 1
Answer
Sempre comparamos o segundo em relação ao primeiro. Logo, fazemos %edi > 1
. A instrução ja
representa a comparação jump above, que é uma comparação de >
feita entre variáveis unsigned
Exercise
Com base na sua resposta acima, como você escreveria esse loop como um while
?
Answer
Considerando que o primeiro argumento da função se chama int arg1
, seria while(arg1 > 1)
.
Exercise
Comece fazendo uma versão C usando somente if-goto
Answer
int soma_2n(unsigned int a) {
int res = 1;
goto verifica;
faz_algo:
a = a >> 1;
res += 1;
verifica:
if (a > 1) {
goto faz_algo;
}
return res;
}
Exercise
Transforme a construção que você fez acima em um código usando while
.
Answer
int soma_2n(unsigned int a) {
int res = 1;
while (a > 1) {
a = a/2;
res++;
}
return res;
}
Exercícios para entrega¶
Vamos agora exercitar o que vimos na aula expositiva. Os exercícios abaixo estão no repositório de atividades e as perguntas no handout tem o objetivo de ajudar a compreender códigos cada vez mais complexos.
Atenção!
Antes de continuar, dê um git pull
em seu repositório de atividades e leia o README disponível dentro da pasta da atividade!
Dicas!
Antes de fazer disas
, sempre dê um info functions
e info variables
para conhecer o que temos em cada arquivo. Nem sempre encontrará algo muito valioso, mas é bom verificar!
Arquivo ex2.o
¶
Leia o código assembly abaixo e responda.
Dump of assembler code for function soma_n:
0x000 <+0>: endbr64
0x004 <+4>: mov $0x0,%eax
0x009 <+9>: mov $0x0,%edx
0x00e <+14>: cmp %edi,%eax
0x010 <+16>: jge 0x1d <soma_n+29>
0x012 <+18>: movslq %eax,%rcx
0x015 <+21>: add %rcx,%rdx
0x018 <+24>: add $0x1,%eax
0x01b <+27>: jmp 0xe <soma_n+14>
0x01d <+29>: mov %rdx,%rax
0x020 <+32>: ret
Exercise
Desenhe as flechas indicando o destino de cada instrução de pulo (jmp
ou j*
).
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Escreva abaixo o cabeçalho da função soma_n
. Dica: procure por registradores que são lidos antes de serem escritos.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Faça a tradução do código acima para C usando somente if-goto
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Converta o código acima para uma versão legível em C.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Arquivo ex3.o
¶
Dump of assembler code for function ex3:
0x000 <+0>: endbr64
0x004 <+4>: mov $0x0,%ecx
0x009 <+9>: mov $0x0,%r8d
0x00f <+15>: jmp 0x15 <ex3+21>
0x011 <+17>: add $0x1,%rcx
0x015 <+21>: cmp %rdi,%rcx
0x018 <+24>: jge 0x2c <ex3+44>
0x01a <+26>: mov %rcx,%rax
0x01d <+29>: cqto
0x01f <+31>: idiv %rsi
0x022 <+34>: test %rdx,%rdx
0x025 <+37>: jne 0x11 <ex3+17>
0x027 <+39>: add %rcx,%r8
0x02a <+42>: jmp 0x11 <ex3+17>
0x02c <+44>: mov %r8,%rax
0x02f <+47>: ret
Exercise
Quantos argumentos a função acima recebe? Quais seus tipos?
Dica: não se esqueça de buscar por registradores que são lidos antes de serem escritos.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
A função retorna algum valor? Se sim, qual seu tipo?
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
A função acima combina loops e condicionais. Desenhe setas para onde as instruções de jmp
apontam.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Com base no exercício anterior, entre quais linhas o loop ocorre? E a condicional?
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
O loop acima tem uma variável contadora. Ela está em qual registrador? Qual seu tipo?
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Revise o funcionamento da instrução idiv
. Em qual registrador é armazenado o resultado da divisão? E o resto?
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Qual a condição testada na condicional?
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Escreva uma versão do código acima usando somente if-goto
.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!
Exercise
Escreva uma versão legível do código acima.
Answer
// Atividade para entrega!
// Confira nos atendimentos ou chame os professores!