>>25

以下の例はプログラムカウンタ、スタックポインタ、スタックフレームを差し替えています。
コンパイラすら通していないので、動作保証はありません。

jmp_bufの型定義は環境に依存するので、インラインアセンブラを使うのと大差ないかも知れません。

void create_new_task(void *stkbuf, size_t stksize)
{
  jmp_buf env;

  if(setjmp(env) == 0)
  {
    /* 新しい実行環境を作成する */
    env[0].__jmpbuf[5] = (int)task_startup;     /* プログラムカウンタ    */
    env[0].__jmpbuf[4] = (size_t)stkbuf + stksize; /* スタックポインタ     */
    env[0].__jmpbuf[3] = (int)NULL;         /* スタックフレームポインタ */

    /* 新しい実行環境へジャンプ */
    longjmp(env, 1);
  }

  /* この行は実行されない */
  assert(0);
}