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

0

  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 vistefan, (Updated )

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

      • >> 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 не поправили.
            Ответить
  • Вы бы хоть пояснения давали, постя код на ассемблере/сях, хотя бы ради того, чтобы не упасть в глазах несведующих (например, меня), которым Ваш бугурт непонятен. В их глазах Вы - как ебанашки мудрецы с запятнанными лбами, которые смеются друг над другом.
    Всегда помните об этом.
    Ответить
    • Это что, полная версия комментария <<переведи на "PHP">>?
      Ответить
    • ПЕРЕВЁЛ НА "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;
      Ответить
        • У LLVM до версии 2.9 был переводчик на "C". Потом что-то забили на поддержку.
          Ответить
              • Охуе ох, уехал мой любимый


                Палец в жо
                Палец в желтеньком колечке
                Запер де
                Запер девку навека
                Ответить
                • Красная девица, уху я варила.
                  Уху я, уху я, уху я варила.

                  Уху я варила, сваху я кормила.
                  Сваху я, сваху я, сваху я кормила.

                  На речку ходила, ольху я ломала.
                  Ольху я, ольху я, ольху я ломала.

                  Ольху я ломала, сверху я упала.
                  Сверху я, сверху я, сверху я упала.

                  Сверху я упала, рубаху я порвала.
                  Рубаху я, рубаху я, рубаху я порвала.

                  Рубаху я порвала, Доху я купила.
                  Доху я, доху я, доху я купила.
                  Ответить
                  • Ну какой же новый год без даты - без датый
                    Ответить
                • Следами снежный наст штрихуя,
                  по склону двигались три деда.
                  Вели неспешную беседу,
                  о тленной старости толкуя.

                  Пора закончить с альпинизмом,
                  да заниматься огородом,
                  мне всё труднее с каждым годом
                  бороться с дряхлым организмом.

                  А я, пожалуй, вспомню греблю,
                  да и старуха любит воду.
                  Я приучил её к походам –—
                  садится в лодку, не колеблясь.

                  А как же первенство Европы! –—
                  воскликнул третий, сев на камень,
                  но соскользнул, взмахнув руками,
                  и потащил всю связку в пропасть.

                  Их нервы были на пределе,
                  они летели и вопили,
                  но вверх взметнув три тонны пыли,
                  в итоге всё же уцелели.
                  Ответить
      • Хуёво перевел, каша кака́я-то.

        @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. Если модель памяти сегментированная, то просто кастовать в число нельзя, нужно раскладывать указатель на сегмент и смещение.
                Ответить
                • Сегментированная, это типа как из файла читать?
                  Ответить
                  • Нет. В реальном режиме и в 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);
          Ответить
      • Всё так, если DF сброшен (была инструкция CLD где-то выше). Если же DF установлен, то INC(SI) и INC(DI) надо менять на декременты.
        Ответить
  • Стертор это яйцеглист, и он снова проснулся. ГК требуется денгельментизация.
    Ответить
  • Вам треба не "денгельминтизация", а джентельментизация.
    Свинорылые уёбки.
    Ответить

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

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

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


    8