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

    +1

    1. 1
    2. 2
    3. 3
    4. 4
    MOV     CX,4                    ;All devices are 4 letters
    REPE    CMPSB                   ;Check for name in list
    JZ      IOCHK                   ;If first 3 letters OK, check for the rest
    ADD     SI,CX                   ;Point to next device name

    Вроде не обсуждали код MS-DOS
    https://github.com/Microsoft/MS-DOS

    Запостил: vistefan, 21 Ноября 2018

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

    • seo: #MSDOS
      Ответить
    • А где сама метка IOCHK-то?
      Ответить
      • Вот:¹
        IOCHK:
                IF      IBM
                CMP     BH,NUMDEV       ;Is it the first device?
                JNZ     NOTCOM1
                MOV     BH,2            ;Make it the same as AUX
        ¹ — https://github.com/Microsoft/MS-DOS/blob/master/v1.25/source/MSDOS.ASM#L531
        Ответить
        • >> IF IBM
          Препроцессор клевый)

          Все пнятненько, тащемто. Ложим в CX четверку чтобы REPE 4 раза повторила CMPSB которая сравнивает байты по адресу DS:SI с байтами по адресу ES:DI и устанавливает флаг.
          Если флаг нулевой то прыг (JZ) на IOCHK, а иначе к SI прибавляет 4 чтобы проверить следующее слово в DS
          Ответить
          • А почему "All devices are 4 letters", а потом "If first 3 letters OK, check for the rest"
            Ответить
            • Рискну предположить что там 3 буквы и нолик в конце например
              Сейчас придут Борманд с Инкаусом и объяснят
              Ответить
              • Нет там нолика в конце. Это строка фиксированной длины. Неиспользованный остаток длины забивается пробелами.
                NAME1   DB      11 DUP (?)              ;File name buffer

                NAME1 состоит из 8 букв имени файла и трёх букв расширения имени файла. Неиспользованные символы добиваются пробелами.
                IONAME:
                        IF      NOT IBM
                        DB      "PRN ","LST ","NUL ","AUX ","CON "
                        ENDIF
                        IF      IBM
                        DB      "COM1","PRN ","LPT1","NUL ","AUX ","CON "
                        ENDIF

                И здесь тоже пробелы.

                В версии NOT IBM все имена девайсов были трёхбуквенными, потому и сохранился комментарий про "3 letters".
                Ответить
            • Видимо, ради IBM удлинили последовательности в IONAME с 3 буквей до 4, а комментарий #L523 не поправили.
              Ответить
    • https://govnokod.ru/24834 - уже вбрасывал
      Ответить
    • ТОГДА МЕНЯ ЛЮБИЛИ...
      Ответить
    • Вы бы хоть пояснения давали, постя код на ассемблере/сях, хотя бы ради того, чтобы не упасть в глазах несведующих (например, меня), которым Ваш бугурт непонятен. В их глазах Вы - как ебанашки мудрецы с запятнанными лбами, которые смеются друг над другом.
      Всегда помните об этом.
      Ответить
      • Это что, полная версия комментария <<переведи на "PHP">>?
        Ответить
      • так вот же пояснение http://govnokod.xyz/_25106/#comment-403636
        Ответить
      • ПЕРЕВЁЛ НА "PASCAL". ПРОВЕРЬ:
        CX := 4;
        ZF := TRUE;
        WHILE CX <> 0 AND ZF DO
        BEGIN
            IF SI^ <> DI^ THEN
                ZF := FALSE
            ELSE
            BEGIN
                ZF := TRUE;
                INC(SI);
                INC(DI);
                DEC(CX)
            END
        END;
        IF ZF THEN GOTO IOCHK;
        SI := SI + CX;
        Ответить
        • https://github.com/radare/radare2/issues/7617
          Ответить
          • http://pmk.tversu.ru/dis/33/lect1.pdf#section.4.4
            Ответить
          • У LLVM до версии 2.9 был переводчик на "C". Потом что-то забили на поддержку.
            Ответить
            • Для этого надо было б еще ESIL (или сразу сам ассемблер) переводить в LLVM-байткод

              https://www.youtube.com/watch?v=hVD6ev_9VgE
              Ответить
        • Хуёво перевел, каша кака́я-то.

          @SI^ <> DI^
          Это в каком таком пасцале стало возможным сравниение ссылок логическими операндами?
          Ответить
          • Что за хуйню я только что прочитал?

            1. В Паскале всегда можно было сравнивать указатели (правда, только операторами = и <>).

            2. Тут сравнение не указателей, а разыменованных данных (бо крышечка означает разыменование).

            Что за «сравниение ссылок логическими операндами»?
            Ответить
            • Разыменованный указатель как раз и является ссыjlкой - чудесное открытие, правда?..
              Я не силен в пасцале, но в делфях сравнение "разыменования данных", как ты выразился, возможно, только если указатель типизированный, в противном случае, компилятор подумает, что ты хочешь сравнить хуй с пальцем, и не станет это компилировать.
              Ответить
              • Да, разыменовать нетипизированный указатель (pointer, аналог сишного void *) нельзя. Но мы не знаем, как объявлены SI и DI, чтобы в этом месте кидаться какашками в автора. Если они объявлены как указатели на байт, то всё нормально.

                Меня вот это больше беспокоит: SI := SI + CX;

                Если переменная SI объявлена как указатель, то арифметические операции с ней выполнять нельзя. Нужно кастовать в число: longint(SI) := longint(SI) + CX; Либо вызывать процедуру Inc. Например, так: Inc(SI, CX);
                Ответить
                • @"(Inc)"
                  Если указатель типизированный, он инкрементится на + SizeOf(Data).
                  Ответить
                  • Поясните свою мысль.

                    P.S. Понял. Если SI: ^DataType, то Inc(SI, CX) прибавит к указателю CX*SizeOf(DataType).
                    Ответить
                    • type
                        PStruct=^Struct;
                        TStruct=record
                         fieldname1:dword;
                         fieldname2:dword;
                      end;
                      
                      var
                        P:PStruct;
                      begin
                        New(P);
                        {...}
                        Inc(DWORD(P), SizeOf(TStruct)) будет эквивалентно Inc(P);
                      end;


                      PChar увеличивается на + SizeOf(Char), и т.д.

                      Это юзабельно лишь в массивах.
                      Ответить
                • P.S. Если модель памяти сегментированная, то просто кастовать в число нельзя, нужно раскладывать указатель на сегмент и смещение.
                  Ответить
                  • Сегментированная, это типа как из файла читать?
                    Ответить
                    • https://ru.wikipedia.org/wiki/Сегментная_защита_памяти
                      Ответить
                    • Нет. В реальном режиме и в 16-битном защищённом указатель представлял собой запись из двух полей: смещение и сегмент. Был даже объявлен тип PtrRec = record Ofs, Seg: Word end;

                      В реальном режиме линейный адрес вычислялся как Ofs + Seg * 16. В защищённом всё хуже: для получения линейного адреса нужно было в таблице дескрипторов искать запись по номеру Seg. В операционках даже был API для получения этого адреса. Поэтому в защищённом режиме обычно линейный адрес не получали, ограничивая размеры массива размером сегмента (64 килобайта для 16-битных смещений). Короче, инкремент применяли только к смещению.
                      Ответить
                    • Короче, в данном примере реальный режим, изменяем только смещение указателя, сегмент не трогаем. Поэтому каст указателя в число будет выглядеть как PtrRec(SI).Ofs.
                      Ответить
        • ч86 просил передать, что выполняет твою ветку ELSE безусловно. Проверь.
          Ответить
          • ОТРЕДАКТИРОВАНГАЯ ВЕРСИЯ:
            {ПЕРЕВОЖУ РЕПЕ ЦМПСБ, ПЛЭТОМУ СИ И ДИ УКОЗАТЕЛЛИ НА ЧАР ИЛИ БАЙТ}
            CX := 4;
            ZF := TRUE;
            WHILE CX <> 0 AND ZF DO
            BEGIN
                ZF := SI^ = DI^;
                INC(SI);
                INC(DI);
                DEC(CX)
            END;
            IF ZF THEN GOTO IOCHK;
            INC(SI + CX);
            Ответить

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