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

    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
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    getword:
        push ebx ecx esi edi
        cmp al, ' '
        jbe .be
        mov byte [.b1], 0x74
        mov byte [.b2], 0x74
        jmp .start
    .be:
        mov byte [.b1], 0x73
        mov byte [.b2], 0x73
    .start:
        mov edi, _tib
        mov ebx, edi
        add ebx, [_ntib]
        add edi, [_toin]
    .l1:
        cmp edi, ebx
        jae .l3
        scasb
    .b1:jae .l1
        mov esi, edi
        mov edi, [_here]
        inc edi
        dec esi
        xor ecx, ecx
    .l2:
        cmp esi, ebx
        jae .l3
        cmp al, [esi]
    .b2:jae .l3
        movsb
        inc ecx
        jmp .l2
    .l3:
        mov eax, [_here]
        mov [eax], cl
        sub esi, _tib - 1
        mov [_toin], esi
        pop edi esi ecx ebx
        ret

    Оооооо даааааааааа!

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

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

    • хочу лошадку
      Ответить
    • Мутирующий кот. Ни винда ни линупс не жаловались.
      Ответить
      • _tib — это thread information block, который в Винде можно достать из регистра FS:?
        Ответить
        • И вообще кто такие _ntib и _toin?
          Ответить
          • Эта подпрограмма не зависит от ОС, это всё имена Фортовских переменных:
            _tib – входной буфер, он содержит текущую интерпретируемую строку, в самом Форте его адрес возвращает слово TIB;
            _ntib – содержит длину строки в буфере, в Форте слово #TIB возвращает адрес этой переменной (если я правильно помню, в стандарте ANS FORTH это слово признали устаревшим и оно не обязательно должно быть в стандартной Форт-системе, адрес и число символов во входном буфере можно получить словом SOURCE;
            _toin – содержит номер текущего просматриваемого символа в буфере, в Форте адрес этой переменной возвращает слово >IN (читается как to in);
            _here – содержит адрес начала нераспределённой области памяти (я не стал говорить "вершина кодофайла", чтобы не пугать тебя), в Форте значение этой переменной возвращает слово HERE.

            А вообще эта подпрограмма реализует слово WORD, которое берет со стека данных символ-сепаратор (у меня верхний элемент стека хранится в EAX), пропускает во входной строке ведущие сепараторы, и выбирает подстроку пока не встретит сепаратор, если символ-сепаратор – пробел, то оно пропускает все символы с кодом <= 32 (модификаются джумпы по адресам .b1 и .b2), и копирует эту подстроку по адресу в _here, и возвращает адрес этой строки, первым байтом идёт длина строки, дальше – сама строка; при следующем распределении памяти под другие данные эта строка затрётся, поэтому это хранилище временное, но можно сохранить эту строку если выделить память длиной длина строки + 1, память для следующих данных будет располагатся уже за ней, а можно просто скопировать в нужное место.

            Фуф!
            Ответить
    • Вот я дурашка! xor ecx, ecx надо было сунуть под .start, а то если из 1-го сыкла прыгнуть на .l3 в ecx могёт быть вмякая хумта.
      Ответить

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