2014-06-10 2 views
0

Я пытаюсь перенести проект из Windows в Linux. Я размещаю код в следующем репо: Nspire Emu. Я смог исправить некоторые ошибки компиляции, но многие функции нужно переопределить, и есть некоторые части, которые я не могу понять.Объяснение сборки в сборке

frame определение переменной типа:

typedef struct { void *prev, *function; } os_exception_frame_t; 

Кусок инлайн сборки я не понимаю:

asm ("movl %%fs:(%1), %0" : "=r" (frame->prev) : "r" (0)); 

asm ("movl %0, %%fs:(%1)" : : "r" (frame), "r" (0)); 

Я был бы очень признателен, если кто-то поможет мне понять предыдущий код. Спасибо заранее.

+0

Компиляторы gcc и visual c имеют различный синтаксис для встроенной сборки. Я бы начал с документов из компилятора, в которых он работает правильно и переводится в формат, необходимый для вашего таргетинга. – Jay

+1

Спасибо за подсказку. Это было скомпилировано в Linux с mingw gcc, это означает, что я могу скомпилировать код как в Windows, так и в Linux. Это не проблема для меня. Проблема заключается в фактическом значении этого фрагмента кода. Недавно я обнаружил, что fs: 0 - это где SEH происходит в Windows, и теперь я знаю, что делает этот код. См. Http://feepingcreature.github.io/handling.html Спасибо за время и терпение и извините за ответ на мой собственный вопрос. PD: Я не могу ответить из-за моей репутации. –

ответ

1

Этот встроенный asm выдает кадр обработчика исключений Windows из структурированного стека обработчика исключений. Linux не использует структурированные обработчики исключений, поэтому этот код нужно удалить для Linux и заменить на нечто совершенно другое, что делает то же самое. Это зависит от того, чего пытается достичь код, манипулируя стеком SEH. Эквивалент в Linux, вероятно, связан с регистрацией некоторых обработчиков сигналов.

+0

Большое спасибо. Я начал читать об этом. http://feepingcreature.github.io/handling.html –

Смежные вопросы