На основе этого ответа Stack Exchange.

Хотя большую часть времени мы храним наши данные в памяти (фрейме стека), также естественно использовать регистры для быстрого доступа. Согласно CS:APPv3, в ЦП обычно имеется шестнадцать межрегистровых регистров: восемь из них используются для более конкретных целей, а остальные восемь могут использоваться для хранения. Из этих восьми регистров два помечены как caller saved, а шесть помечены как callee save. Но почему, интересно. Какая между ними может быть разница?

Как я только что упоминал выше, всего в ЦП всего шестнадцать регистров, и функции совместно используют один и тот же набор регистров со своими подпрограммами, и если эти подпрограммы могут легко перезаписывать данные, хранящиеся в этих регистрах, тогда регистры будут бесполезны для хранения. Чтобы решить эту проблему, люди установили некоторые правила использования этих регистров. Для регистров сохраненные вызываемые функции, если функция хочет их использовать, она также отвечает за сохранение существующего содержимого в памяти и восстановление их после использования, и поэтому данные хранятся в сохранении вызываемых абонентовd. регистры можно смело считать постоянными; Однако для регистров caller saved, если функция хочет их использовать, следует помнить, что данные в этих регистрах могут быть перезаписаны вызываемыми подпрограммами, как, например, индексный регистр, и поэтому, если он хочет сохранить свои данные, он несет ответственность за их сохранение где-то.

Короче говоря, сохранение вызывающего абонента и сохранение вызываемого абонента — это механизм, предназначенный для защиты от возможного загрязнения хранилища регистров подпрограммами: cсохранение aller означает, что вызывающие сохранить свои данные перед вызовом подпрограммы или рискнуть их потерять, в то время как callee save означает, что вызывающим абонентам не нужно предпринимать эти дополнительные шаги, поскольку подпрограммы позаботятся об этих данных за них.