Raspberry Pi

Code in Assembly Language, Raspberry Pi, GCC Compiler, Code Editor

In this example; the solution to a lab assignment has been provided. The equipments required to carry out this assignment are raspberry pi, gcc compiler, and text/code editor. This assignment has to be done on bright space. Here a custom shape generator has to be created. The code written in assembly language would generate boxes bordered by asterisks and filled with empty spaces. In this program a constant BOXSIZE is defined initially. The output of program exhibits a relationship between box size and four sides of a box.

SOLUTION: –

.equ BOXSIZE, 10

.data

asterisk:   .ascii “*”

space:      .ascii ” ”

newline:    .ascii “\n”

.text

.global     _start

_start:

PUSH  {r4-r7, lr}       @ save the registers and LR

@ print the box

MOV     r4, #0              @ r4 will be the row index

forRow:

CMP     r4, #BOXSIZE        @ compare with box size

BGE     endForRow           @ if above size, end loop

MOV     r5, #0              @ r5 will be the row index

forCol:

CMP     r5, #BOXSIZE        @ compare with box size

BGE     endForCol           @ if above size, end loop

CMP     r4, #0              @ see if we are in the first row

BEQ     border              @ if first row, print border

CMP     r4, #BOXSIZE – 1    @ see if we are in the last row

BEQ     border              @ if last row, print border

CMP     r5, #0              @ see if we are at the first column

BEQ     border              @ if first column, print border

CMP     r5, #BOXSIZE – 1    @ see if we are at the last column

BEQ     border              @ if last column, print border

interior:

BL      printSpace          @ if we get here we are at the box interior, print space

BAL     next                @ continue to next column

border:

BL      printAsterisk       @ we are at the box border, print asterisk

next:

ADD     r5, r5, #1          @ increment the column

BAL     forCol              @ repeat cycle

endForCol:

BL      printNewline        @ print a newline

ADD       r4, r4, #1          @ increment the row

BAL     forRow              @ repeat cycle

endForRow:

POP         {r4-r7, lr}             @ restore registers and LR

MOV         r7, #1                      @ set EXIT syscall

SWI         0                           @ execute syscall

@ Print the string pointed by r0 of length r1 on the console

printString:

PUSH  {r0-r2, r7, lr}         @ save the registers and LR

MOV     r2, r1              @ put string length in r2

MOV     r1, r0              @ put string address in r0

MOV   r0, #1                  @ set the output to the console

MOV         r7, #4                        @ set the syscall to WRITE

SWI         0                             @ make the syscall

POP         {r0-r2, r7, lr}         @ restore registers and LR

MOV         pc, lr                        @ return to caller

@ Prints an asterisk

printAsterisk:

PUSH  {r0, r7, lr}            @ save the registers and LR

LDR     r0, =asterisk       @ use the asterisk string

MOV     r1, #1              @ print one character

BL      printString         @ print using subroutine

POP         {r0, r7, pc}            @ restore registers and return to caller

@ Prints a space

printSpace:

PUSH  {r0, r7, lr}            @ save the registers and LR

LDR     r0, =space          @ use the space string

MOV     r1, #1              @ print one character

BL      printString         @ print using subroutine

POP         {r0, r7, pc}            @ restore registers and return to caller

@ Prints a newline

printNewline:

PUSH  {r0, r7, lr}            @ save the registers and LR

LDR     r0, =newline        @ use the newline string

MOV     r1, #1              @ print one character

BL      printString         @ print using subroutine

POP         {r0, r7, pc}            @ restore registers and return to caller

.end