Использование регистров
Архитектура x64 предоставляет 16 регистров общего назначения (которые далее называются целочисленными регистрами), а также 16 регистров XMM/YMM для значений с плавающей запятой.Переменные регистры — это оперативные регистры, которые вызывающий объект считает очищаемыми во время вызова.Неизменяемые регистры должны сохранять свое значение во время вызова функции и при использовании должны сохраняться вызываемым объектом.
Следующая таблица описывает использование каждого из регистров в вызовах функций.
Регистровое |
Состояние |
Применение |
RAX |
Переменный |
Регистр возвращаемого значения |
RCX |
Переменный |
Первый целочисленный аргумент |
RDX |
Переменный |
Второй целочисленный аргумент |
R8 |
Переменный |
Третий целочисленный аргумент |
R9 |
Переменный |
Четвертый целочисленный аргумент |
R10:R11 |
Переменный |
Должен сохраняться вызывающим объектом; используется в инструкциях syscall/sysret. |
R12:R15 |
Неизменяемый |
Должен сохраняться вызываемым объектом. |
RDI |
Неизменяемый |
Должен сохраняться вызываемым объектом. |
RSI |
Неизменяемый |
Должен сохраняться вызываемым объектом. |
RBX |
Неизменяемый |
Должен сохраняться вызываемым объектом. |
RBP |
Неизменяемый |
Может использоваться в качестве указателя фрейма; должен сохраняться вызываемым объектом. |
RSP |
Неизменяемый |
Указатель стека |
XMM0, YMM0 |
Переменный |
Первый аргумент FP; первый аргумент векторного типа при использовании __vectorcall |
XMM1, YMM1 |
Переменный |
Второй аргумент FP; второй аргумент векторного типа при использовании __vectorcall |
XMM2, YMM2 |
Переменный |
Третий аргумент FP; третий аргумент векторного типа при использовании __vectorcall |
XMM3, YMM3 |
Переменный |
Четвертый аргумент FP; четвертый аргумент векторного типа при использовании __vectorcall |
XMM4, YMM4 |
Переменный |
Должен сохраняться вызывающим объектом; пятый аргумент векторного типа при использовании __vectorcall. |
XMM5, YMM5 |
Переменный |
Должен сохраняться вызывающим объектом; шестой аргумент векторного типа при использовании __vectorcall. |
XMM6:XMM15, YMM6:YMM15 |
Неизменяемый (XMM), переменный (верхняя половина YMM) |
Должен сохраняться вызываемым объектом.Регистры YMM должны сохраняться вызывающим объектом. |