Простая вещь, которая наверняка сработает, - это взять указатель на локальную переменную потока и записать в нее.
Ваш компилятор обязательно сделает long *saved_fp_p = &saved_fp
правильно, а встроенная сборка будет работать только с saved_fp_p
это локальная переменная.
Вы также можете использовать синтаксис ввода и вывода gcc:
__asm__ __volatile__ (
"mov %%rsp, 0(%0)" : : "r" (&saved_sp)
);
Это дает компилятору ответственность за разрешение адреса save_fp, и код сборки получает егов регистре.
Мы выяснили, что это тоже работает,
__asm__ __volatile__ asm ("mov %rsp,%0" : "=m" (saved_sp))