我想为Raspberry Pi B +版本编写一个非常基本的交叉编译器来构建简单的裸机程序。我的编译器能够使用ARM指令集数据表将简单命令翻译成相应的机器语言指令。ARMv6在裸机编程分支(树莓派B +)
打开发光二极管(定位自己在烘烤pi当然,http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/)工作正常。
但现在我希望做一些分支指令,而这正是似乎没有任何工作了:
首先,我想跳转到绝对addresse,没有相对分支使用B/BL指令。
要测试一个分支,我使用下面的反汇编代码(使用料斗拆装V3测试版拆解),至极开启与GPIO 16 AND22连接的LED:
00000000 mov r0, #0x20000000 ;Load the GPIO Base Address into R0
00000004 orr r0, r0, #0x200000
00000008 mov r1, #0x40 ;Load the Set Function Mask (for GPIO 22) into r1
0000000c str r1, [r0, #0x8] ;Store the Set Function Mask into the GPFSEL2
00000010 mov r1, #0x400000 ;Move the Set Output Mask (for GPIO 22) into r1
00000014 str r1, [r0, #0x1c] ;Store the Set Output Mask into GPSET0
00000018 mov r0, #0x20000000 ;Load the GPIO Base Address into R0
0000001c orr r0, r0, #0x200000
00000020 mov r1, #0x40000 ;Load the Set Function Mask (for GPIO 16) into r1
00000024 str r1, [r0, #0x4] ;Store the Set Function Mask into the GPFSEL2
00000028 mov r1, #0x10000 ;Move the Set Output Mask (for GPIO 16) into r1
0000002c str r1, [r0, #0x1c] ;Store the Set Output Mask into GPSET0
00000030 b 0x30 ;Infinity Loop to keep the processor up
现在我想在代码的开头添加一个分支,跳过第一部分,这样只有第二个LED被激活。
我试了一下这样的:
mov r15, #0x1c
但唯一的效果是两个LED留下暗。
我的第二次尝试是这样的:
mov r2, #0x20
bx r2
但是,无论是作品。
所以我的问题是:
- 如何执行这样的分支?
- 我是否正确使用地址?
这可能是一个有趣的学习练习,gcc有一个'-white'选项来构建不依赖任何库的代码。我假设GNU汇编程序可以将ARM asm组装成一个扁平的二进制文件,所以你可以使用它来编写启动代码,以便运行你的编译器输出函数。据我了解,这基本上是如何构建Linux内核的:大多数是C语言,其中包含一些用于设置的asm,以及一个构建内核映像而不是ELF可执行文件的构建过程。 –