Как правильно обновить значение, переданное в сборке?

Я использую архитектуру SPARC. Мне нужно обновить номер длинного аргумента, не возвращая его, но я не знаю, как это сделать, потому что входные регистры используются как для параметров, так и для возврата значения. Я видел, используя такие инструкции, как

add   %l0, %l1, %i1

что можно изменить содержимое регистра i, но, насколько я могу судить, это изменяет «копию» параметра, а не сам параметр. Я экспериментировал с командой загрузки и командой сохранения такими способами, как

ld    [%o1], %i1

и

st    %l1, [%fp-8]

и они, кажется, не меняют то, что мне нужно изменить.


person Rez    schedule 08.02.2016    source источник
comment
Вам нужно заранее знать, что находится в регистре и как это работает ld - загрузить слово и st - сохранить слово. Попробуйте прочитать эту статью [ссылка] (stackoverflow.com/questions /23402899/)   -  person Ting Shun Ng    schedule 08.02.2016
comment
Я провел некоторое исследование и выяснил, что функция сохранения делает аргументы доступными во входных регистрах, но я до сих пор не знаю, использовать ли для хранения указатель кадра или ожидаемый регистр i.   -  person Rez    schedule 09.02.2016


Ответы (1)


Я понял. Инструкция сохранения делает аргумент доступным в регистре in (в моем случае %i1), и оттуда он просто

st %l1, [%i1 + 1]

и я должен убедиться, что число вместо 4 совместимо с количеством байтов между элементами массива. Итак, в этом случае +1 работает для массива символов.

person Rez    schedule 09.02.2016
comment
Магазин не изменяет никакие регистры. Таким образом, он не может изменить то, что доступно в реестре. Если вызывающая сторона хочет, чтобы вы выполнили запись в память, сделайте это, но это не обычное возвращаемое значение. - person Peter Cordes; 09.02.2016
comment
Да, это мое намерение. Мне пришлось сделать модификацию для этого, а затем сделать что-то еще возвращаемым значением. - person Rez; 09.02.2016