Уважаемые, скажите почему API функции затирают регистры? Ведь по идее, они должны затирать лишь eax т.к. в нем содержится результат выполнения функции. Но все наооборот - эти чертовы функции трут все регистры, кроме ebp, а мне нужны затираемые регистры. Неужели мне каждый вызов функции обрамлять кодом pushad/popad??? есть ли более оптимальный путь?
А eip,cs,ds,es,ss,fs,gs ? A FPU-стек ? Правильнее было бы сказать, что в общем случае не сохраняются регистры eax,edx и ecx. Поэтому ес-ли нужно их сохранить, то перед вызовом API их нужно либо запушить, либо затолкать в локальные [esp+X] или [ebp+X], либо в сохраняемые регистры ebx,edi,esi,ebp
Еще нужно push'ить esi, edi, ebp (+ кажется, ebx) в начале WndProc и восстанавливать по окончании. Если при возврате в системный код значение этих регистров окажется изменено, под Win XP программа вылетет с ошибкой.
Есть такой способ решения проблемы: пишем функцию с именем, похожим на библиотечную, например так: _MsgBox: push ebx push ecx call MessageBoxA pop ecx pop ebx ret и потом ее вызываем каждый раз вместо библиотечной. И регистры целы...