Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .intel_syntax noprefix
- .text
- .globl main
- main:
- push ebp
- mov ebp, esp
- # ebx = argv
- mov ebx, [ebp + 12]
- # if (argc < 3) {
- cmp dword ptr [ebp + 8], 3
- jge parameters_ok
- # printf("Poprawne uzycie %s m n", argv[0]);
- push [ebx]
- push offset usage
- call printf
- add esp, 8
- # return 1
- mov eax, 1
- jmp exit
- # }
- parameters_ok:
- # pierwszy argument z lini poleceń ecx = atoi(argv[1])
- push [ebx + 4]
- call atoi
- add esp, 4
- # atoi zwraca wartosc w eax i powinniśmy teraz zrobić mov ecx, eax
- # ale ponieważ atoi nadpisuje rejestr ecx to zamiast ją kopiować eax do ecx
- # wrzucimy tę wartość na stos i potem ją zdejmiemy
- push eax
- # drugi argument z linii polecen wrzuc do eax: eax = atoi(argv[2]) (skoro atoi zwraca wartosc w eax, to wystaczy zawolac atoi i tyle)
- push [ebx + 8]
- call atoi
- add esp, 4
- # wrzucamy ze stosu wartość pierwszego argumentu lini poleceń do ecx
- pop ecx
- xor edx, edx
- xor ebx, ebx
- push eax
- call f0
- add esp, 4
- push edx
- push offset msg
- call printf
- add esp, 8
- mov eax, 0
- exit:
- mov esp, ebp
- pop ebp
- ret
- f0:
- mov edx,0
- push ebp
- mov ebp, esp
- push eax
- push ecx
- push ebx
- push edi
- push esi
- mov eax,[ebp+8]
- cmp ecx,0
- jne f1
- mov edx,eax
- add edx,1
- jmp final
- f1:
- cmp ecx,1
- jne f2
- mov edx, eax
- jmp final
- f2:
- cmp ecx, 2
- jne f3
- mov edx, eax
- add edx,2
- jmp final
- f3:
- # edi = n (stary ecx)
- mov edi, ecx
- # esi = m (stary eax)
- mov esi, eax
- # jako że edx będzie zajęty przez 'f0' to użyjemy rejestru ebx aby trzymał
- # częściowe sumy f(n - 1, m) - 2 * f(n - 2, m + 1) - f(n - 3, m)
- xor ebx, ebx
- # edx = f(n - 1, m)
- dec ecx
- push eax
- call f0
- add esp, 4
- # ebx = f(n - 1, m)
- mov ebx, edx
- # edx = f(n - 2, m + 1)
- mov ecx, edi
- sub ecx, 2
- inc eax
- push eax
- call f0
- add esp, 4
- # ebx = f(n - 1, m) - f(n - 2, m + 1)
- sub ebx, edx
- # ebx = f(n - 1, m) - 2 * f(n - 2, m + 1)
- sub ebx, edx
- # edx = f(n - 3, m)
- mov ecx, edi
- mov eax, esi
- sub ecx, 3
- push eax
- call f0
- add esp, 4
- # ebx = f(n - 1, m) - 2 * f(n - 2, m + 1) - f(n - 3, m)
- sub ebx, edx
- mov edx, ebx
- final:
- pop esi
- pop edi
- pop ebx
- pop ecx
- pop eax
- pop ebp
- ret
- .data
- msg:
- .asciz "Wynik = %d\n"
- .byte 0
- usage:
- .asciz "Poprawne uzycie %s m n\n"
- .byte 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement