- в rax регистре
< li>в регистрах xmm0, xmm1 - в стеках (что-то вроде оптимизации возврата в c++), при этом иногда используется регистр rdi для сохранения адреса стека вызывающей стороны , а затем вернуть значение непосредственно по адресу, указанному rdi
Все легко понять до последнего фрагмента кода, возвращающего значение, которое настолько странно, что я не понимаю его цели.
Предполагая, что трехмерное значение наконец находится в xmm6, xmm7 и xmm8 , код следующий:
Примечание: суб-rsp, xxx отсутствует, поэтому добавьте rsp, xxx в начало и конец этой функции. стек вообще не используется при вычислении матричного и векторного умножения.
Код: Выделить всё
movss [rsp-28h],xmm6
movss [rsp-24h],xmm7
movss [rsp-20h],xmm8
mov eax,[rsp-24h]
shl eax,20h
mov ebx,[rsp-28h]
or rax,rbx
mov [rsp-18h],rax
movd rcx,xmm8
mov [rsp-10h],rcx
mov ebx,eax
shr rax,20h
mov [rsp-28h],eax
mov [rsp-24h],ebx
mov [rsp-20h],ecx
movss xmm1,[rsp-10h]
movsd xmm0,[rsp-28h]
Код: Выделить всё
xmm7Я знаю, что xmm0 и xmm1, скорее всего, являются возвращаемыми значениями, но не
Код: Выделить всё
[rsp-28h]Я спрашиваю об этом, потому что код вызывающего абонента не использует xmm0 и xmm1. Я не уверен, следует ли мне думать, что вызывающий объект просто отбрасывает возвращаемые значения, или возвращаемые значения на самом деле находятся где-то в стеке вызывающего объекта.
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/783 ... ction-call
Мобильная версия