Exercises 15.2 Programming Exercise
1.
Write a program in assembly language that prompts the user to enter ten signed integers and then displays them in reverse order.
Hint
Solution
Use the getDecInt and putDecInt functions that you wrote for Exercise 14.7.2.
@ reverseArray.s
@ Gets 10 integers from user then prints in reverse order.
@ 2017-09-29: Bob Plantz
@ Define my Raspberry Pi
.cpu cortex-a53
.fpu neon-fp-armv8
.syntax unified @ modern syntax
@ Constants for assembler
.equ nElements,10 @ number of elements in array
.equ intArray,-52 @ array beginning
.equ locals,40 @ space for local vars
@ Constant program data
.section .rodata
.align 2
prompt:
.asciz "Enter an integer:\n"
display:
.asciz "In reverse order:\n"
@ The program
.text
.align 2
.global main
.type main, %function
main:
sub sp, sp, 16 @ space for saving regs
str r4, [sp, 0] @ save r4
str r5, [sp, 4] @ r5
str fp, [sp, 8] @ fp
str lr, [sp, 12] @ lr
add fp, sp, 12 @ set our frame pointer
sub sp, sp, locals @ for the array
add r4, fp, intArray @ address of array beginning
mov r5, 0 @ index = 0;
fillLoop:
cmp r5, nElements @ all filled?
bge allFull @ yes
ldr r0, promptAddr @ no, prompt user
bl writeStr
bl getDecInt @ get integer
lsl r1, r5, 2 @ offset is 4 * index
str r0, [r4, r1] @ at index-th element
add r5, r5, 1 @ index++;
b fillLoop
allFull:
ldr r0, displayAddr @ nice message
bl writeStr
add r4, fp, intArray @ address of array beginning
mov r5, 9 @ index = 9;
printLoop:
lsl r1, r5, 2 @ no, offset is 4 * index
ldr r0, [r4, r1] @ at index-th element
bl putDecInt @ print integer
bl newLine
subs r5, r5, 1 @ index--;
bge printLoop
allDone:
mov r0, 0 @ return 0;
add sp, sp, locals @ deallocate local var
ldr r4, [sp, 0] @ restore r4
ldr r5, [sp, 4] @ r5
ldr fp, [sp, 8] @ fp
ldr lr, [sp, 12] @ lr
add sp, sp, 16 @ restore sp
bx lr @ return
promptAddr:
.word prompt
displayAddr:
.word display
