This commit is contained in:
sherlock 2025-08-28 10:11:40 +05:30
parent c37a788cbd
commit dbabb956d5
16 changed files with 1319 additions and 426 deletions

View file

@ -9,29 +9,104 @@ __Vectors
ENTRY
EXPORT Reset_Handler
; ========================================================================================
; FACTORIAL.asm - Recursive Factorial Calculation
; ========================================================================================
; This program demonstrates recursive factorial computation using ARM assembly.
; The factorial of a number n (n!) is the product of all positive integers less
; than or equal to n. This implementation uses the call stack to handle recursion.
; ========================================================================================
; Reset_Handler - Main program execution
; ========================================================================================
; Algorithm Overview:
; 1. Load the input number (5) into R1
; 2. Call the recursive factorial function (fact)
; 3. Store the result from R0 to memory location 0x10001000
; 4. Enter infinite loop for program termination
Reset_Handler
LDR R1, =5
BL fact
LDR R12, =0x10001000
STR R0, [R12]
; Step 1: Load input parameter and call factorial function
; Load the number for which to calculate factorial (n = 5)
LDR R1, =5 ; R1 = 5 (input parameter for factorial)
; Call the recursive factorial function
; BL (Branch with Link) saves return address in LR and jumps to fact
BL fact ; Call factorial function, result returned in R0
; Step 2: Store the result
; Load destination address into R12
LDR R12, =0x10001000 ; R12 = 0x10001000 (result storage address)
; Store the factorial result (in R0) to memory
STR R0, [R12] ; Store factorial result to [R12]
; Step 3: Program termination
STOP
B STOP
B STOP ; Branch to STOP label (infinite loop)
; ========================================================================================
; fact - Recursive Factorial Function
; ========================================================================================
; Recursive algorithm for calculating n!
; Base case: if n <= 1, return 1
; Recursive case: return n * factorial(n-1)
; Parameters: R1 = n (input)
; Returns: R0 = n! (result)
; Uses: R2 (temporary register for stack operations)
fact
CMP R1, #1
BLE base_case
PUSH{R1, LR}
SUB R1, R1, #1
BL fact
POP{R2, LR}
MUL R0, R0, R2
BX LR
; Step 1: Check base case
; Compare input parameter with 1
CMP R1, #1 ; Compare R1 with 1
; If R1 <= 1, branch to base_case
BLE base_case ; If R1 <= 1, return 1
; Step 2: Recursive case - prepare for recursive call
; Save current R1 and LR (return address) on the stack
PUSH{R1, LR} ; Push R1 and LR onto stack
; Decrement n for recursive call: R1 = R1 - 1
SUB R1, R1, #1 ; R1 = R1 - 1
; Recursive call to factorial function
BL fact ; Call fact(R1-1), result in R0
; Step 3: Return from recursion - multiply result
; Restore saved R1 (original n) and LR from stack
POP{R2, LR} ; Pop LR and original R1 into R2
; Multiply current result (R0) by original n (R2)
; R0 = R0 * R2 = factorial(n-1) * n
MUL R0, R0, R2 ; R0 = R0 * R2
; Return from function (branch to address in LR)
BX LR ; Return to caller
; ========================================================================================
; base_case - Base case handler for factorial
; ========================================================================================
; When n <= 1, factorial = 1
; Returns: R0 = 1
base_case
MOV R0, #1
BX LR
; Set return value to 1 (base case for factorial)
MOV R0, #1 ; R0 = 1 (factorial of 0 or 1 is 1)
END
; Return from function
BX LR ; Return to caller
; ========================================================================================
; Execution Example:
; ========================================================================================
; Calculating factorial(5):
; fact(5) -> calls fact(4) -> calls fact(3) -> calls fact(2) -> calls fact(1)
; fact(1) returns 1
; fact(2) returns 2 * 1 = 2
; fact(3) returns 3 * 2 = 6
; fact(4) returns 4 * 6 = 24
; fact(5) returns 5 * 24 = 120
; Final result: 120 is stored at memory location 0x10001000
END ; End of the assembly program