Должен ли код выпуска зависеть от сохранения ebx при вызовах функций? - PullRequest
2 голосов
/ 09 ноября 2011

Я пишу надстройку DLL для приложения, внутри которого большие части написаны на ассемблере. Я смешиваю управляемый C ++, неуправляемый C ++ и встроенную сборку.

Я только что потратил несколько часов на отладку проблемы, которая оказывается, что ebx не сохраняется во время вызова в основное приложение. Ошибка возникает, только если код запускается в режиме выпуска и вне отладчика. Код выпуска в отладчике не имеет этой проблемы.

Я отключил все оптимизации, которые я могу найти для сборки выпуска, но она все еще зависит от ebx. Я добавил push/pop ebx в качестве обходного пути, но эта ошибка обязательно появится снова. : - (

Можно ли сказать компилятору, что ebx может быть изменено во время вызова функции?

1 Ответ

4 голосов
/ 09 ноября 2011

Ошибка в прототипе функции, которая сообщает, что она соответствует соглашению о вызовах, фактически не соблюдая правила соглашения о вызовах для сохранения регистра. Вам нужно обернуть вызовы к ошибочной функции внутри вашей собственной функции, которая делает ее соответствующей (сохраняя регистры), и чтобы каждый вызывал оболочку. #pragma deprecated позволит вам применить эту политику.

...