Сборка ARM - параметр доступа против возвращаемого значения?
У меня есть прототип функции int Palindrome(const char *c_style_string);
В сборке ARM v8 я считаю, что параметр хранится в регистре w0. Однако разве это не тот регистр, который ret
выводит значение?
Если да, что мне нужно сделать, чтобы значения не перезаписывались? Я думал что-то вроде mov w0, w1
в начале моего кода, так что я обращаюсь к c_style_string как w1 всякий раз, когда я анализирую его, а затем редактирую w0, чтобы сохранить int... это было бы правильно?
Спасибо!
2 ответа
Возможно, вы захотите написать свой код сборки в соответствии с ABI для ARM 64-битной архитектуры.
В приведенном выше примере вы можете сохранить адрес для c_style_string в "Callee-сохраненный" регистр (X19-X29) "и копировать его в x0/w0 каждый раз, когда вы вызываете Palindrome() - я предполагаю, что здесь Palindrome () является функцией C и поэтому сама совместима с ARCH 64-bit ABI.
Желательным побочным эффектом будет то, что ваш код на C всегда может вызывать ваш код на ассемблере, и наоборот.
ИМХО, ваше лучшее решение - написать функцию C или минимальную функцию, а затем сказать компилятору выводить язык ассемблера. Это покажет интерфейс вызова для функций.
Вы также можете найти соглашение о передаче регистров в документации вашего компилятора.
Если вы хотите сохранить значения регистров, вы должны использовать инструкцию PUSH (или ее эквивалент, в зависимости от режима ARM или режима Thumb). Также не забудьте POP регистры до конца функции.