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