Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- .STACK 100h
- .DATA
- fibo0 DD ?
- fibo1 DD ?
- fibo2 DD ?
- i DW ?
- index DW ?
- res DD ?
- .CODE
- .386
- ;extern unsigned long int find_largest_fibo(unsigned long int n, unsigned int *index)
- ; [BP+4] [BP+8]
- PUBLIC _find_largest_fibo
- _find_largest_fibo PROC NEAR
- PUSH BP
- MOV BP,SP
- ;FIBO0=FIBO1=FIBO2=1
- MOV EAX,1
- MOV fibo0, EAX
- MOV fibo1, EAX
- MOV fibo2, EAX
- ;i=0
- XOR AX,AX
- MOV i,AX
- ;EBX=n=[bp+4]
- MOV EBX, DWORD PTR [BP+4]
- ;for(i=0;n>=fibo2;i++)
- JMP checkn
- myLoop:
- ;fibo2=fibo1+fibo0
- MOV EAX, fibo0
- ADD EAX, fibo1
- MOV fibo2, EAX
- ;fibo0=fibo1
- MOV EAX, fibo1
- MOV fibo0, EAX
- ;fibo1=fibo2
- MOV EAX, fibo2
- MOV fibo1, EAX
- INC i
- checkn:
- CMP EBX, fibo2
- JAE myLoop
- MOV DI, WORD PTR[BP+8]
- MOV AX, i
- MOV [DI], AX
- PUSH fibo0
- POP AX
- POP DX
- POP BP
- RET
- _find_largest_fibo ENDP
- ;extern unsigned long int compute_fibo_code(unsigned long int n);
- ; [BP+4]
- PUBLIC _compute_fibo_code
- _compute_fibo_code PROC NEAR
- PUSH BP
- MOV BP, SP
- MOV EBX, DWORD PTR [BP+4]
- JMP check
- whileLoop:
- PUSH OFFSET index
- PUSH EBX
- CALL _find_largest_fibo
- ADD SP, 6
- PUSH DX
- PUSH AX
- POP EAX
- ;n-=eax
- SUB EBX, EAX
- ;adding bit indexed "i" to result
- XOR EAX,EAX
- INC EAX
- MOV CX, index
- SHL EAX, CL
- ADD res, EAX
- check:
- CMP EBX,0
- JA whileLoop
- PUSH res
- POP AX
- POP DX
- POP BP
- RET
- _compute_fibo_code ENDP
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement