# 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