A subroutine to print a vector of bytes is:
# this subroutine prints vectors of bytes # # inputs # r0 - start of vector # r1 - number of elements to print # r2 - pointer to start of string used to print each element # # no outputs # .globl _vprintb .equ datum_size,1 @ 1 because we are using bytes _vprintb: stmfd sp!, {r4, r5, r6, lr} @ stash the registers we use mov r4, r0 @ r4 is the pointer to the data mov r5, r1 @ r5 is the counter mov r6, r2 @ r6 is the pointer to the string vprintb_loop: ldrb r1, [r4], #datum_size @ put the vector element in r1 @ implicitly increment the pointer r4 by datum_size mov r0, r6 bl printf @ print the string containing the vector element subs r5, r5, #1 @ decrement the counter bne vprintb_loop @ loop if the counter is not zero ldmfd sp!, {r4, r5, r6, pc} @ restore the stashed registers
A simple test harness to use the subroutine is given by
.equ datum_size,1 .globl main .section .rodata output: .asciz "The value is %d\n" values: .byte 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60 endvalues: .text main: ldr r0, =values @ the start of the vector mov r1, #11 @ the number of elements ldr r2, =output @ the output string bl _vprintb @ call the subroutine 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_vprintb /usr/bin/gcc -gstabs -o test_vprintb test_vprintb.s vprintb.s bob@poland:~/www/examples$ ./test_vprintb The value is 10 The value is 15 The value is 20 The value is 25 The value is 30 The value is 35 The value is 40 The value is 45 The value is 50 The value is 55 The value is 60 bob@poland:~/www/examples$
No comments:
Post a Comment