Exercises 18.6 Programming Exercise
1.
Write an assembly language program that determines where the I/O memory begins on your Raspberry Pi. Raspbian includes a function, bcm_host_get_peripheral_address
for this purpose. It is located in the /opt/vc/lib/libbcm_host.so
library. You will need to link your program with this library.
Hint
Solution
Use printf
to display the address. The linking command is gcc -o locatePeripherals /opt/vc/lib/libbcm_host.so locatePeripherals.o
@ locatePeripherals.s @ Determines the beginning address of peripherals. @ Link with /opt/vc/lib/libbcm_host.so @ 2017-09-29: Bob Plantz @ Define my Raspberry Pi .cpu cortex-a53 .fpu neon-fp-armv8 .syntax unified @ modern syntax @ Constant program data .section .rodata .align 2 formatMsg: .asciz "Peripheral addresses begin at %p\n" @ Program code .text .align 2 .global main .type main, %function main: sub sp, sp, 8 @ space for fp, lr str fp, [sp, 0] @ save fp str lr, [sp, 4] @ and lr add fp, sp, 4 @ set our frame pointer bl bcm_host_get_peripheral_address @ get the address mov r1, r0 @ argument for printf ldr r0, formatMsgAddr @ printf("%i + %i = %i\n", bl printf mov r0, 0 @ return 0; ldr fp, [sp, 0] @ restore caller fp ldr lr, [sp, 4] @ lr add sp, sp, 8 @ and sp bx lr @ return bx lr @ return .align 2 formatMsgAddr: .word formatMsg