in4 писал(а):
Можно подробнее о возникающих трудностях?
Они практически не делятся на удобные где-то еще кирпичики. Например, тот же WORD :
Код:
Header 4, 'WORD', @WORD ; c -- ca
push esi
push edi
mov al, bl
mov edi, hMem ; позиционирование
mov ecx, [edi - 4]
add edi, @3EIN@
sub ecx, @3EIN@ ; исчерпание?
jg @F
sub ecx, ecx
jmp lWORD9
@@: cmp al, 20h ; разделитель - пробел?
jnz lWORD5
@@: cmp [edi], al ; начало слова?
ja @F
inc edi ; спецсимволы перед словом
dec ecx
jnz @B
mov esi, edi ; слово так и не началось
mov ecx, edi
jmp lWORD8
@@: mov esi, edi ; начало слова
@@: cmp [edi], al ; конец слова?
jbe @F
inc edi
dec ecx
jnz @B
mov ecx, edi ; слово до исчерпания
jmp lWORD8
@@: mov ecx, edi ; слово кончилось
inc edi
jmp lWORD8
lWORD5: repz scasb ; разделители перед словом
jnz @F
mov esi, edi ; слово так и не началось
mov ecx, edi
jmp lWORD8
@@: dec edi ; начало слова
inc ecx
mov esi, edi
repnz scasb
mov ecx, edi
jnz lWORD8
dec ecx ; длина остатка
lWORD8: sub edi, hMem ; новая позиция
mov @3EIN@, edi
sub ecx, esi
cmp ecx, 255
jbe lWORD9
mov ecx, 255 ; обрезание длинного слова
lWORD9: pop edi ; перенос слова
mov [edi], cl
push edi
inc edi
rep movsb
sub al, al
stosb
pop edi
pop esi
mov ebx, edi
Next
Конечно, можно записать, как (функциональность немного другая)
Код:
: WORD
BLK @ ?DUP IF BLOCK ELSE TIB THEN
>IN @ + SWAP ENCLOSE >IN +! HERE 1+ SWAP DUP >R CMOVE
R> 1- HERE C! HERE ;
Но суть останется прежней: ENCLOSE , обеспечивающее основную функциональность, опять ассемблерное. А, вот, наглядности не прибавилось!