【问题标题】:Replacing inline assembly code替换内联汇编代码
【发布时间】:2016-03-07 07:23:36
【问题描述】:

我必须编写内联汇编代码来执行我集成到我的硬件中的自定义指令。
根据在实际芯片上要找到的硬件,指令的行为会有所不同。我的程序集如下所示:

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

这个instr_generic 现在可以执行例如加法或减法,具体取决于硬件上的内容。

现在,我想写 cust_add 或 cust_sub 而不是 instr_generic,然后应该将其替换为 instr_generic。换句话说,这里应该是这样的

    #define cust_add instr_generic

    ...

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

但我想我不能在这种情况下使用预处理器来替换内联汇编,对吗?还有其他方法可以轻松做到这一点吗?

【问题讨论】:

  • 汇编语言将在编译时编译,远在您确定硬件能力的运行时之前。

标签: c assembly c-preprocessor inline-assembly


【解决方案1】:
...
#define cust(arg) \
asm volatile (
" " #arg " %1, %2, %0          \n\t" \
: "=r" (c) \           
: "r" (a), "r" (b) \      
: "%g0" \                                                   
)

...
cust(cust_add);

【讨论】:

    【解决方案2】:

    我会根据处理器的运行时检测使用不同的解决方案执行 if-then-else,或者为了加快速度,使用指向包含不同解决方案的函数的函数指针,如果检测到 a then funptr = a_solution , 否则如果检测到 b 然后 funptr = b_solution 等。执行一次然后在程序期间使用 funptr。

    如前所述,自定义指令需要在编译时而不是运行时编译。如果您想更改指令运行时,这是执行自修改代码以在运行时插入正确指令的第三种选择。

    【讨论】:

    • 执行 SMC 的一个好方法是发出一个指令修正表(类似于 Linux/x86 对可扩展程序所做的),并在程序初始化时编写正确的指令。
    【解决方案3】:

    你不能只使用字符串连接吗?还是有什么原因你不能那样做?

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

    【讨论】:

    • #define cust_add "instr_generic" - 不,这不起作用。 (这就是我在这里的原因。这正是我想要做的,但它会导致汇编器内部的编译失败。我正试图弄清楚如何解决它)。
    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2012-06-16
    相关资源
    最近更新 更多