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 に答える