init
This commit is contained in:
+134
@@ -0,0 +1,134 @@
|
||||
; Fibonacci number generator using AMD64 assembly with Windows syscalls
|
||||
; Uses lookup table for O(1) access
|
||||
; Author: Assistant
|
||||
|
||||
.686p
|
||||
.xmm
|
||||
.model flat, C
|
||||
|
||||
include kernel32.inc
|
||||
include user32.inc
|
||||
|
||||
includelib kernel32.lib
|
||||
includelib user32.lib
|
||||
|
||||
.data
|
||||
; Precomputed Fibonacci numbers (first 50)
|
||||
fib_table DWORD 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
|
||||
fib_table DWORD 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765
|
||||
fib_table DWORD 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040
|
||||
fib_table DWORD 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155
|
||||
fib_table DWORD 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903
|
||||
|
||||
; Error messages
|
||||
msg_error DWORD 'Error: Index out of range', 0
|
||||
msg_success DWORD 'Fibonacci number: ', 0
|
||||
|
||||
; Console handles
|
||||
hStdOut HANDLE ?
|
||||
|
||||
.code
|
||||
|
||||
; Function to get Fibonacci number at index n (0-based)
|
||||
; Input: EAX = index
|
||||
; Output: EAX = Fibonacci number
|
||||
get_fibonacci PROC
|
||||
; Validate input
|
||||
cmp eax, 0
|
||||
jl invalid_input
|
||||
|
||||
; Check if index is within range (max 50)
|
||||
cmp eax, 49
|
||||
jg invalid_input
|
||||
|
||||
; Calculate address in table
|
||||
mov ebx, eax
|
||||
shl ebx, 2 ; Multiply by 4 (DWORD size)
|
||||
|
||||
; Load Fibonacci number from table
|
||||
mov eax, fib_table[ebx]
|
||||
ret
|
||||
|
||||
invalid_input:
|
||||
xor eax, eax ; Return 0 for invalid input
|
||||
ret
|
||||
get_fibonacci ENDP
|
||||
|
||||
; Function to print a number to console
|
||||
print_number PROC
|
||||
; Input: EAX = number to print
|
||||
push eax
|
||||
push ebx
|
||||
push ecx
|
||||
push edx
|
||||
|
||||
; Convert number to string and print
|
||||
mov ebx, 10
|
||||
mov ecx, 0 ; Digit count
|
||||
|
||||
; Special case for zero
|
||||
cmp eax, 0
|
||||
jne convert_loop
|
||||
mov ecx, 1
|
||||
jmp print_digits
|
||||
|
||||
convert_loop:
|
||||
cmp eax, 0
|
||||
je print_digits
|
||||
|
||||
xor edx, edx ; Clear high bits
|
||||
div ebx ; Divide by 10
|
||||
push edx ; Push remainder (digit)
|
||||
inc ecx ; Increment digit count
|
||||
jmp convert_loop
|
||||
|
||||
print_digits:
|
||||
cmp ecx, 0
|
||||
je done_printing
|
||||
|
||||
pop eax ; Get digit back
|
||||
add eax, '0' ; Convert to ASCII
|
||||
push eax
|
||||
|
||||
; Write character to console
|
||||
mov edx, esp
|
||||
push 1 ; Number of characters
|
||||
push edx ; Address of character
|
||||
push hStdOut ; Handle
|
||||
call WriteConsoleA
|
||||
|
||||
add esp, 12 ; Clean up stack
|
||||
|
||||
dec ecx
|
||||
jmp print_digits
|
||||
|
||||
done_printing:
|
||||
pop edx
|
||||
pop ecx
|
||||
pop ebx
|
||||
pop eax
|
||||
ret
|
||||
print_number ENDP
|
||||
|
||||
; Main program entry point
|
||||
main PROC
|
||||
; Get console handle
|
||||
push -11 ; STD_OUTPUT_HANDLE
|
||||
call GetStdHandle
|
||||
mov hStdOut, eax
|
||||
|
||||
; Test Fibonacci numbers
|
||||
mov eax, 10 ; Get 11th Fibonacci number (0-indexed)
|
||||
call get_fibonacci
|
||||
|
||||
; Print result
|
||||
push eax
|
||||
call print_number
|
||||
add esp, 4
|
||||
|
||||
; Exit program
|
||||
push 0
|
||||
call ExitProcess
|
||||
main ENDP
|
||||
|
||||
END main
|
||||
Reference in New Issue
Block a user