Используется ли указатель стека rsp для возврата значения вызова функции?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Используется ли указатель стека rsp для возврата значения вызова функции?

Сообщение Anonymous »

Я знаю, что есть несколько способов вернуть значение в ассемблере,
  • в rax регистре
    < li>в регистрах xmm0, xmm1
  • в стеках (что-то вроде оптимизации возврата в c++), при этом иногда используется регистр rdi для сохранения адреса стека вызывающей стороны , а затем вернуть значение непосредственно по адресу, указанному rdi
У меня есть следующий код на ассемблере, код должен вычислить матрицу 3x3, умноженную на трехмерный вектор , а затем вернуть трехмерный вектор в виде чисел с плавающей запятой (по 4 байта, всего 12 байт).
Все легко понять до последнего фрагмента кода, возвращающего значение, которое настолько странно, что я не понимаю его цели.
Предполагая, что трехмерное значение наконец находится в 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]
Я попытался скомпилировать и запустить этот код в программе C с помощью asm() и обнаружил, что на самом деле он просто копирует xmm6, и xmm8 в 3 местах: один в [rsp-28h], один в [rsp-18h] и один в xmm1 и xmm0, все это одни и те же значения с плавающей запятой.
Я знаю, что xmm0 и xmm1, скорее всего, являются возвращаемыми значениями, но не

Код: Выделить всё

[rsp-28h]
и [rsp-18h] имеют какое-либо значение для возврата значения? Почему программа использует очень странный метод (копировать в стеки, затем копировать в регистры rax и т. д., а затем снова копировать их обратно в стек) для копирования результатов?
Я спрашиваю об этом, потому что код вызывающего абонента не использует xmm0 и xmm1. Я не уверен, следует ли мне думать, что вызывающий объект просто отбрасывает возвращаемые значения, или возвращаемые значения на самом деле находятся где-то в стеке вызывающего объекта.
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/783 ... ction-call
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»