Сборный / Говнокод #25970 Ссылка на оригинал

0

  1. 1
stwu      r1, -0x18(r1)

PPC как бы говорит нам

Запостил: nymuHckuu_nemyx nymuHckuu_nemyx, (Updated )

Комментарии (99) RSS

    • Это же ебанутый уебан, он скорее всего даже не понял, что тут написано.


      Хотя вообще говоря странное желание сказать

      *(foo - 0x18) = foo;

      не находишь?
      Ответить
      • Вдруг это реализация ООП для какого-нибудь ЯВУ, по отрицательным смещениям находятся служебные данные объекта, а по какой-то причине нужно запомнить указатель на себя?
        Ответить
        • Ну если реализхация этого яву написано на си, то я удивлен: в си не бывает отрицательных смещений у укозателя
          Если только сам foo не родился в резлуьтате положительного смещения
          Ответить
          • > в си не бывает отрицательных смещений у укозателя
            Правда?

            Например я занимаюсь парсингом каких-то данных, у меня есть указатель на текущий рассматриваемый байт look, и если мне вдруг понадобится прочитать какой-нибудь предыдущий байт я могу написать look[-1] или look[-2] и тюпю Вполне законный прием.
            Ответить
            • откуда ты взял указатель look?

              если ты взял его из указателя hujuk путем прибавления к нему N, то я же написал

              >Если только сам foo не родился в резлуьтате положительного смещения


              если же look это результат malloc, то ты в жопе UB
              Ответить
              • > откуда ты взял указатель look?
                Ну передали откуда-нибудь указатель на буфер с данными, сначала он указывал на начало буфера, но по ходу чтения я его двигаю вперед, типичная же хуйня:
                for (uint8_t *look = buffer, *end = buffer + buffer_size; look < end; ++look) {
                    // что-то делаем
                }
                Вряд ли мне на самом первом байте понадобится смотреть на зад

                > я же написал
                Сорян, ты пишешь как мудак, Обезьяна сразу не поняла.
                Ответить
        • Это типа у меня 24 байта локальных переменных (три uint_8, например) и мой аналог BP показывает на SP-0x18?
          Ответить
          • Байта, а не бита. Ты сможешь вместить 24 uint_8. Точнее, 20, потому что 4 байта занимает копия "BP".
            Ответить
            • тьфу, да)
              uint_8 этоже байт

              короче,это как bp,тогда понятно

              а бывает FPO у powerpc?
              Ответить
              • Я тоже запутался, пришлось распутываться.

                В этом примере BP нет. Считай, что используется только SP (его аналогом выступает r1). Но зачем-то старое значение SP сохраняется в стеке же. Ага, считай, что тут было PUSH SP после SUB SP, <размер локальных данных>.

                Если же нам нужен FP, то стандартного регистра (типа BP) у PPC нет. В его качестве может использоваться произвольный номерной регистр (типа r31):
                https://lists.ozlabs.org/pipermail/linuxppc-dev/2005-August/019456.html
                Ответить
                • Асталось панять зочем там сохранили SP


                  BP хранили для двух вещей

                  * Человеку (не компилятору) проще считать смещение от BP к локальным переменным, чем смешение от SP (который постоянно скачет как блоха)
                  * Всегда можно найти головку от фрейма, даже если размер локальных данных неизвестен (символов нет, например). Дебагер может раскрутить стек

                  А тут зачем?

                  зы: зачем у интела стек растет задом наперед? Я из за этого постоянно путаюсь
                  Ответить
                  • У Интела стек растёт вниз, чтобы все данные стека находились по положительному смещению от BP.

                    Бывают процессоры вообще без инструкций для стека. Нужно ручками сооружать инструкцию для инкремента/декремента указателя и для мува с косвенной адресацией. Ну прямо, как... тут. У PPC даже нет CALL и RET. У него есть инструкция BL, сохраняющая адрес возврата в регистр LR и прыгающая на указанный адрес, и инструкция BLR, прыгающая на адрес возврата, сохранённый в регистре LR. Если тебе нужно вызвать подпрограмму из подпрограммы, ты должен сам сохранить LR в стеке, которого нет, точнее, который (в смысле стек) ты сам реализуешь программно. Процессор без CALL и без RET, Карл!

                    В официальном ABI у PPC стек тоже растёт вниз. Можешь сделать его растущим в другом направлении, чтобы обломать дизассемблеры и дебагеры.

                    А у кого стек растёт вверх?
                    Ответить
                      • Давай проверим.
                        STL, переведи на S"Forth".
                        Ответить
                    • Мне больше интересно, когда окультурили нотацию и стали называть регистры r0 вместо брейнфака li 0, 1
                      Ответить
                  • Оказывается, указатель на вершину стека сохраняют, чтобы вызываемой подпрограмме было легко найти адрес возврата родительской подпрограммы (напомню, что инструкции RET у PPC нету).

                    В общем, эмуляция стека на PPC - это целое искусство.
                    Ответить
                    • ха-ха, ну то-есть ровно для того, для чего BP используют безсимвольыне дебугеры.

                      Да, PPC это ППЦ. Хорошо, что Ябло ушло на сраный интел.
                      Ответить
                      • Я вспомнил препода, который панически боялся рекурсивных функций и просил переписать программу, так чтобы в ней были явные циклы вместо рекурсии, а также сокурсника, который в функции передавал данные не через аргументы, а через глобальные переменные, чтобы не засорять стек.

                        Полагаю, что ППЦ изобрели люди с примерно таким же мышлением.

                        Зато, поскольку на ППЦ стек всё равно реализуется закатом Солнца вручную, можно иметь сразу несколько софтварных стеков, как в Форте или в Постскрипте.

                        Добро пожаловать в архитектуру RISC.
                        Ответить
                        • Препода, блин.

                          Я такого программиста видел.
                          Даже если фиксированность глубины была очевидна (например, обходили захардкоженное двухуровневое дерево) он начинал верещать, что "рекурсия приводит к неконтролируемому возрастанию стека" и требовал переписать на циклы.

                          Эксперемент про обезьян, банан, и холодную воду знаешь?


                          >несколько софтварных стеков, к
                          Кстати, у потока и так два стека. Ядрёный и обычный
                          Ответить
                          • > Эксперемент

                            Нет, я только пароль Чингиза знаю.

                            Теперь знаю.
                            Ответить
                            • Ну вот такой хуйни у программистов много.

                              Одному мальчику в институте кто-то сказал, что шаблоны это плохо, и теперь он лучше руками накопипастит, чем возьмет шаблон.

                              Другому сказали, что регулярки никогда не читаемы, или что AOP неоправданно усложеняет код, или что java тормозит. Тысячи их.
                              Ответить
                                • Да, или что пхп говно:)

                                  Но вот если ты сам поел пхп, то можешь смело говорить, что пхп говно. А если ты об этом прочитал в блоге Умного Программиста Из Крутой Компании, то относиться надо критически мягко говоря.
                                  Ответить
                                  • Именно поэтому я против «веры». Конечно, кроме веры в Бога-Императора Единого Империума Человечества. Убей мутанта, сожги пхпэшника!
                                    Ответить
                              • А какой язык программирования самый быстрый?
                                Ответить
                              • Опять скотилось в беседу ватных алкашей. Идите уже накатите бояры за день наваросии.
                                Ответить
                                • Не отвечай им, если они ватные алкаши. Лучше выкати какой-нибудь код для мипса или для Apple ][.
                                  Ответить
                                    • Меня не предупредили. Я тут новенький. Где можно ознакомиться со списком уёбков?
                                      Ответить
                                  • Ха, а ведь у меня есть примерно та же интересная мне логика но под мипс! Годная идея, благодарю, сейчас посмотрю насколько усирается ида на таком асме.
                                    Ответить
                                      • Хуйня этот ваш мисп, .rodata не детектит нормально и хрефы не ставит. Вероятно секция кудато мапится, но я не знаю куда. Назад на PPC!
                                        Ответить
                                        • Даже изрядный прыщепердолинг с древним плагином для иды не дал годных результатов.
                                          Ответить
                            • Это пассфраза же, а Падлу сбрутили?

                              Я так думаю, что вымоченные в холодной воде бананы лучше заходят.
                              Ответить
                          • Требовал - это как? Он был твоим руководителем?
                            Ответить
        • Только IDA срать хотела на оффицальный ABI и предоставила мне определять функции вручную. А так то да, именно стекфреймы и ищу.
          Ответить
            • Типа того. Намечается зобавная тенденция - из неск. десятков интересных мне фукций те, которые скорее всего RTL - IDA определила, а те, которые скорее всего самописные - имеют нестандартную стэк мышине.
              Ответить
      • Это не DMA и не Wordpress, лишнехромосомный, это load/блять/store.

        Лучше вернись к воплям "игнорируйте его" и не лезь к дядям.
        Ответить
    • If GPR RA is not 0 and the storage access does not cause an Alignment Interrupt or a Data Storage Interrupt, then EA is placed into GPR RA.

      https://www.ibm.com/support/knowledgecenter/en/ssw_aix_72/assembler/idalangref_stwu_stu_instrs.html

      Если бы были разные регистры, выглядело бы так:
      lea eax, [eax - 0x18]
      mov [eax], ebx
      Случай, когда eax изначально равнялось нулю или когда произошло исключение, я не рассматриваю.

      Но тут слева и справа один и тот же регистр. Возможно, это UB.
      Ответить
      • Оказывается, не UB, а вполне штатная инструкция. После stwu r1, -0x18(r1) значение регистра r1 уменьшится на 0x18.
        А что будет лежать по адресу [r1-0x18]: старое значение r1 или новое?

        По картинкам похоже, что старое.
        Ответить

Добавить комментарий

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8