# this subroutine prints vectors of words
#
# inputs
# r0 - start of vector
# r1 - number of elements to print
# r2 - pointer to start of string used to print first element
# r3 - pointer to start of string used to print subsequent elements
#
# no outputs
#
.globl _vprintw
.equ datum_size,4 @ working with 4 byte (32 bit) words
_vprintw:
stmfd sp!, {r4, r5, r6, r7, lr} @ save registers on the stack
cmp r1, #0 @ exit if no elements
ble last
mov r4, r0 @ copy the parameters to locals
mov r5, r1
mov r6, r2
mov r7, r3
ldr r1, [r4], #datum_size @ load first vector element to r0 and bump pointer
mov r0, r6 @ address of first string to r0
bl printf @ and print it
nop
subs r5, r5, #1 @ decrement counter
beq last @ and fall out if zero
vprintw_loop:
ldr r1, [r4], #datum_size @ load next vector item to r0 and bump pointer
mov r0, r7 @ address of subsequent string to r0
bl printf @ and print it
subs r5, r5, #1 @ decrement counter
bne vprintw_loop @ and loop if non-zero
last:
ldmfd sp!, {r4, r5, r6, r7, pc} @ restore registers from stack and return
A simple test harness to use the subroutine is given by
.globl main
.section .rodata
first:
.asciz "Vector of words - values : %d"
subsequent:
.asciz ", %d"
final:
.asciz "\n"
values:
.word 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60
endvalues:
.align 2
.text
main:
ldr r0, =values
mov r1, #11
ldr r2, =first
ldr r3, =subsequent
bl _vprintw @ print the vector elements
ldr r0, =final
bl printf @ print the terminating newline
mov r7, #1 @ set r7 to 1 - the syscall for exit
swi 0 @ then invoke the syscall from linux
bob@poland:~/www/examples$ make test_vprintw /usr/bin/gcc -gstabs -o test_vprintw test_vprintw.s vprintw.s bob@poland:~/www/examples$ ./test_vprintw Vector of words - values : 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 bob@poland:~/www/examples$
No comments:
Post a Comment