Я не знаю Microsoft Windows (и никогда не использовал ее), поэтому, вероятно, не могу ответить на ваш вопрос по этому поводу.
Тем не менее, соглашения о вызовах двоичного интерфейса приложений AMD64 (в Linux и других Unixes) описаны в спецификации AMD64 ABI (возможно, вам также следует найти и прочитать эквивалентный документ для соглашений о вызовах Microsoft). Я полагаю, что они используют регистры для 6 первых аргументов из соображений производительности (передача значений через регистр быстрее, чем передача их в стек), а не из соображений безопасности.
И какой бы компилятор C ++ вы ни использовали, вы хотите, чтобы он следовал некоторым соглашениям о вызовах, и они практически диктуются системой (потому что вы хотите иметь возможность вызывать системные библиотеки из своего кода). Поэтому, если вы нарушите их, вы нарушите совместимость ABI.
Но я не могу догадаться, почему задают такой вопрос. Вы разрабатываете компилятор с собственными соглашениями о вызовах? Если да, у вас все еще должны быть какие-то средства для вызова библиотек C, и для этого необходимо, чтобы при обращении к внешним библиотекам C вы следовали соглашениям ABI, регулирующим их. Посмотрите на компилятор Ocaml для примера.