【问题标题】:Cortex m3 svc with gcc inline assembly具有 gcc 内联汇编的 Cortex m3 svc
【发布时间】:2013-05-28 06:21:01
【问题描述】:

我希望把一个svc#变成c代码。现在我可以用汇编来占用svc的值了。

SVC_Handler:
   tst  lr, #0x4
   ite  eq
   mrseq    r0, msp
   mrsne    r0, psp
   b    SVC_Handler_C

   void SVC_Handler_C(unsigned int *svc_args)
   {
       unsigned int svc_number;
       svc_number=((char *)svc_args[6])[-2];

但我希望将它翻译成 c 代码中的内联汇编。但我发现 sp 将通过局部变量或其他东西的函数条目进行修改。有没有可能解决这个问题?谢谢

【问题讨论】:

    标签: gcc arm inline-assembly cortex-m3 thumb


    【解决方案1】:

    我假设您只需要内联汇编代码。如果是这种情况,请尝试以下操作:

    __attribute__((naked)) void SVC_Handler(void) {
        __asm__ __volatile__ (
        "   tst     lr, #0x4            \n\t"
        "   ite     eq                  \n\t"
        "   mrseq   r0, msp             \n\t"
        "   mrsne   r0, psp             \n\t"
        "   b   SVC_Handler_C           \n\t");
    }
    

    然后将您的SVC_Handler_C 编写为普通的 C 函数。

    【讨论】:

    • 如果你这样写,也写成__attribute__((noreturn)) ;-)
    • 您能否详细说明为什么还需要属性noreturn?谢谢。
    • 不是需要,而是一个好主意,因为它会阻止编译器在函数末尾创建“正常”返回 (b lr)。当你编译上面有/没有它时,只需检查反汇编差异。
    • 我认为naked属性意味着生成的程序集在函数的退出点不会包含bx lrpop {pc}指令。至少,我从未见过 GCC 在指定 naked 属性时生成进入/退出代码。顺便说一句,我用nakednoreturn 编译了上面的代码,得到了:warning: 'noreturn' function does return,但是在这两种情况下生成的程序集都是一样的。
    【解决方案2】:

    BlueSky 版本略有变化:

    __attribute__((naked)) void SVC_Handler(void) {
        register unsigned int *svc_args __asm__("r0");
    
        __asm__ __volatile__ (
            "tst     lr, #0x4
             ite     eq
             mrseq   %0, msp
             mrsne   %0, psp" : "=r"(svc_args));
    
        return SVC_Handler_C(svc_args);
    }
    

    令我惊讶的是,您没有考虑简单地将 C 函数直接设为处理程序,并通过上述小内联汇编块检索参数。

    【讨论】:

    • 这不能正常工作,因为函数处理程序的末尾没有返回,由于赤裸。结果,代码掉到了下一个相邻的代码中,在我的例子中,它陷入了一个无限循环,调用 SVC_Handler_C 作为相邻的。
    • @WieserSoftwareLtd 那里可能存在编译器依赖项。在我尝试过的情况下,编译器没有return SVC_Handler() 执行bx(但通过直接b ... 进行尾递归,因此不能失败 ) .你生成的程序集是什么?另请参阅上面 BlueSky 的最后一条评论 - 这非常相关。
    猜你喜欢
    • 2012-10-20
    • 2018-07-28
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多