+1 (315) 557-6473 

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