- 1
stwu r1, -0x18(r1)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−1
stwu r1, -0x18(r1)
PPC как бы говорит нам
Правда?
Например я занимаюсь парсингом каких-то данных, у меня есть указатель на текущий рассматриваемый байт look, и если мне вдруг понадобится прочитать какой-нибудь предыдущий байт я могу написать look[-1] или look[-2] и тюпю Вполне законный прием.
Ну передали откуда-нибудь указатель на буфер с данными, сначала он указывал на начало буфера, но по ходу чтения я его двигаю вперед, типичная же хуйня: Вряд ли мне на самом первом байте понадобится смотреть на зад
> я же написал
Сорян, ты пишешь как мудак, Обезьяна сразу не поняла.
http://www.eecs.umich.edu/courses/eecs373.w04/ABI_matt.pdf
В r1 хранится указатель на вершину стека, а инструкция stwu r1, -0x18(r1) реализует сохранение frame pointer.
В этом примере BP нет. Считай, что используется только SP (его аналогом выступает r1). Но зачем-то старое значение SP сохраняется в стеке же. Ага, считай, что тут было PUSH SP после SUB SP, <размер локальных данных>.
Если же нам нужен FP, то стандартного регистра (типа BP) у PPC нет. В его качестве может использоваться произвольный номерной регистр (типа r31):
https://lists.ozlabs.org/pipermail/linuxppc-dev/2005-August/019456.html
Бывают процессоры вообще без инструкций для стека. Нужно ручками сооружать инструкцию для инкремента/декремента указателя и для мува с косвенной адресацией. Ну прямо, как... тут. У PPC даже нет CALL и RET. У него есть инструкция BL, сохраняющая адрес возврата в регистр LR и прыгающая на указанный адрес, и инструкция BLR, прыгающая на адрес возврата, сохранённый в регистре LR. Если тебе нужно вызвать подпрограмму из подпрограммы, ты должен сам сохранить LR в стеке, которого нет, точнее, который (в смысле стек) ты сам реализуешь программно. Процессор без CALL и без RET, Карл!
В официальном ABI у PPC стек тоже растёт вниз. Можешь сделать его растущим в другом направлении, чтобы обломать дизассемблеры и дебагеры.
А у кого стек растёт вверх?
В общем, эмуляция стека на PPC - это целое искусство.
Полагаю, что ППЦ изобрели люди с примерно таким же мышлением.
Зато, поскольку на ППЦ стек всё равно реализуется закатом Солнца вручную, можно иметь сразу несколько софтварных стеков, как в Форте или в Постскрипте.
Добро пожаловать в архитектуру RISC.
Нет, я только пароль Чингиза знаю.
Теперь знаю.
А этого за что?
Я так думаю, что вымоченные в холодной воде бананы лучше заходят.
Лучше вернись к воплям "игнорируйте его" и не лезь к дядям.
https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/assembler/idalangref_stwu_stu_instrs.html
Если бы были разные регистры, выглядело бы так: Случай, когда eax изначально равнялось нулю или когда произошло исключение, я не рассматриваю.
Но тут слева и справа один и тот же регистр. Возможно, это UB.
А что будет лежать по адресу [r1-0x18]: старое значение r1 или новое?
По картинкам похоже, что старое.