Поделиться через


Использование регистров

Архитектура 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 должны сохраняться вызывающим объектом.

См. также

Ссылки

Программные соглашения x64

__vectorcall