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

    −2

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    9. 9
    sub1:
        ; ...
        push sub2.end
    sub2:
        ; ...
        ret
    .end:
        ; ...
        ret

    Это нормально? Или я мудэ?

    Запостил: 666_N33D135, 19 Июля 2018

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

    • Переведи на "PHP". Сейчас "Assembler" никого не ебёт.
      Ответить
      • унылое говно,
        ты не нужно
        Ответить
      • >> "Assembler" никого не ебёт.
        За ассемблер не скажу, и за всех тоже. Но вот про Вагиза и твою маму точно могу сказать
        Ответить
    • Это, типа, инлайн, но возможность вызывать sub2 из другого места оставлена :)
      Ответить
    • ХУЙ
      Ответить
    • Интересный приём. Но разве нельзя было просто вызвать sub2? :)
      Ответить
      • С веронятностью 99% sub2 вызывается только в sub1, вот я и избавился от call, оставив sub2 доступной для вызова. Вот, думаю, инлайнуть по-компиляторски, или вызвать её по-человечески.
        Ответить
        • Макрос сделай чтобы пирформанс на push/ret не терять :3

          З.Ы. Вроде бы пара push/ret не нравится предсказателю развратов, в отличие от call/ret.
          Ответить
          • Про RET:

            В защищенном режиме дальний возврат инициализирует проверку селектора и дескриптора адреса возврата. Кроме этого, возврат к меньшему уровню привилегий вызывает перезагрузку стека SS:eSP значением, сохраненным перед блоком параметров стека покидаемой процедуры. Сегментные регистры DS, ES, FS и GS могут быть очищены при выполнении дальнего возврата к меньшему уровню привилегий, если значения селекторов в этих регистрах задают сегменты, которые не могут быть использованы на новом уровне привилегий (определяется путем анализа соответствующих дескрипторов).

            Про CALL:

            В защищенном режиме обе формы с дальним указателем принимают во внимание значение байта AR в дескрипторе, указанном селекторной частью дальнего указателя. В зависимости от значения байта AR, происходит одно из следующих управляющих преобразований:

            • дальний вызов на том же уровне привилегий;
            • межуровневый дальний вызов;
            • переключение задачи.

            Если вызов осуществляется без переключения задачи, то флаги не изменяются. Переключение задачи вызывает перезагрузку регистра (E)FLAGS значением из TSS.


            Но эти побочные эффекты можно поймать только от CALL FAR / RETF. Ближний вызов/возврат вроде бы ничем таким не грозит.
            Ответить
            • ничосе, какой blast from the past 16bit OS era.

              Давно же уже никто через call gates не скачет
              Ответить
              • А черезо что сейчас все скачут?
                Ответить
                • В нулевое каллцо? Так SYSCALL же, не?

                  В другие задачи вообще не скачут
                  Ответить
          • Так и сделаю, наверное, просто мне понравилась эта штука :)

            ЗЫ. А, допустим, там, где нет предсказателей оно бы работало быстрее чем человечкий вызов (из-за отсутствия call в sub1)?
            Ответить
            • >> там, где нет предсказателей
              В 486?
              Ответить
              • А что нам грозит на машине с предсказателями, если к моменту вызова ret в предсказателе не будет возможных адресов возврата? Код, следующий после метки sub2.end, не будет вовремя загружен в конвейер и нам придётся подождать, пока отработают конвейер и декодер инструкций (если бы где-то ранее был call, то декодирование отработало бы в фоне)?
                Ответить
                • Ну выполнит хуйню и откатит.

                  А, если вообще не будет прогноза... Ну будет ждать и крутить nop'ы значит.
                  Ответить
                • Мне кажется что это будет такая вот зависимость по данным, и ему придется ждать

                  зы:
                  "Most assembly language programmers don’t bother to read Intel’s manuals (which are extremely informative and well done, but only slightly more fun to read than the phone book), and go right on programming . . "
                  (c) Michael Abrash, автор Zen оф то самое
                  Ответить
    • А мне нравится. push + ret = jmp.

      Ещё мне нравится call + pop. Тоже работает как jmp + даёт возможность получить адрес текущей инструкции, не генерируя фиксапов (релокейшнов) в объектном файле или в экзешнике.

      А ещё мне нравилось, когда Борланд Си/Паскаль в сегментированной модели генерировали push cs + call near вместо call far.
      Ответить
      • > получить адрес текущей инструкции, не генерируя фиксапов
        А теперь в x86_64 завезли RIP-related адресацию и этот хак оказался на обочине...
        Ответить
        • а как оно выглядет в асме?

          mov foo, [IP + 42] ?
          Ответить
          • А как оно ещё может выглядеть?
            Ответить
            • mov foo, [$ + 42]
              Ответить
              • Хм, эта штука аболютный адрес въебала. Тут тоже надо rel добавлять. Ну или default rel в шапке и вообще не париться.
                Ответить
                • То есть по умолчанию абсолютная адресация для совместимости со старым кодом, а RIP-based нужно требовать явно (кроме jmp short/near, где RIP-based была ещё со времён 8088).
                  Ответить
                  • У x86_64 ещё трабла есть -- он абсолютными адресами выше 4 гигов не достаёт, поле под адрес в инструкциях всего 4 байта.
                    Ответить
                    • То есть чтобы прыгнуть выше, нужно где-то вычислять расстояние от текущей инструкции до вызываемого кода?
                      Ответить
                      • P.S. Или использовать порочную схему push + ret?
                        Ответить
                      • а если она выше 8 гигов то надо ставить трамплины
                        Ответить
                        • > ставить трамплины
                          Ага, каждые 2 гига. Проще через регистр прыгнуть.
                          Ответить
                          • правдаштоле?!

                            Я шутил ващето.

                            То-есть наговнокодить на терабайты я не могу, только данные хранить?
                            А колы туда ОС какой полезный код загрузит -- как мне до него добраться?

                            зы: погоди
                            а нельзя huge pages какие-нить и двигать саму страницу?
                            Ответить
                            • push 0x1234567890ABCDEF
                              ret
                              Ответить
                              • А вот хуй!
                                Ответить
                              • и типа он считает этот адрес адресом возврата в стеке и туда прыгскок?)
                                (наконец я прочитал что вы тут пишите и понял)
                                Ответить
                              • P.S. Это эмуляция jmp — билет в один конец.

                                call придётся делать через регистры:
                                mov rax, 0x1234567890ABCDEF
                                call rax


                                Или что там можно использовать (сетку опкодов не смотрел)?
                                Ответить
                                • jmp тоже придётся делать через регистры, push почему-то не умеет такие большие числа. Благо регистров много стало...
                                  Ответить
                                  • пиздец

                                    вот тебе, бабка, и "линейная адресация".
                                    Думай дорогой программист что у тебя 2^64 байт памяти, а на самом деле вот
                                    Ответить
                                  • Так два раза пушнуть:
                                    [xode]push 0x12345678
                                    push 0x90ABCDEF[/code]
                                    Ответить
                                  • Всё время забываю про эти r15. Хотя на некоторых архитектурах регистров больше.
                                    Ответить
                            • А ты группируй свой терабайт кода так, чтобы сильно далеко прыгать приходилось пореже.
                              Ответить
                              • О хоспаде! Терябайт кода на асме – это же 10й круп ада!
                                Ответить
                                • почему на асме? что мешает использовать выскоуровневые япы?
                                  Ответить
                                • Ну может он его макросами нагенерил. Я однажды так лабу намакроёбил без единой функции, еле-еле в 64Кб влезло.
                                  Ответить
                                  • Тоже макроёбил много на масме в детстве, там целые выскоуровневые конструкции типа итерации по массивам делал. Препроцессор там был нящний,
                                    Ответить
                                    • У меня там формочки были декларативные. Что-то в духе:
                                      BUTTON 5,  2, "Yes", handle_yes
                                      BUTTON 10, 2, "No",  handle_no
                                      Ответить
                      • Тип того, но там тоже лимит на +-2 гига.
                        Ответить
          • В MASM/TASM/NASM/YASM/FASM адрес первого байта текущей инструкции обозначается знаком $.
            Ответить
            • В NASM можно тупо mov rax, [rel x] и не ебаться с оффсетами :)
              Ответить
            • З.Ы. Там оффсет от первого байта следующей инструкции надо указывать, оказывается.
              Ответить
              • В опкодах оффсет отсчитывается от первого байта следующей инструкции, а в Ассемблере — от первого байта текущей.
                jmp short $+2 компилируется в EB 00
                Ответить
                • > а в ассемблере -- от первого байта текущей
                  Хех, я эти $ никогда не юзал, всё через метки считал.
                  Ответить
                  • Возможно, это правильно, потому что ты не полагаешься на реализацию этого символа. Правда, засоряет пространство меток.

                    Кстати, бесконечный цикл в асме будет jmp short $, а в опкодах будет EB FE

                    P.S. Интересно, bormand перенабирает вручную чужие комментарии при цитировании или у него есть скрипт для (де)нормализации типографики.
                    Ответить
                    • > пространство меток
                      С локальными метками как-то вообще похуй.

                      > перенабирает
                      Ага, копировать дольше.
                      Ответить
                    • >>скрипт

                      Еще раз убеждаюсь что человечество деградирует.

                      В 80-х годах были юзнет клиенты, которые запускали $EDITOR и там сразу был весь текст сообщегния и можно было на него ответить.

                      Без всяких скриптов.

                      Теперь ты вместо родного эдитора юзаешь какой-то говноtextarea не удобный, без хоткеев, не скриптуемый, с чуждым тебе шрифтом, и еще даже копирования нет.

                      Правильно. "Зачем делать автоматически то, что можно сделать вручную?" -- главный девиз современных технологий.
                      Ответить
                      • > еще даже копирования нет

                        У тебя в браузере копирования нет?
                        Ответить
                        • Имелось ввиду кнопочка "автоцитирование" конечно же:)

                          Хотя ты прав: копирование у меня уебищное бо виператора нет
                          Ответить
                          • А в tyradactl нет копирования? Не припомню.

                            Ну, отсутствие автоцитирования -- не современных технологий проблема, а страйкера. Но на таком сайте грех жаловаться.

                            Кстати, подозреваю, что меня бы подбешивало это автоцитирование, если бы было в интерфейсе или какая хуета вылезала бы при выделении. Не люблю такое. Вот строки с '>' после постинга неплохо было бы подсветить или отбить...
                            Ответить
                            • Посмотри на проблему шире: раньше в моде был unix way.
                              Это означило что если я привык к какому-то редактору (vi или emacs, не важно) то мне и надо его всегда показывать для любого редакторования.

                              Я так же мог выбрать news reader, irc client, почтовый клиент (mutt например) по вкусу.

                              Теперь мне рекомендуется использовать вебморду, которая навязывает мне свой UI и свои хоткеи.
                              Ответить
                              • Почему все браузеры — говно такое?
                                Ответить
                                • Почему браузер не может твой $EDITOR запустить в textarea?

                                  lynx может
                                  Ответить
                                • Поправочка. Все прыщебраузеры
                                  Ответить
                              • Говно ещё в том, что изо всех щелей повылезали дизайнеры, которым не нравятся нативные элементы управления, которые на своих сайтах прячут нативные скроллбары и рисуют свои, прячут нативные кнопки и рисуют свои и т. д. В результате веб превратился в пёструю парашу. К каждому сайту нужно привыкать, искать на нём элементы управления, учиться ими пользоваться.
                                Ответить
    • sub1:
          ; ...
          mov [sub2.l1 + 1], sub2.end - sub2.l2
      sub2:
          ; ...
      .l1:
          jmp sub2
      .l2:
          ...
      .end:
          ; ...
          ret
      Ответить
      • С джвумя потоками будет забавно работать.
        Ответить
        • Антипаттерн «Гонки»?
          Ответить
        • Починил (16 бит):

          sub1:
              ; ...
              db 0BAh     ; вместе со следующей инструкцией составит опкод mov dx, 0D233h
          sub2:
              xor dx, dx
              ; ...
              test dx, dx
              jne .end
              ret
          .end:
              ; ...
              ret
          Ответить

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