+1 (315) 557-6473 

Program To Check If A Magic Square Is Valid In ARM Assembly Language Using KEIL Assignment Solution.


Instructions

Objective
Write an ARM assignment to check if a magic square is valid in ARM assembly language using KEIL.

Requirements and Specifications

Program to check if a magic square is valid in ARM assembly language using KEIL
Screenshots of output
Program to check if a magic square is valid in ARM assembly language using KEIL 1
Program to check if a magic square is valid in ARM assembly language using KEIL 2
Source Code
  AREA magicSquares, CODE
  EXPORT __main
  ALIGN
  ENTRY
__main PROC
  ; the code will initialize R1 and use a test matrix to run the code,
  ; if R1 is set somewhere else and a matrix is set at 0x20000010,
  ; then uncomment the following line
  ; B start
  MOV R1, #4 ; matrix size N
  ; copy test matrix to matrix space at 0x20000010
  LDR R2, =tstmat1 ; start address of test matrix 1
  ;LDR R2, =tstmat2 ; start address of test matrix 2
  LDR R3, =0x20000010 ; start address of matrix
  MOV R4, R1 ; number of rows
copyrows
  MOV R5, R1 ; number of cols
copycols
  LDR R0, [R2], #4 ; load value from test matrix
  STR R0, [R3], #4 ; store value in matrix
  SUBS R5, R5, #1 ; decrement remaining cols
  BNE copycols ; repeat while not zero
  SUBS R4, R4, #1 ; decrement remaining rows
  BNE copyrows ; repeat while not zero
start
  ; fill rows variable
  LDR R2, =0x20000010 ; load address of matrix
  LDR R3, =rows ; point to start of rows array
  LSL R4, R1, #2 ; size of a row = N*4
  MOV R5, #0 ; start in position 0
