Советы нужны! Программа имеет неправильное поведение, используя встроенный asm для вызова функции вместо функции C - PullRequest
1 голос
/ 15 марта 2019

Я сейчас пишу свою собственную операционную систему.Это не приоритетная ОС, и мои потоки работают нормально с планировщиком.У меня есть один крайний случай, хотя.Если я не вызываю свою yield() функцию из C, но выполняю asm("call yield"), то вычисления позже не удаются, но только с оптимизацией -O2.

Как многие говорили, это всегда наша вина

Я испробовал все подходы, которые только могу придумать, но теперь я в отчаянии.

Так что, если у кого-то есть какие-то советы о том, что может происходить или о том, что я должен расследовать, поделитесь, пожалуйста.

Я полагаю, что это отключение из-за оффтопа, но любые советы очень ценятся.

Ответы [ 2 ]

4 голосов
/ 15 марта 2019

Когда компилятор генерирует вызов функции, он сохраняет содержимое любых регистров, которые могут быть изменены вызываемой функцией («регистры сохранения вызывающего абонента») перед выполнением вызова.

Поскольку вы скрыли этот вызов функции в блоке встроенного ассемблера, компилятор не знает, что ему нужно сохранять и восстанавливать регистры вокруг вызова.

Простое решение: тогда не делай этого. Если вы хотите вызвать функцию, используйте синтаксис вызова функции C.

Сложное решение: Объясните, кто регистрирует этот вызов функции, будет работать с использованием расширенного синтаксиса встроенного ассемблера .

2 голосов
/ 16 марта 2019

Спасибо за все комментарии. Это помогло выделить. Я наконец-то понял. Мой переключатель контекста не обрабатывал состояние FPU. После того, как я снова вернулся к рассеянию, я заметил, что обычный сгенерированный C-код помог мне сохранить состояние FPU.

После реализации FSAVE / FNSAVE и FRSTOR в переключателе контекста оптимизированный код -O2 также работал как положено.

@ melpomene: Как вы спросили:

Вы смотрели на сгенерированный код?

Оглядываясь назад, очевидно, недостаточно сложно.

Спасибо за все предложения, и я надеюсь, что эта ветка поможет другим вспомнить инструкции x87 FPU: -P

...