2017-10-14 178 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