- 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
666_N33D135 21.06.2018 17:27 # 0
baobab 21.06.2018 17:32 # 0
666_N33D135 21.06.2018 17:58 # 0
guest8 18.07.2018 13:53 # −999
guest8 18.07.2018 14:03 # −999
666_N33D135 18.07.2018 15:11 # 0
_tib – входной буфер, он содержит текущую интерпретируемую строку, в самом Форте его адрес возвращает слово TIB;
_ntib – содержит длину строки в буфере, в Форте слово #TIB возвращает адрес этой переменной (если я правильно помню, в стандарте ANS FORTH это слово признали устаревшим и оно не обязательно должно быть в стандартной Форт-системе, адрес и число символов во входном буфере можно получить словом SOURCE;
_toin – содержит номер текущего просматриваемого символа в буфере, в Форте адрес этой переменной возвращает слово >IN (читается как to in);
_here – содержит адрес начала нераспределённой области памяти (я не стал говорить "вершина кодофайла", чтобы не пугать тебя), в Форте значение этой переменной возвращает слово HERE.
А вообще эта подпрограмма реализует слово WORD, которое берет со стека данных символ-сепаратор (у меня верхний элемент стека хранится в EAX), пропускает во входной строке ведущие сепараторы, и выбирает подстроку пока не встретит сепаратор, если символ-сепаратор – пробел, то оно пропускает все символы с кодом <= 32 (модификаются джумпы по адресам .b1 и .b2), и копирует эту подстроку по адресу в _here, и возвращает адрес этой строки, первым байтом идёт длина строки, дальше – сама строка; при следующем распределении памяти под другие данные эта строка затрётся, поэтому это хранилище временное, но можно сохранить эту строку если выделить память длиной длина строки + 1, память для следующих данных будет располагатся уже за ней, а можно просто скопировать в нужное место.
Фуф!
666_N33D135 22.06.2018 17:10 # 0