- 01
 - 02
 - 03
 - 04
 - 05
 - 06
 - 07
 - 08
 - 09
 - 10
 - 11
 - 12
 - 13
 - 14
 - 15
 - 16
 - 17
 - 18
 - 19
 - 20
 - 21
 - 22
 - 23
 - 24
 - 25
 - 26
 - 27
 - 28
 - 29
 - 30
 - 31
 - 32
 - 33
 - 34
 - 35
 - 36
 - 37
 - 38
 - 39
 - 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
                                 
        
_tib – входной буфер, он содержит текущую интерпретируемую строку, в самом Форте его адрес возвращает слово TIB;
_ntib – содержит длину строки в буфере, в Форте слово #TIB возвращает адрес этой переменной (если я правильно помню, в стандарте ANS FORTH это слово признали устаревшим и оно не обязательно должно быть в стандартной Форт-системе, адрес и число символов во входном буфере можно получить словом SOURCE;
_toin – содержит номер текущего просматриваемого символа в буфере, в Форте адрес этой переменной возвращает слово >IN (читается как to in);
_here – содержит адрес начала нераспределённой области памяти (я не стал говорить "вершина кодофайла", чтобы не пугать тебя), в Форте значение этой переменной возвращает слово HERE.
А вообще эта подпрограмма реализует слово WORD, которое берет со стека данных символ-сепаратор (у меня верхний элемент стека хранится в EAX), пропускает во входной строке ведущие сепараторы, и выбирает подстроку пока не встретит сепаратор, если символ-сепаратор – пробел, то оно пропускает все символы с кодом <= 32 (модификаются джумпы по адресам .b1 и .b2), и копирует эту подстроку по адресу в _here, и возвращает адрес этой строки, первым байтом идёт длина строки, дальше – сама строка; при следующем распределении памяти под другие данные эта строка затрётся, поэтому это хранилище временное, но можно сохранить эту строку если выделить память длиной длина строки + 1, память для следующих данных будет располагатся уже за ней, а можно просто скопировать в нужное место.
Фуф!