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