Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- section .bss
- value resb 32
- section .text
- GLOBAL _start
- _start:
- mov rax, 0
- mov rdi, 0
- mov rsi, value
- mov rdx, 32
- syscall
- mov rdi, value
- call _strlen
- sub rax, 1
- mov rcx, rax
- lea rsi, [value]
- call string_to_int
- push qword rax ; -> 1346269
- call fibonacci
- add rsp, 8
- call write_rax
- mov edi, 0 ; return 0 (success)
- mov eax, 60 ; sys_exit
- syscall
- fibonacci:
- push rbp
- push rbx
- mov rbp, rsp
- add rbp, 24
- mov ebx, [rbp]
- cmp EBX,0 ; Check for base case
- je base ; It is base if (n <= 1)
- cmp EBX,1
- je base2
- lea ecx,[ebx-1]
- push rcx
- call fibonacci ; Calculate fibonacci for (EBX - 1)
- pop rcx
- push rax
- lea ecx,[ebx-2]
- push rcx
- call fibonacci ; Calculate fibonacci for (EBX - 2)
- pop rcx
- pop rcx
- add eax,ecx ; eax = fibonacci(N-2) + fibonacci(N-1)
- jmp end
- base: ; Base case
- mov EAX,2
- jmp end ; The result would be 1
- base2: ; Base case
- mov EAX,1 ; The result would be 1
- end:
- pop rbx
- pop rbp
- ret
- write_rax:
- mov rsi, rsp ; Keyword: Red Zone (https://en.wikipedia.org/wiki/Red_zone_%28computing%29)
- sub rsi, 1
- mov byte [rsi], `\n` ; Line feed
- mov ecx, 10 ; Divisor
- .L1:
- xor rdx, rdx
- div rcx ; EDX:EAX / ECX -> EAX, remainder EDX
- or dl, 48 ; Convert remainder to ASCII
- sub rsi, 1
- mov [rsi], dl ; Store remainder reversed on the stack
- test rax, rax
- jne .L1
- mov rdx, rsp ; RDX: message string length
- sub rdx, rsi
- mov rdi, 1 ; RDI=1: stdout
- mov rax, 1 ; sys_write
- syscall ; /usr/include/x86_64-linux-gnu/asm/unistd_64.h
- ret
- string_to_int:
- xor rbx,rbx ; czysczę ebx
- l2:
- movzx rax,byte[rsi] ; ???
- inc rsi ; esi ++
- sub al,'0' ; najmniej znaczący bit - 48
- imul rbx,10 ; mnożenie ebax = ebax * 10
- add rbx,rax ; ebx += eax
- loop l2 ; while (--ecx)
- mov rax, rbx ; eax = ebx
- ret
- _strlen:
- push rcx ; save and clear out counter
- xor rcx, rcx
- _strlen_next:
- cmp [rdi], byte 0 ; null byte yet?
- jz _strlen_null ; yes, get out
- inc rcx ; char is ok, count it
- inc rdi ; move to next char
- jmp _strlen_next ; process again
- _strlen_null:
- mov rax, rcx ; rcx = the length (put in rax)
- pop rcx ; restore rcx
- ret ; get out
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement