【问题标题】:How to tell GCC to place an inline assembly instruction at a specific position?如何告诉 GCC 将内联汇编指令放置在特定位置?
【发布时间】:2015-07-01 13:56:22
【问题描述】:

我正在为基于ORPSoC 的处理器架构开发引导加载程序。为了执行程序,引导加载程序将其加载到内存中,然后跳转到该程序的开头。

现在我需要在跳转的延迟槽中插入自定义指令l.cust1。该指令由处理器实现并激活以下指令的解密。这就是它必须被放置在延迟槽中的原因。再晚一点,程序就无法执行,因为它的指令是加密的。同样,如果过早激活解密,引导加载程序会因为未加密而崩溃。

我现在想知道是否可以告诉 GCC 在哪里放置 l.cust1 指令。目前我必须相应地手动修改引导加载程序二进制文件。

在引导加载程序的 C 源代码中插入内联汇编 __asm__("l.cust1\n\t"); 会导致在相关跳转之前的某处添加指令:

1fc2e10:       9c 21 01 b4     l.addi r1,r1,436
1fc2e14:       70 00 00 00     l.cust1         # switching on decryption
1fc2e18:       18 40 01 ff     l.movhi r2,0x1ff
1fc2e1c:       9c 72 ff ff     l.addi r3,r18,-1
1fc2e20:       a8 42 7c 94     l.ori r2,r2,0x7c94
1fc2e24:       9c 90 00 04     l.addi r4,r16,4
1fc2e28:       85 62 00 60     l.lwz r11,96(r2)
1fc2e2c:       48 00 58 00     l.jalr r11
1fc2e30:       9d c0 00 00     l.addi r14,r0,0

但是,我需要它位于跳转的延迟槽中:

1fc2e10:       9c 21 01 b4     l.addi r1,r1,436
1fc2e14:       9d c0 00 00     l.addi r14,r0,0
1fc2e18:       18 40 01 ff     l.movhi r2,0x1ff
1fc2e1c:       9c 72 ff ff     l.addi r3,r18,-1
1fc2e20:       a8 42 7c 94     l.ori r2,r2,0x7c94
1fc2e24:       9c 90 00 04     l.addi r4,r16,4
1fc2e28:       85 62 00 60     l.lwz r11,96(r2)
1fc2e2c:       48 00 58 00     l.jalr r11
1fc2e30:       70 00 00 00     l.cust1         # switching on decryption

【问题讨论】:

    标签: gcc inline-assembly bootloader


    【解决方案1】:

    l.cust1 放在与跳转相同的内联汇编语句中,它必须声明为volatile,因为它具有副作用,并且在clobber 列表中具有"memory",因为它取决于内存的内容。

    【讨论】:

    • 是的,在@esm 的回答之后,我想,我可能也必须在内联汇编程序中进行跳转。一有时间测试解决方案,我会在这里更新。
    【解决方案2】:

    您将需要使用asm volatile 和对您希望内联汇编继续进行的代码的人为依赖。示例取自gcc documentation is below

    asm volatile ("mtfsf 255,%1" : "=X"(sum): "f"(fpenv));
    sum = x + y;
    

    根据文档volatile 是不够的。换句话说,编译器仍然可能改变以下代码的顺序:

    asm volatile("mtfsf 255,%0" : : "f" (fpenv));
    sum = x + y;
    

    通过添加依赖项,您可以确保内联程序集的放置。在第一个代码 sn-p 中,通过添加对 sum 的依赖关系,可以确保编译器不会重新排序代码,因为它认为由于依赖关系会产生不同的结果。您可以在“C 代码优化”部分的 this webpage 上找到另一个示例。

    【讨论】:

      猜你喜欢
      • 2015-05-19
      • 1970-01-01
      • 2018-01-16
      • 2018-06-19
      • 2012-10-20
      • 2011-07-20
      • 2023-03-10
      • 2017-01-02
      • 1970-01-01
      相关资源
      最近更新 更多