0

我希望把一个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 将通过局部变量或其他东西的函数条目进行修改。有没有可能解决这个问题?谢谢

4

2 回答 2

2

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

__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 函数。

于 2013-05-28T19:50:20.543 回答
-1

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 函数作为处理程序,并通过上面的小内联汇编块检索参数,但令我感到惊讶。

于 2013-06-01T10:35:20.147 回答