2011-01-28 144 views
2

我必須編寫內聯彙編代碼來執行我已集成到我的硬件中的定製指令。
根據在實際芯片上找到什麼硬件,指令的行爲會有所不同。我的裝配如下所示:替換內聯彙編代碼

asm volatile (
    " instr_generic %1, %2, %0   \n\t" 
    : "=r" (c)    
    : "r" (a), "r" (b)  
    : "%g0"             
    ); 

instr_generic現在可以執行任意例如加或減,這取決於是在硬件上。

現在,而不是instr_generic我想寫cust_addcust_sub,這應該然後用instr_generic取代。換句話說,它應該像這樣在這裏

#define cust_add instr_generic 

    ... 

    asm volatile (
    " cust_add %1, %2, %0   \n\t" 
    : "=r" (c)    
    : "r" (a), "r" (b)  
    : "%g0"             
    ); 

但我想我不能使用預處理器在這種情況下,以取代內嵌assemly是這樣嗎?還有另一種方法可以輕鬆做到嗎?

+2

彙編語言將在編譯時*編譯*,很久以前,您就會在運行時確定硬件功能。 – Lazarus 2011-01-28 12:25:09

回答

5
... 
#define cust(arg) \ 
asm volatile (
" " #arg " %1, %2, %0   \n\t" \ 
: "=r" (c) \   
: "r" (a), "r" (b) \  
: "%g0" \             
) 

... 
cust(cust_add); 
0

我要麼做一個if-then-else的基於運行時檢測到所述處理器的不同的解決方案,或擠出一點的速度,使用函數指針到包含不同的解決方案的功能,如果檢測到那麼funptr = a_solution,否則如果檢測到b然後funptr = b_solution等等,那麼一次在程序期間使用funptr。

如前所述,定製指令需要在編譯時編譯而不是運行時。如果您想要更改指令運行時間,這是第三個選項,可以在運行時執行自修改代碼以插入適當的指令。

+0

執行SMC的一個好方法是發出指令修正表(類似於Linux/x86爲extables所做的),並在程序init處編寫正確的指令。 – ninjalj 2011-01-28 19:28:57

0

難道你只是使用字符串連接?或者有什麼理由不能這樣做?

#define cust_add "instr_generic" 

... 

asm volatile (
cust_add " %1, %2, %0   \n\t" 
: "=r" (c)    
: "r" (a), "r" (b)  
: "%g0"             
); 
+0

`#define cust_add「instr_generic」` - 不,那不行。 (它是我在這裏的原因,它正是我想要做的,但是它導致了彙編程序的編譯失敗,我試圖找出如何解決它)。 – jww 2015-07-22 01:07:40