From 80088628a2302ef455049236425014c4acee9341 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 11 Mar 2024 18:14:41 -0500 Subject: [PATCH 1/2] Changes to be committed: new file: fib3.S --- Fibonacci/fib3.S | 116 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 Fibonacci/fib3.S diff --git a/Fibonacci/fib3.S b/Fibonacci/fib3.S new file mode 100644 index 0000000..ad7f364 --- /dev/null +++ b/Fibonacci/fib3.S @@ -0,0 +1,116 @@ +.file "fib3.S" +.section .note.GNU-stack +.extern printf, atoi, calloc, free + +// +// Expected Compile Command: gcc -o fib3 fib3.S +// +// Purpose: Print the n'th fibonacci term to standard output +// Usage: ./fib3 n +// +// n = Fibinacci term to output\n" +// + + +.data +.section .rodata + +format_str_result: .asciz "Fibonacci Number: %llu\n" +usage_txt: .asciz "Usage: ./fib3 n \n\n\ + n = Fibinacci term to output\n\n" + +.text + +start_fib: // %rsi = fibanocci_sequence ( %rsi'th term) BORKS %rdi, %rcx, %rdx + // Base case: if n<=1, return n + cmp $1, %rsi + jle end_fib + + // Get enough memory to cover the fib sequence with calloc + movq $8, %rdi + push %rsi + inc %rsi // Need n+1 memory, because there's a 0th term needing accounting for. + call calloc // %rax = calloc( %rdi, %rsi) + pop %rsi + + // Check if calloc Failed + cmp $0, %rax + jle exit + + // Save calloc location a little out of way for indirect addressing. + movq %rax, %rdx + + // Populate initial values + movq $0, (%rax) + movq $1, 8(%rax) + movq $2, %rcx + +fib_iterate: + // fib (n) = fib(n-1) + fib(n-2) + // Counter %rcx starts at 2 until desired n. + // Iterate until desired n (%rsi). + // %rax is a moving pointer for reading prior sequence locations in the heap. + // (%rdx,%rcx,8) is indirect address to fib(n) + + // Copy fib(n-2) -> fib(n) + movq (%rax), %rdi + movq %rdi, (%rdx,%rcx,8) + add $8, %rax + + // Add fib (n-1) to fib(n-2) at fib(n) locaton. + movq (%rax), %rdi + add %rdi, (%rdx,%rcx,8) + + //Check that counter is less than ultimate desired, and if so iterate. + //If allowed to increment past, there will be no memory there. + cmp %rsi, %rcx + jge fib_finalize + + //Iterate. + inc %rcx + jmp fib_iterate + +fib_finalize: + pushq (%rdx,%rcx,8) // Save the result + movq %rdx, %rdi + call free + popq %rsi //Put result in expected location + +end_fib: + ret + + +print_fib: + xorq %rax, %rax //Cause the internet said you had to. + leaq format_str_result(%rip), %rdi + call printf // printf( %rdi, %rsi) + ret + +usage_msg: + xorq %rax, %rax //Cause the internet said you had to. + leaq usage_txt(%rip), %rdi + call printf + jmp exit + +.global main +main: + //Expecting 2 arguments, otherwise exit. + cmpq $2, %rdi //Check if argc is correct + jne usage_msg + + //Convert argument string to integer + addq $8, %rsi //argv[1] + movq (%rsi), %rdi // Load address of argv[1] + call atoi // %rax = atoi( (char*)%rdi ) + + //Run Fibonacci algorithm + movq %rax, %rsi + call start_fib // fibonacci('n' = %rsi) + + call print_fib + +exit: + mov $231, %rax + mov $0, %rsi + syscall + From 8576a3a80ae54e9e90d570f90fcb5be83d7c7d88 Mon Sep 17 00:00:00 2001 From: robert Date: Mon, 11 Mar 2024 18:32:58 -0500 Subject: [PATCH 2/2] Changes for clarity. Added code for case of a negative number. Changes to be committed: modified: fib3.S --- Fibonacci/fib3.S | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/Fibonacci/fib3.S b/Fibonacci/fib3.S index ad7f364..f4ed624 100644 --- a/Fibonacci/fib3.S +++ b/Fibonacci/fib3.S @@ -5,6 +5,8 @@ // // Expected Compile Command: gcc -o fib3 fib3.S // +// Program Enty: main +// // Purpose: Print the n'th fibonacci term to standard output // Usage: ./fib3 n // @@ -17,11 +19,11 @@ format_str_result: .asciz "Fibonacci Number: %llu\n" usage_txt: .asciz "Usage: ./fib3 n \n\n\ - n = Fibinacci term to output\n\n" + n = Fibonacci term to output. Must be positive number.\n\n" .text -start_fib: // %rsi = fibanocci_sequence ( %rsi'th term) BORKS %rdi, %rcx, %rdx +fibonacci: // %rsi = fibanocci_sequence ( %rsi'th term) BORKS %rdi, %rcx, %rdx // Base case: if n<=1, return n cmp $1, %rsi jle end_fib @@ -45,7 +47,7 @@ start_fib: // %rsi = fibanocci_sequence ( %rsi'th term) BORKS %rdi, %rcx, %rdx movq $1, 8(%rax) movq $2, %rcx -fib_iterate: +fib_loop: // fib (n) = fib(n-1) + fib(n-2) // Counter %rcx starts at 2 until desired n. // Iterate until desired n (%rsi). @@ -68,12 +70,12 @@ fib_iterate: //Iterate. inc %rcx - jmp fib_iterate + jmp fib_loop fib_finalize: pushq (%rdx,%rcx,8) // Save the result movq %rdx, %rdi - call free + call free // *** See!? *** popq %rsi //Put result in expected location end_fib: @@ -87,7 +89,7 @@ print_fib: ret usage_msg: - xorq %rax, %rax //Cause the internet said you had to. + xorq %rax, %rax leaq usage_txt(%rip), %rdi call printf jmp exit @@ -105,12 +107,14 @@ main: //Run Fibonacci algorithm movq %rax, %rsi - call start_fib // fibonacci('n' = %rsi) + cmp $0, %rsi + jl usage_msg + + call fibonacci // fibonacci('n' = %rsi) - call print_fib + call print_fib // Output the result exit: mov $231, %rax mov $0, %rsi syscall -