Advertisement
Guest User

Untitled

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