Advertisement
MirandaWopps

SB Lab 10 ex 2

May 14th, 2024 (edited)
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. /* SB Lab 10 ex 2: http://www4.inf.puc-rio.br/~inf1018/corrente/labs/lab_fun2.html
  2. #include <stdlib.h>
  3.  
  4. struct X {
  5. int val;
  6. struct X *next;
  7. };
  8.  
  9. int add2 (struct X *x) {
  10. if (x == NULL) return 0;
  11. else return x->val + add2(x->next);
  12. }
  13. */
  14.  
  15. /* Não precisaremos criar uma structs, pois ela é uma definição para o compilador. Em assembly, a struct não é necessária */
  16.  
  17. /*
  18. DICIONÁRIO
  19. Reg Variável RA
  20. RIP próxima instrução
  21. RSP ponteiro para o topo da pilha
  22. RBP ponteiro para a base do meu RA
  23. RDI x ponteiro para a struct do tipo x (primeiro parametro)
  24. */
  25.  
  26. .text
  27. .globl add2
  28. add2:
  29. /* Registro de Ativação */
  30. pushq %rbp /* salva na pilha o BP da função chamadora e coloca a pilha novamente múltiplo de 16*/
  31. movq %rsp, %rbp /* Criando a base do meu RA */
  32. subq $16, %rsp /* delimitando RA*/
  33. movq %rbx, -8(%rbp) /* salvando o valor de ebx da função chamadora no RA, poderia tbm fazer movl %ebx, -4(%rbp) */
  34.  
  35. INICIO:
  36. cmpq $0, %rdi /* x == NULL? */
  37. jne ELSE
  38.  
  39. movl $0, %eax /* eax = 0 */
  40. jmp FIM
  41.  
  42. ELSE:
  43. movl (%rdi), %ebx /* ebx = x->val */
  44. movq 8(%rdi), %rdi /* rdi <- (rdi+8) */
  45. call add2 /* chamo add2, que retorna %eax */
  46. addl %ebx, %eax /* eax = eax (retorno da ultima chamada de add2) + x->val */
  47.  
  48. FIM:
  49. movq -8(%rbp), %rbx /* restaurando o ebx da função chamadora que estava no RA */
  50. leave
  51. ret
Tags: assembly
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement