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 1
Answer
Há um salto de soma_2n <+5>
para soma_2n <+12>
e outro de soma_2n <+15>
para soma_2n <+7>
Exercise 2
Answer
O loop ocorre entre as linhas +5
e +15
.
Exercise 3
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 4
Answer
Considerando que o primeiro argumento da função se chama int arg1
, seria while(arg1 > 1)
.
Exercise 5
Exercise 6
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! 1
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
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