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

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    DEF "PARSE", 0, PARSE
        MOV    SI, [VAR_TO_IN]
        MOV    CX, [VAR_NTIB]
        SUB    CX, SI
        ADD    SI, [VAR_TIB]
        SUB    BP, 2
        MOV    [BP], SI
        REPNE  SCASB
        SUB    CX, [VAR_NTIB]
        NOT    CX
        MOV    [VAR_TO_IN], CX
        MOV    AX, SI
        SUB    AX, [BP]
        DEC    AX
        RET

    СУКА! УЖЕ В КОТОРЫЙ РАЗ ЗАБЫВАЮ, ЧТО У SCAS ИСПОЛЬЗУЕТСЯ DI, А НЕ SI.

    Запостил: UPPERCASE, 24 Ноября 2018

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

    • ДАВАЙТЕ РУГАТЬ Х86.
      Ответить
      • Сравним с другими инструкциями...

        LODSB читает из DS:[SI]
        STOSB пишет в ES:[DI]
        MOVSB копирует из DS:[SI] в ES:[DI]
        OUTSB выводит из DS:[SI]
        INSB принимает в ES:[DI]

        Во всех инструкциях копирования SI указывает на источник, DI указывает на получатель.

        Смотрим оставшиеся инструкции.
        CMPSB сравнивает DS:[SI] с ES:[DI]. Ну ладно, пусть тут будут два источника.
        SCASB сравнивает аккумулятор (AX) с ES:[DI].

        Сравниваем SCASB с CMPSB... Они решили аккумулятор поставить на первое место, поэтому оставшийся аргумент в памяти — второй по счёту, а второй у нас DI, ибо SI — первый. Если бы они аккумулятор поставили на второе место, то остался бы SI. С их точки зрения всё логично.

        Интересно, а у нестроковой инструкции CMP какой порядок? Оказывается, есть оба варианта:
        38H + mod-R/M = CMP r/m8, r8
        3AH + mod-R/M = CMP r8, r/m8
        39H + mod-R/M = CMP r/m, r (16, 32, 64 бита)
        3BH + mod-R/M = CMP r, r/m (16, 32, 64 бита)

        Т. е. нестроковая инструкция (CMP) может сравнивать регистр с памятью и память с регистром, а строковая (SCASB) только регистр с памятью, а противоположного варианта нет.

        Какой багор )))
        Ответить
        • P.S. Зато нестроковая (CMP) не может сравнить две памяти, а строковая (CMPSB) может.
          Ответить
        • > на первое место
          Кстати да, флаги формируются именно для такого положения аргументов.
          Ответить
        • Но вообще странно, у интела обычно справа src и слева dst. А тут получается, что movsb di, si но cmpsb si, di. Нелогично.
          Ответить
    • А нахуй это помнить?
      Ответить
    • показать все, что скрытоПереведи на 'PHP'.
      Ответить
      • Дата: 25.11.2018.
        Перевод на сумму: 0 (ноль) рублей 00 копеек.
        Комиссия: 0 рублей.
        Назначение перевода: на 'PHP'.
        Телефон службы поддержки: +7(495)637-70-70.
        Ответить
      • ВАЙ ЭМ СИ ЭЙ
        ВААААЙ ЭМ СИ ЭЙ
        Ответить
        • Нагуглил: http://www.nashaamerica.com/blogi/video/item-6259/

          Пиздец какой-то. Зачем оно здесь?
          Ответить
    • Ты что там пилишь?
      Ответить
      • А НА ЧТО ПОХОЖЕ?
        Ответить
        • На слово из форта?

          Я на асме писал только примитивы, а все эти слова запиливал уже на шитом коде форта...
          Ответить
          • Я ПИЛЮ ПОКА ПОДПРОГРАММНЫЙ КОД, ПОТОМ ХОЧУ ЕЩЁ ИНЛАЙН СДЕЛАТЬ ДЛЯ НЕКОТОРЫХ СЛОВ. А ВООБЩЕ МОЯ ЦЕЛЬ СЛЕПИТЬ МАЛЕНЬКУЮ ОС, НО ПОКА ЧТО ЭТО COM-ФАЙЛ ДЛЯ ДОС.
            Ответить
            • > ДЛЯ ДОС
              Купи какую-нибудь отладочную плату с ARM'ом. Всё веселее, чем под мёртвую ось писать...
              Ответить
              • Говно-x86-процессоры еще долго будут жить, вот даже в айфоне есть такое https://lcq2.github.io/x86_iphone/
                Ответить
                • Но legacy загрузка и 16-битный режим потихоньку умирают. На некоторых ноутах уже uefi-only. Старое железо, на которое полагались DOS'овские проги, заменяют на уёбищную софтовую эмуляцию через SMM.

                  Ещё лет пять и DOS на реальном железе уже не запустишь... Придётся искать на помойке компы 2006 года.
                  Ответить

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