Сборка ARM - параметр доступа и возвращаемое значение?

У меня есть прототип функции int Palindrome(const char *c_style_string);

В сборке ARM v8 я считаю, что параметр хранится в регистре w0. Однако разве это не тот регистр, значение которого ret выводит?

Если да, то что мне нужно сделать, чтобы значения не перезаписывались? Я думал что-то вроде mov w0, w1 в начале своего кода, чтобы я ссылался на c_style_string как w1 всякий раз, когда я его анализирую, а затем редактировал w0, чтобы сохранить int... правильно ли это?

Благодарю вас!


person tyger2020    schedule 22.11.2017    source источник
comment
Кстати, выбор регистра для вызовов функций - это решение компилятора, а не проблема языка ассемблера. Компилятор может передать параметр в R8.   -  person Thomas Matthews    schedule 22.11.2017
comment
Синтаксис ARM — mnemonic dst, src, поэтому вы хотите, чтобы mov w1, w0 сделал копию w0 (ваш первый аргумент).   -  person Peter Cordes    schedule 23.11.2017
comment
нет причин, по которым вывод не может перезаписать входной регистр. Указатель, который входит в функцию, передается по ссылке, но это копия адреса, помещенного туда только для этой функции, если эта функция вызывает другую функцию, она также перезапишет этот регистр параметров и так далее, и возвращает все вложенные функции будут перезаписаны при резервном копировании. можно использовать стек или, если параметр не нужен, просто перезаписать.   -  person old_timer    schedule 25.11.2017
comment
Синтаксис AT&T — единственный известный мне синтаксис, в котором dest ставится в конце.   -  person phuclv    schedule 06.01.2018
comment
@phuclv: синтаксис m68k также ставит dst последним. И синтаксис AT&T был вдохновлен синтаксисом PDP-11, который также делает то же самое.   -  person Peter Cordes    schedule 30.11.2019


Ответы (2)


Вы можете написать код сборки в соответствии с ABI для 64-битной архитектуры ARM.
В приведенном выше примере вы можете сохранить адрес для c_style_string в «сохраненном для вызываемого абонента» регистре (X19-X29) и копировать его в x0/w0 каждый раз, когда вы вызываете метод Palindrome(). предполагая здесь, что Palindrome() является функцией C и, следовательно, сама совместима с 64-битным ABI ARCH.
Желательным побочным эффектом было бы то, что ваш код C мог бы всегда вызывать ваш ассемблерный код, и наоборот.

person Frant    schedule 05.01.2018

ИМХО, ваше лучшее решение - написать функцию C или минимальную функцию, а затем указать компилятору вывести язык ассемблера. Это покажет вызывающий интерфейс для функций.

Вы также можете посмотреть соглашение о передаче регистров в документации вашего компилятора.

Если вы хотите сохранить значения регистров, вы должны использовать инструкцию PUSH (или ее эквивалент, в зависимости от режима ARM или режима Thumb). Также не забудьте выталкивать регистры перед окончанием функции.

person Thomas Matthews    schedule 22.11.2017