1

使用 Codesourcery arm-linux-eabi 交叉编译器并且编译器不执行某些代码时遇到问题,因为它认为它没有被使用,特别是对于系统调用。有没有办法解决这个问题?

例如,此代码不会初始化变量。

unsigned int temp = 42;
asm volatile("mov R1, %0 :: "r" (temp));
asm volatile("swi 1");

在这种情况下, temp 永远不会被初始化为值 42。但是,如果我在初始化后添加一个 printk,它会被初始化为正确的值 42。我尝试过

unsigned int temp __attribute__ ((used)) = 42;

仍然不起作用,但我收到一条警告消息:

'used' 属性被忽略 [-Wattributes]

这是在linux内核代码中。

有小费吗?

4

1 回答 1

4

这不是使用内联汇编的正确方法。如所写,这两个语句是分开的,编译器没有理由必须保留两者之间的任何寄存器值。您需要将两个汇编指令放在同一个内联汇编块中,并具有适当的输入和输出约束,或者您可以执行以下操作以使编译器更高效:

register unsigned int temp __asm__("r1") = 42;
__asm__ volatile("swi 1" : : "r"(temp) : "memory");

(请注意,我在 clobber 列表中添加了内存;我不确定您正在制作哪个系统调用,但是如果系统调用写入用户空间中的任何对象,则需要在 clobber 列表中列出“内存”。)

于 2012-10-31T13:05:41.103 回答