当我尝试在ARM裸机程序中使用%C代码时,它需要libgcc的包装器。没问题,我可以将其链接进去。当我这样做时,链接器停止抱怨,但是然后程序挂起(如果我看到寄存器,它们实际上以莫名的方式开始循环)在mod使用。用%注释掉这一行使程序不会以这种方式挂起,所以这肯定是问题所在。
我在https://gist.github.com/1724746
构建了一个简单的问题示例我使用以下方式运行测试:
qemu-system-arm -M versatilepb -cpu arm1176 -nographic -kernel kernel.elf | xxd
然后^ a-x退出它,并且%line注释掉了,我得到了我期望输出的字节,但是在那里我没有得到任何这样的输出。
知道这里发生了什么吗?
编辑:我正在使用的交叉编译器是Ubuntu上的默认编译器:https://launchpad.net/gcc-linaro
答案 0 :(得分:2)
所以它用一个2加载r0和r1(好吧它在当前任务上加一件事+ 1
10648: e1a00003 mov r0, r3
1064c: e51b1010 ldr r1, [fp, #-16]
10650: eb00fd36 bl 4fb30 <____aeabi_uidivmod_veneer>
我猜他们使用_veneer从手臂切换到拇指,这是一个切换模式的蹦床:
0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
带你到这里,实际的模运算,这是拇指代码,拇指模式
00010904 <__aeabi_uidivmod>:
10904: 2900 cmp r1, #0
10906: d0f8 beq.n 108fa <__aeabi_uidiv+0x252>
10908: e92d 4003 stmdb sp!, {r0, r1, lr}
1090c: f7ff fecc bl 106a8 <__aeabi_uidiv>
10910: e8bd 4006 ldmia.w sp!, {r1, r2, lr}
10914: fb02 f300 mul.w r3, r2, r0
10918: eba1 0103 sub.w r1, r1, r3
1091c: 4770 bx lr
1091e: bf00 nop
所以它看起来做了一个正常的除法,然后将结果和减法相乘,例如
12345 % 100 = 12345 - ((12345/100)*100) = 12345 - (123*100) = 12345 - 12300 = 45
我想知道问题是否是拇指模式。 arm1176肯定有拇指模式,真正的拇指模式,而我qemu可以做拇指。
你可以尝试一下实验来找出汇编和链接:
.thumb
.thumb_func
.globl thumb_test
thumb_test:
add r0,#1
bx lr
arm-none-linux-gnueabi-as thumb_test.s -o thumb_test.o
或任何工具链前缀(如果有),并将.o文件与其他所有内容链接。
C代码中的将其声明为
unsigned int thumb_test ( unsigned int );
无论你传递了什么,你都应该得到这个值加一个......试试这个而不是模数。
尝试的另一件事就是直线划分,看看除法是否有效但是模数是否可能,问题是乘法指令?谁知道呢。
嗯,我想我看到了问题:0004fb30 <____aeabi_uidivmod_veneer>:
4fb30: e51ff004 ldr pc, [pc, #-4] ; 4fb34 <____aeabi_uidivmod_veneer+0x4>
4fb34: 00010905 .word 0x00010905
你不能用ldr切换模式它必须是bx或blx,当它试图在arm模式下执行thumb代码时,它可能会转到未定义的处理程序。
我有一些关于切换模式如何工作的例子,特别是为qemu编写的。现在这是一个低级示例,例如没有printf,我确实有uart输出,可以看到uart上的东西。如果这是问题(切换到拇指模式),那么您需要检查编译和链接程序的方式。如果您不使用以前的代码源(现在由指导者图形使用)工具链,您可能需要指定交互操作或者可能需要了解工具链的构建方式。假设您正在使用基于gnu / gcc的东西。
如果你有办法在那里放置一个未定义的处理程序,或者如果你能够看到跟踪并看到pc下降到地址0x0000000附近的东西,这可能是正在发生的事情。如果你使用我的小thumb_test构建它并使用ldr而不是bx来到那里那么它应该不起作用它应该仍然崩溃......