PowerPC内联汇编:将C值加载到寄存器
问题描述:
使用GCC
和inline 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
?我想要指定的值0x1337
。 Here是我看过的教程。
答
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)
);
是的,勿庸置疑,这是一个简单的解决方案 – BullyWiiPlaza
@BullyWiiPlaza:使用'GCC -mregnames'获得注册不属于裸数名,所以你不能混淆寄存器和立即数。另外,确保你告诉编译器关于你打开的任何寄存器,并使用'asm goto'告诉它你跳了。尽管我不确定是否有安全的方法来告诉编译器,你的asm需要'lr'中的返回地址并且它会返回。你可能应该用asm编写你的整个函数,因为我不明白它如何内联。 –
@PeterCordes:是的,这是整个功能。 :) – BullyWiiPlaza