Advertisement
Guest User

Untitled

a guest
Nov 24th, 2017
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. .intel_syntax noprefix
  2. .text
  3. .globl main
  4.  
  5. main:
  6. push ebp
  7. mov ebp, esp
  8.  
  9. # ebx = argv
  10. mov ebx, [ebp + 12]
  11.  
  12. # if (argc < 3) {
  13. cmp dword ptr [ebp + 8], 3
  14. jge parameters_ok
  15. # printf("Poprawne uzycie %s m n", argv[0]);
  16. push [ebx]
  17. push offset usage
  18. call printf
  19. add esp, 8
  20. # return 1
  21. mov eax, 1
  22. jmp exit
  23. # }
  24.  
  25. parameters_ok:
  26. # pierwszy argument z lini poleceń ecx = atoi(argv[1])
  27. push [ebx + 4]
  28. call atoi
  29. add esp, 4
  30. # atoi zwraca wartosc w eax i powinniśmy teraz zrobić mov ecx, eax
  31. # ale ponieważ atoi nadpisuje rejestr ecx to zamiast ją kopiować eax do ecx
  32. # wrzucimy tę wartość na stos i potem ją zdejmiemy
  33. push eax
  34.  
  35. # drugi argument z linii polecen wrzuc do eax: eax = atoi(argv[2]) (skoro atoi zwraca wartosc w eax, to wystaczy zawolac atoi i tyle)
  36. push [ebx + 8]
  37. call atoi
  38. add esp, 4
  39.  
  40. # wrzucamy ze stosu wartość pierwszego argumentu lini poleceń do ecx
  41. pop ecx
  42.  
  43. xor edx, edx
  44. xor ebx, ebx
  45. push eax
  46. call f0
  47. add esp, 4
  48. push edx
  49. push offset msg
  50. call printf
  51. add esp, 8
  52. mov eax, 0
  53.  
  54. exit:
  55. mov esp, ebp
  56. pop ebp
  57. ret
  58.  
  59. f0:
  60. mov edx,0
  61. push ebp
  62. mov ebp, esp
  63. push eax
  64. push ecx
  65. push ebx
  66. push edi
  67. push esi
  68. mov eax,[ebp+8]
  69. cmp ecx,0
  70. jne f1
  71. mov edx,eax
  72. add edx,1
  73. jmp final
  74.  
  75. f1:
  76. cmp ecx,1
  77. jne f2
  78. mov edx, eax
  79. jmp final
  80.  
  81. f2:
  82. cmp ecx, 2
  83. jne f3
  84. mov edx, eax
  85. add edx,2
  86. jmp final
  87.  
  88. f3:
  89. # edi = n (stary ecx)
  90. mov edi, ecx
  91. # esi = m (stary eax)
  92. mov esi, eax
  93. # jako że edx będzie zajęty przez 'f0' to użyjemy rejestru ebx aby trzymał
  94. # częściowe sumy f(n - 1, m) - 2 * f(n - 2, m + 1) - f(n - 3, m)
  95. xor ebx, ebx
  96.  
  97. # edx = f(n - 1, m)
  98. dec ecx
  99. push eax
  100. call f0
  101. add esp, 4
  102. # ebx = f(n - 1, m)
  103. mov ebx, edx
  104.  
  105. # edx = f(n - 2, m + 1)
  106. mov ecx, edi
  107. sub ecx, 2
  108. inc eax
  109. push eax
  110. call f0
  111. add esp, 4
  112. # ebx = f(n - 1, m) - f(n - 2, m + 1)
  113. sub ebx, edx
  114. # ebx = f(n - 1, m) - 2 * f(n - 2, m + 1)
  115. sub ebx, edx
  116.  
  117. # edx = f(n - 3, m)
  118. mov ecx, edi
  119. mov eax, esi
  120. sub ecx, 3
  121. push eax
  122. call f0
  123. add esp, 4
  124. # ebx = f(n - 1, m) - 2 * f(n - 2, m + 1) - f(n - 3, m)
  125. sub ebx, edx
  126. mov edx, ebx
  127.  
  128. final:
  129. pop esi
  130. pop edi
  131. pop ebx
  132. pop ecx
  133. pop eax
  134. pop ebp
  135. ret
  136.  
  137.  
  138. .data
  139. msg:
  140. .asciz "Wynik = %d\n"
  141. .byte 0
  142. usage:
  143. .asciz "Poprawne uzycie %s m n\n"
  144. .byte 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement