2017-10-14 189 views
0

使用GCCinline assembly,我想立即加载一个特定的寄存器r0。但是,我没有得到正确的结果。PowerPC内联汇编:将C值加载到寄存器

unsigned short value = 0x1337; 

asm volatile 
(
"li 0, %0\n\t" 
     "sc\n\t" 
     "blr" 
: /* Output registers */ 
:"r"(value) /* Input registers */ 
: /* No clobbered registers */ 
); 

在编译时,这给

li  r0, 9 
sc 
blr 

来自哪里的9?我想要指定的值0x1337Here是我看过的教程。

回答

2

9是包含0x1337的寄存器,这正是您所要求的。请注意0​​是一个输入寄存器? 9,a.k.a. r9是完全有效的输入寄存器。这是我得到的程序集输出。

li 9,4919 
    li 0, 9 
    sc 
    blr 

如果你想加载0x1337作为一个立即,只是用它来代替。

asm volatile (
    "li 0, 0x1337\n\t" 
    "sc\n\t" 
    "blr" 
); 

或者,只是使用"i"约束,而不是"r"约束。

asm volatile (
    "li 0, %0\n\t" 
    "sc\n\t" 
    "blr" 
    : 
    : "i"(0x1337) 
); 
+0

是的,勿庸置疑,这是一个简单的解决方案 – BullyWiiPlaza

+0

@BullyWiiPlaza:使用'GCC -mregnames'获得注册不属于裸数名,所以你不能混淆寄存器和立即数。另外,确保你告诉编译器关于你打开的任何寄存器,并使用'asm goto'告诉它你跳了。尽管我不确定是否有安全的方法来告诉编译器,你的asm需要'lr'中的返回地址并且它会返回。你可能应该用asm编写你的整个函数,因为我不明白它如何内联。 –

+0

@PeterCordes:是的,这是整个功能。 :) – BullyWiiPlaza