Implementing recursive functions using ARM assembly in Keil homework help

July 10, 2024
Rehana Magnus
Assembly Language
Rehana Magnus, PhD in Computer Science from the esteemed Acadia Institute of Technology, Canada. With 6 years of experience, specializes in assembly language programming. Proficient in low-level coding, optimizing performance, and enhancing system functionality.
Key Topics
• Using Recursive Functions to Solve Hanoi Tower Problem in Keil IDE
Tip of the day
News

The homework deals with implementing the solution to the Hanoi tower problem using ARM assembly. The program uses a recursive function to implement the solution. The function follows the ARM calling convention and saves the used registers on the stack. The number of required moves is calculated by the function and returned to the main program. The program is simulated on the Keil IDE. Here is the solution to demonstrate the quality of work delivered via our ARM assembly homework help service.

Using Recursive Functions to Solve Hanoi Tower Problem in Keil IDE

Source Code

```Solution ; Program to solve the Towers of Hanoi problem for 6 disks AREA data, ALIGN=2 nMoves SPACE 4 GLOBAL __main AREA program, CODE, READONLY EXPORT __main __main MOV R0, #0 ; start with number of moves = 0 LDR R1, =nMoves ; load nMoves address STR R0, [R1] ; save nMoves = 0 MOV R0, #6 ; solve for n=6 MOV R1, #1 ; Move from peg 1 MOV R2, #3 ; to peg 3 MOV R3, #2 ; middle peg is 2 BL HANOI ; solve the Hanoi puzzle HANOI(n, 6, 1, 3, 2) LDR R1, =nMoves ; load nMoves address LDR R0, [R1] ; load the final number of moves DONE B DONE ; stay here to end program ALIGN ; Function Hanoi, solves the Towers of Hanoi problem using recursion ; saves the number of moves in the global variable nMoves ; HANOI(n, from, to, mid) HANOI PUSH {R4-R7, LR} ; save registers CMP R0, #1 ; if we are solving for 1 disk BNE HANOI_MOVE ; if it's not 1, make move LDR R1, =nMoves ; load nMoves address LDR R0, [R1] ; load current number of moves ADD R0, R0, #1 ; increment 1 move STR R0, [R1] ; update moves in variable B HANOI_RETURN ; return to caller HANOI_MOVE MOV R4, R0 ; save arguments in saved registers MOV R5, R1 MOV R6, R2 MOV R7, R3 SUB R0, R4, #1 ; pass n - 1 for call MOV R1, R5 ; pass same from value MOV R2, R7 ; pass old mid as to for call MOV R3, R6 ; pass old to as mid for call BL HANOI ; HANOI(n-1, from, mid, to) LDR R1, =nMoves ; load nMoves address LDR R0, [R1] ; load current number of moves ADD R0, R0, #1 ; increment 1 move STR R0, [R1] ; update moves in variable SUB R0, R4, #1 ; pass n - 1 for call MOV R1, R7 ; pass old mid as from value MOV R2, R6 ; pass old to as to for call MOV R3, R5 ; pass old from as mid for call BL HANOI ; HANOI(n-1, mid, to, from) HANOI_RETURN POP {R4-R7, LR} ; restore registers BX LR ; return to caller ALIGN END ```

Related Samples

On ProgrammingHomeworkHelp.com, we offer comprehensive support for Assembly Language assignments.  Whether you're struggling with syntax, debugging, or complex programming tasks, our samples are designed to guide you through each step. By exploring these samples, you can gain valuable insights and enhance your understanding of Assembly Language. Let us help you excel in your assignments and improve your programming skills with our reliable and tailored assistance.