Передает ли команда arm 64 ret значение x0 'в аргумент функции? - PullRequest
0 голосов
/ 21 февраля 2019

У меня вопрос по поводу регистров arm 64.X0 для function argument passing и function return valueX30 для function return address.Существует два фрагмента кода:

один - cpp:

void test(void* arg) {}

, а другой - код сборки:

mov x3 ,x4
......
ret 

Теперь я предполагаю, что X30 хранит адресфункции test и X0 сохраняют значение 0xfffffff

Когда он выполнил инструкцию ret, pc извлечет значение X30, которое является адресомtest.Таким образом, программа будет работать в функции test.Мой вопрос: если значение arg будет установлено на 0xffffff, если нет, как я могу передать значение из моего кода сборки в функцию test’ аргумент arg на платформе arm 64?

Спасибо всем.

1 Ответ

0 голосов
/ 21 февраля 2019

ret вообще ничего не делает с x0.ret - это то, как вы пишете mov pc, x30 в AArch64 .(x30 - это регистр ссылок, где bl (ответвление и ссылка) помещает обратный адрес.)

Ваш вопрос действительно о соглашениях о вызовах. Функции, вызывающие друг друга, должны согласовыватьсяо том, как передаются аргументы и возвращаются возвращаемые значения.

В стандартном соглашении о вызовах AArch64

  • x0 является первым регистром передачи аргументов для целочисленных / указательных аргументов.
  • x0 - это (первый) регистр возвращаемых значений для целочисленных значений / указателей.

Так что, когда вы ret в функции, отличной от void, вызывающая сторона будет обрабатыватьвсе, что находится в x0 как (часть) возвращаемого значения.(Если ваша функция не возвращает float или double, то вызывающая сторона будет искать в s0 или d0, предполагая, что ABI находится в плавающем плавающем поле.)

Если вы объявите свою функцию как возвращающую большойСтруктура по значению, вызывающая сторона передаст вам указатель в качестве первого аргумента, увеличивая «нормальные» аргументы на 1. Затем вы должны будете сохранить возвращаемое значение в указанной памяти.(И, возможно, также верните указатель, который вы передали в x0, но я не проверял, является ли это требованием или нет.)


TL: DR, если вы ret ничего не делаете сx0, ваша функция эффективно возвращает первое целое число / указатель arg.

...