Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Dump of assembler code for function main:
- //Colocando subrotina:
- 0x000000000040060d <+0>: push %rbp
- 0x000000000040060e <+1>: mov %rsp,%rbp
- 0x0000000000400611 <+4>: push %rbx
- 0x0000000000400612 <+5>: sub $0xb8,%rsp
- 0x0000000000400619 <+12>: mov %fs:0x28,%rax
- 0x0000000000400622 <+21>: mov %rax,-0x18(%rbp)
- 0x0000000000400626 <+25>: xor %eax,%eax
- //Colocando dados:
- 0x0000000000400628 <+27>: movl $0x19,-0xb8(%rbp) //Tamanho do vetor de entrada/saida
- 0x0000000000400632 <+37>: lea -0x40(%rbp),%rax
- 0x0000000000400636 <+41>: movabs $0x4847464544434241,%rbx
- 0x0000000000400640 <+51>: mov %rbx,(%rax)
- 0x0000000000400643 <+54>: movabs $0x504f4e4d4c4b4a49,%rsi
- 0x000000000040064d <+64>: mov %rsi,0x8(%rax)
- 0x0000000000400651 <+68>: movabs $0x5958565554535251,%rbx
- 0x000000000040065b <+78>: mov %rbx,0x10(%rax)
- 0x000000000040065f <+82>: movl $0x5f7d7b5a,0x18(%rax)
- 0x0000000000400666 <+89>: movb $0x0,0x1c(%rax)
- 0x000000000040066a <+93>: movl $0x0,-0xbc(%rbp)
- //(Colocou, a partir da posicao -0x40(%rbp), os carcteres: HGFEDCBAPONMLKJIYXVUTSRQ_}{Z
- 0x0000000000400674 <+103>: jmp 0x4006a6 <main+153>
- 0x0000000000400676 <+105>: lea -0xb0(%rbp),%rax //Move inicio do vetor para rax
- 0x000000000040067d <+112>: mov -0xbc(%rbp),%edx //Contador em edx
- 0x0000000000400683 <+118>: movslq %edx,%rdx
- 0x0000000000400686 <+121>: shl $0x2,%rdx //Contador *4
- 0x000000000040068a <+125>: add %rdx,%rax //Soma o contador*4 com o inicio do vetor
- 0x000000000040068d <+128>: mov %rax,%rsi //Manda ele ler esse endereço de memoria
- 0x0000000000400690 <+131>: mov $0x4007f4,%edi
- 0x0000000000400695 <+136>: mov $0x0,%eax
- 0x000000000040069a <+141>: callq 0x400510 <__isoc99_scanf@plt> //Leitura
- 0x000000000040069f <+146>: addl $0x1,-0xbc(%rbp) //Incrementa contador
- 0x00000000004006a6 <+153>: mov -0xbc(%rbp),%eax //Coloca contador no eax
- 0x00000000004006ac <+159>: cmp -0xb8(%rbp),%eax //Compara com o tamanho do vetor (25, ou 0x19, salvo na linha +27)
- 0x00000000004006b2 <+165>: jl 0x400676 <main+105> //Se for menor, continua lendo
- 0x00000000004006b4 <+167>: movl $0x0,-0xbc(%rbp) //Senao, zera contador
- 0x00000000004006be <+177>: jmp 0x400732 <main+293> //E pula pro prox loop
- //Cálculos do loop que calcula a saída a partir entrada:
- 0x00000000004006c0 <+179>: mov -0xbc(%rbp),%eax //Coloca o contador no eax
- 0x00000000004006c6 <+185>: cltq //Trunca pra 64 bits ------------------
- 0x00000000004006c8 <+187>: mov -0xb0(%rbp,%rax,4),%edx //Pega o i-esimo elemento da entrada ------------------
- 0x00000000004006cf <+194>: mov -0xbc(%rbp),%eax //Coloca (de novo, lol) o contador no eax ------------------
- 0x00000000004006d5 <+200>: lea (%rdx,%rax,1),%ecx //ecx = rdx+rax
- 0x00000000004006d8 <+203>: mov $0x92492493,%edx //edx = $0x92492493
- 0x00000000004006dd <+208>: mov %ecx,%eax //eax = ecx
- 0x00000000004006df <+210>: imul %edx //multiplica eax com edx, salva os maiores bits em edx e os menores em eax
- 0x00000000004006e1 <+212>: lea (%rdx,%rcx,1),%eax //eax = rcx+rdx
- 0x00000000004006e4 <+215>: sar $0x4,%eax //eax >>= 4
- 0x00000000004006e7 <+218>: mov %eax,%edx //edx = eax
- 0x00000000004006e9 <+220>: mov %ecx,%eax //eax = ecx
- 0x00000000004006eb <+222>: sar $0x1f,%eax //eax >>= 31 (isso vai dar sempre 0 lol) ------------------
- 0x00000000004006ee <+225>: sub %eax,%edx //edx -= eax (subtraindo 0 n muda nada) ------------------
- 0x00000000004006f0 <+227>: mov %edx,%eax //eax = edx
- 0x00000000004006f2 <+229>: mov %eax,-0xb4(%rbp) //salva eax (n sei pq) ------------------
- 0x00000000004006f8 <+235>: mov -0xb4(%rbp),%eax //carrega de volta eax (dnv n sei pq) ------------------
- 0x00000000004006fe <+241>: shl $0x2,%eax //exa <<= 2
- 0x0000000000400701 <+244>: lea 0x0(,%rax,8),%edx //edx = 8*rax+0
- 0x0000000000400708 <+251>: sub %eax,%edx //edx -= eax
- 0x000000000040070a <+253>: mov %ecx,%eax //eax = ecx
- 0x000000000040070c <+255>: sub %edx,%eax //eax -= edx
- //Agora, temos em eax a posição do caractere de saída, e vamos imprimir ele:
- 0x000000000040070e <+257>: mov %eax,-0xb4(%rbp) //Salva em -0xb4(%rbp) esse valor ------------------
- 0x0000000000400714 <+263>: mov -0xb4(%rbp),%eax //Carrega de volta (n sei pq) ------------------
- 0x000000000040071a <+269>: cltq //Trunca pra 64 bits ------------------
- 0x000000000040071c <+271>: movzbl -0x40(%rbp,%rax,1),%eax //Carrega essa o caractere dessa posicao no eax
- 0x0000000000400721 <+276>: movsbl %al,%eax //Pega so o primeiro byte dele
- 0x0000000000400724 <+279>: mov %eax,%edi //Coloca pra imprimir
- 0x0000000000400726 <+281>: callq 0x4004d0 <putchar@plt> //Imprime
- 0x000000000040072b <+286>: addl $0x1,-0xbc(%rbp) //Aumenta o contador
- 0x0000000000400732 <+293>: mov -0xbc(%rbp),%eax //Salva o contador no eax
- 0x0000000000400738 <+299>: cmp -0xb8(%rbp),%eax //Compara com o tamanho do vetor
- 0x000000000040073e <+305>: jl 0x4006c0 <main+179> //Se ainda nao acabou o vetor, volta pro inicio do loop
- Fim:
- 0x0000000000400740 <+307>: mov $0xa,%edi //Imprime o '\n' (ASCII 0xa) e encerra
- 0x0000000000400745 <+312>: callq 0x4004d0 <putchar@plt> //Imprimindo \n
- 0x000000000040074a <+317>: mov $0x0,%eax //Zerando eax
- 0x000000000040074f <+322>: mov -0x18(%rbp),%rsi //Desempilhando
- 0x0000000000400753 <+326>: xor %fs:0x28,%rsi //Testando algum erro tosco
- 0x000000000040075c <+335>: je 0x400763 <main+342> //Se nao deu erro, fim
- 0x000000000040075e <+337>: callq 0x4004e0 <__stack_chk_fail@plt> //Se nao, avisa q deu erro
- 0x0000000000400763 <+342>: add $0xb8,%rsp //Desempilha rotina
- 0x000000000040076a <+349>: pop %rbx
- 0x000000000040076b <+350>: pop %rbp
- 0x000000000040076c <+351>: retq //FIM
- End of assembler dump.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement