1. Assembler / Говнокод #25970

    −1

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

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

    Запостил: nymuHckuu_nemyx, 17 Октября 2019

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

    • Перевел на x86:
      mov [eax - 0x18], eax
      А в чем говно, я не понял?
      Ответить
      • показать все, что скрытоЭто же ебанутый уебан, он скорее всего даже не понял, что тут написано.


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

        *(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) {
                      // что-то делаем
                  }
                  Вряд ли мне на самом первом байте понадобится смотреть на зад

                  > я же написал
                  Сорян, ты пишешь как мудак, Обезьяна сразу не поняла.
                  Ответить
        • Он это откуда-то взял. И взял он это из официального ABI:
          http://www.eecs.umich.edu/courses/eecs373.w04/ABI_matt.pdf

          В r1 хранится указатель на вершину стека, а инструкция stwu r1, -0x18(r1) реализует сохранение frame pointer.
          Ответить
          • показать все, что скрытоЭто типа у меня 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 стек тоже растёт вниз. Можешь сделать его растущим в другом направлении, чтобы обломать дизассемблеры и дебагеры.

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

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

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

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

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

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

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

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


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

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

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

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

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

                                    Но вот если ты сам поел пхп, то можешь смело говорить, что пхп говно. А если ты об этом прочитал в блоге Умного Программиста Из Крутой Компании, то относиться надо критически мягко говоря.
                                    Ответить
                                    • Это хлеб!
                                      Ответить
                                    • Именно поэтому я против «веры». Конечно, кроме веры в Бога-Императора Единого Империума Человечества. Убей мутанта, сожги пхпэшника!
                                      Ответить
                                • А какой язык программирования самый быстрый?
                                  Ответить
                                  • Ну у нас же тут на полном серьезе недавно говорили, что "mysql быстрый", а значит нет повода использовать другие субд.
                                    Ответить
                                    • А NoSQL ещё быстрее. А ещё в NoSQL нет никакого SQL, поэтому SQL-инъекции ему не грозят.
                                      Ответить
                                      • Быстрее всего JavaScript, это все знают
                                        Ответить
                                        • Это всё потому, что в нём нет крестошаблонов и жабогенериков.
                                          Ответить
                                          • Кстати, в тайпскрипте есть обобщенное программирование
                                            Ответить
                                      • Инканус, я тебе письмо посылал, проверь.
                                        Ответить
                                • Опять скотилось в беседу ватных алкашей. Идите уже накатите бояры за день наваросии.
                                  Ответить
                                  • Не отвечай им, если они ватные алкаши. Лучше выкати какой-нибудь код для мипса или для Apple ][.
                                    Ответить
                                    • Нахуй ты отвечаешь уебку?
                                      Ответить
                                      • Меня не предупредили. Я тут новенький. Где можно ознакомиться со списком уёбков?
                                        Ответить
                                        • hormand
                                          scvhost
                                          nemyx_pycu4
                                          nyTuH_nugop
                                          rss
                                          nymuHckuu_nemyx
                                          AHCKujlbHblu_netyx
                                          MEXAHu4ECKuu_nemyx
                                          rycb_xpycTaJlbHblu
                                          AHaHkacmHbIu_nemyx
                                          fuckyou
                                          cmepmop
                                          nemywok_Ha_naJlO4KE
                                          MPA3uIII
                                          rHujlb
                                          Dpyrou_Pycoqpo6_CEMA
                                          BATHbIu_nemyx
                                          Ответить
                                        • Если отвечать уебку, то у него будет мотивация писать ещё. Поэтому пусть пиздит с самим собой пока не заебётся.
                                          Ответить
                                    • Ха, а ведь у меня есть примерно та же интересная мне логика но под мипс! Годная идея, благодарю, сейчас посмотрю насколько усирается ида на таком асме.
                                      Ответить
                            • Требовал - это как? Он был твоим руководителем?
                              Ответить
                              • В каком-то смысле да. Это было оооочень давно
                                Ответить
                  • r1 тоже не стандартный, а просто соглашение, в моем случае - не особо надежное. см. http://govnokod.ru/25970#comment509179
                    Ответить
          • Только IDA срать хотела на оффицальный ABI и предоставила мне определять функции вручную. А так то да, именно стекфреймы и ищу.
            Ответить
            • Реверсишь что-то?
              Ответить
              • показать все, что скрытонахуй ты отвечаешь уебку?
                Ответить
                • Ты заебеал, тебя забыл спросить, кому мне отвечать. Вбей себе в фильтр return true и сиди, радуйся.
                  Ответить
              • Типа того. Намечается зобавная тенденция - из неск. десятков интересных мне фукций те, которые скорее всего 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 или новое?

          По картинкам похоже, что старое.
          Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
    • Проведена дезинфекция
      Ответить
      • Это цензура или тебя штырит от дезинфекции? (Что-то её много! Мега-много!)
        Ответить

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