loopr
  STR R2, [R3, R5, LSL #2]; save address in rows
  ADD R2, R2, R4 ; advance to next row
  ADD R5, R5, #1 ; increment index
  CMP R5, R1 ; compare index with N
  BLT loopr ; repeat while i < N
  ; fill cols variable
  LDR R2, =0x20000010 ; load address of matrix
  LDR R3, =cols ; point to start of cols array
  MOV R4, #0 ; start in position 0
loopc
  STR R2, [R3, R4, LSL #2]; save address in cols
  ADD R2, R2, #4 ; advance to next col
  ADD R4, R4, #1 ; increment index
  CMP R4, R1 ; compare index with N
  BLT loopc ; repeat while i < N
  ; calculate sum number = N*(N^2 + 1)/2
  MUL R2, R1, R1 ; N*N
  ADD R3, R2, #1 ; N*N + 1
  MUL R3, R3, R1 ; N*(N*N + 1)
  LSR R3, R3, #1 ; N*(N*N + 1)/2
  MOV R8, #0 ; assume it's not magic at start
  ; First we test the matrix elements
  LDR R4, =rows ; load rows
  MOV R5, #0 ; row index
loop1
  LDR R6, [R4, R5, LSL #2] ; load row address
  MOV R7, #0 ; col index
loop2
  LDR R0, [R6, R7, LSL #2] ; load element from row
  CMP R0, #1 ; check if >= 1
  BLT endTest ; if < 1, it's not a magic square
  CMP R0, R2 ; check if <= N^2
  BGT endTest ; if > N^2, it's not a magic square
  ADD R7, R7, #1 ; increment col index
  CMP R7, R1 ; compare index with N
  BLT loop2 ; repeat while col < N
  ADD R5, R5, #1 ; increment row index
  CMP R5, R1 ; compare index with N
  BLT loop1 ; repeat while row < N
  ; We now test the row sums
  LDR R4, =rows ; load rows
  MOV R5, #0 ; row index
sumrows1
  LDR R6, [R4, R5, LSL #2] ; load row address
  MOV R7, #0 ; col index
  MOV R9, #0 ; start sum in zero
sumcols1
  LDR R0, [R6, R7, LSL #2] ; load element from row
  ADD R9, R9, R0 ; add element to sum
  ADD R7, R7, #1 ; increment col index
  CMP R7, R1 ; compare index with N
  BLT sumcols1 ; repeat while col < N
  CMP R9, R3 ; check if sum = N*(N*N + 1)/2
  BNE endTest ; if != N^2, it's not a magic square
  ADD R5, R5, #1 ; increment row index
  CMP R5, R1 ; compare index with N
  BLT sumrows1 ; repeat while row < N
  ; We now test the column sums
  LDR R4, =cols ; load cols
  MOV R5, #0 ; col index
sumcols2
  LDR R6, [R4, R5, LSL #2] ; load col address
  MOV R7, #0 ; row index
  MOV R9, #0 ; start sum in zero
sumrows2
  MUL R0, R7, R1 ; row * num cols
  LSL R0, R0, #2 ; address of element = row * num cols * 4
  LDR R0, [R6, R0] ; load element from col
  ADD R9, R9, R0 ; add element to sum
  ADD R7, R7, #1 ; increment row index
  CMP R7, R1 ; compare index with N
  BLT sumrows2 ; repeat while row < N
  CMP R9, R3 ; check if sum = N*(N*N + 1)/2
  BNE endTest ; if != N^2, it's not a magic square
  ADD R5, R5, #1 ; increment col index
  CMP R5, R1 ; compare index with N
  BLT sumcols2 ; repeat while col < N
  ; We now test the first diagonal sum
  LDR R4, =rows ; load rows
  MOV R5, #0 ; row index
  MOV R6, #0 ; start sum in zero
sumdiag1
  LDR R7, [R4, R5, LSL #2] ; load row address
  LDR R0, [R7, R5, LSL #2] ; load element from row at index position (row,row)
  ADD R6, R6, R0 ; add element to sum
  ADD R5, R5, #1 ; increment row index
  CMP R5, R1 ; compare index with N
  BLT sumdiag1 ; repeat while row < N
  CMP R6, R3 ; check if sum = N*(N*N + 1)/2
  BNE endTest ; if != N^2, it's not a magic square
  ; Lastly, we test the second diagonal sum
  LDR R4, =rows ; load rows
  SUB R5, R1, #1 ; row index = N-1
  MOV R6, #0 ; col index = 0
  MOV R7, #0 ; start sum in zero
sumdiag2
  LDR R9, [R4, R5, LSL #2] ; load row address
  LDR R0, [R9, R6, LSL #2] ; load element from row at index position (row,col)
  ADD R7, R7, R0 ; add element to sum
  SUB R5, R5, #1 ; decrement row index
  ADD R6, R6, #1 ; increment col index
  CMP R6, R1 ; compare col with N
  BLT sumdiag2 ; repeat while col < N
  CMP R7, R3 ; check if sum = N*(N*N + 1)/2
  BNE endTest ; if != N^2, it's not a magic square
  MOV R8, #1 ; if we end all tests, matrix is a magic square
endTest
  ; here, R8 will have 1 if the matrix is magic and 0 otherwise
done B done
  ENDP
  ALIGN
  AREA myData1, DATA, READWRITE
  SPACE 16 ; leave 16 bytes (0x10)
matrix SPACE 400 ; start of matrix at 0x20000010, at most 10x10
rows SPACE 40 ; space to save rows (at most 10)
cols SPACE 40 ; space to save columns (at most 10)
  AREA myData2, DATA, READONLY
tstmat1 DCD 16, 3, 2, 13 ; magic square matrix
  DCD 5, 10, 11, 8
  DCD 9, 6, 7, 12
  DCD 4, 15, 14, 1
tstmat2 DCD 5, 10, 11, 8 ; swapped 2 first rows, not magic
  DCD 16, 3, 2, 13
  DCD 9, 6, 7, 12
  DCD 4, 15, 14, 1
  END