GerdtR, пока ты пишешь всю программу целиком один, ты можешь спокойно придумать любые соглашения, хоть считать, что флаг DF должен быть установлен всегда, кроме как на время тех операций, где он нужен сброшенным. Единственное - если это нигде не записать, то может испортиться карма от проклятий тех, кто будет потом ковыряться в коде. Когда программа использует какие-то части, написанные другими, на стыках уже нужны какие-нибудь общие соглашения - не столь важно, какие, важно, что они должны быть общими.
Достаточно полный обзор всего, что было и бывает, есть в
http://www.agner.org/optimize/calling_conventions.pdf - я сразу предупреждаю, что список длинный. Менее подробно есть в
http://msdn.microsoft.com/en-us/library/984x0h58.aspx , но поведение флага DF MS уже забила описывать, последний раз было где-то в документации к masm,
http://techref.massmind.org/techref/lan ... asmc12.htm .
В 32-битной Windows традиционно используется соглашение stdcall, в 32-битных unix - cdecl:
* функции сохраняют регистры ebx, esi, edi, ebp, могут менять eax, edx, ecx;
* функции, возвращающие значение, делают это в eax или в паре edx:eax, если в один регистр не помещается;
* флаг DF должен быть сброшен на входе и будет сброшен на выходе;
* аргументы передаются через стек, в случае stdcall стек очищает функция командой ret N, в случае cdecl - вызывающий код.
Ядро гарантирует, что при запуске программы флаг DF сброшен, а при системных вызовах меняется состояние только тех флагов и регистров, которые указаны в документации на системный вызов. При использовании библиотек надо смотреть, что придумал автор библиотеки. При написании собственных библиотек лучше использовать stdcall.