Я пытаюсь использовать локальную переменную потока в встроенной сборке, но когда я вижу дизассемблированный код, кажется, что компилятор не генерирует правильный код. Для следующего встроенного кода, где saved_sp является глобально объявлен __thread long saved_sp
,Локальные переменные нитей и встроенная сборка
__asm__ __volatile__ (
"movq %rsp, saved_sp\n\t");
Разборка выглядит следующим образом.
mov %rsp,0x612008
Что явно не правильно, потому что я знаю, что GCC использует фсов сегмента для резьбы локальных переменных. Он должен был сгенерировать что-то вроде
mov %rsp, fs:somevalue
, которого нет. Почему это так? Является ли использование локальных переменных потока в встроенной сборке проблематичным?
Я не думаю, что GCC так или иначе изменяет код встроенного ассемблера. Скорее всего, вам нужно явно указать префикс переопределения сегмента. Попробуйте вставить '' .byte 0x64 \ n \ t "' перед '" movq% rsp, saved_sp \ n \ t "'. –