Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
Гость писал(а): А как быть, если в тексте нужен символ ";"?
Можно использовать не клавиатурный символ.
В определении больших строк я сделал ошибку - применил JMP REL8, а надо JMP REL32.
Правильно будет так:
Код: : T: ( name "text" -- ) : 5 ALLOT DP @ >R BEGIN NextWord 2DUP 1 = IF C@ [CHAR] • = IF 2DROP 1 ELSE OVER C@ [CHAR] \ = IF DROP 0xD PARSE DROP OVER - BL FILL ELSE LEX+ THEN 0 THEN ELSE DROP DUP 0= IF 2DROP REFILL DROP ELSE LEX+ THEN 0 THEN UNTIL DP @ R@ 5 - DP ! 0xE9 C, DUP R@ - , DUP DP ! R@ SWAP R> - DLIT, POSTPONE ; ; Попробовал длинные строки на предмет другой техники поиска слов в словарях. Код: T: TWORDS \ имена слов словаря FORTH DONE INIT (INIT) SPF-INIT? ;.. ..: ... SPF-INI TITLE (TITLE) FATAL-HANDLER1 EXC-DUMP1 DUMP-TRACE-SHRUNKEN TRACE-TAIL-SIZE TRACE-HEAD-SIZE DUMP-TRACE AT-EXC-DUMP STACK-ADDR. IN-EXCEPTION USER-EXIT PROCESS-INIT ERR-EXIT USER-INIT POOL-INIT AT-PROCESS-STARTING AT-THREAD-STARTING ALIGN-BYTES-CONSTANT MAINX OPTIONS (OPTIONS) COMMANDLINE-OPTIONS SUBSTRING-OPTIONS SAVE RESOURCES-SIZE RESOURCES-RVA IMAGE-BASE IMAGE-SIZE IMAGE-BEGIN ORG-ADDR CGI-OPTIONS POST? CGI? TERMINATE PAUSE STOP RESUME SUSPEND START ERASE-IMPORTS TASK: TASK WNDPROC: CALLBACK: EXTERN WINAPI: __WIN: NEW-WINAPI? WINAPLINK OEM>ANSI ANSI>OEM PROC-ERROR1 LIB-ERROR1 ERROR2 DECODE-ERROR (DECODE-ERROR) FORTH_ERROR ENVIRONMENT? (ENVIR?) EXECUTE ?DUP RDROP >R R> }} {{ ;MODULE EXPORT MODULE: UNLOOP LEAVE I +LOOP LOOP ?DO DO RECURSE AGAIN REPEAT WHILE UNTIL BEGIN THEN ELSE IF ?LITERAL2 ?SLITERAL2 HEX-SLITERAL ?LITERAL1 ?SLITERAL1 ['] ABORT" [CHAR] ." C" S" CLITERAL SLITERAL 2LITERAL LITERAL -- FIELD \EOF EXIT ; [COMPILE] ( .( \ POSTPONE TO : :NONAME HIDE SMUDGE C-SMUDGE BEHAVIOR! BEHAVIOR ->VECT USER-VECT USER-VALUE USER USER-CREATE USER-ALIGNED ->VARIABLE VECT VALUE CONSTANT VARIABLE VOCABULARY DOES> (DOES2) (DOES1) CREATE CREATED HEADER SHEADER1 SHEADER LAST-NON LAST-CFA REQUIRE REQUIRED INCLUDED INCLUDED_STD INCLUDE-DEPTH (INCLUDED1) (INCLUDED) INCLUDE-PROBE INCLUDE-FILE TranslateFlow FIND-FULLNAME1 FIND-FULLNAME HEAP-COPY RECEIVE-WITH RECEIVE-WITH-XT PROCESS-ERR1 PROCESS-ERR EVALUATE EVALUATE-WITH RESTORE-SOURCE SAVE-SOURCE QUIT MAIN1 ] [ OK1 .SN #(SIGNED) INTERPRET &INTERPRET INTERPRET_ NOTFOUND EVAL-WORD BYE CHAR ' WORD ?COMP ?STACK DEPTH ?SLITERAL ?LITERAL <MAIN> OK BLK STATE WARNING R0 S0 SAVE-ERR (ABORT1") ?ERROR LAST-WORD ERR-STRING ERR-FILE ERR-LINE ERR-IN# ERR-LINE# ERR-NUMBER NOTSEEN-ERR SEEN-ERR SEEN-ERR? ERR-DATA /err-data err.file err.line err.notseen err.in# err.line# err.number /errstr_ ER-U ER-A (ABORT") ERROR WORDS NLIST W-CNT >OUT LATEST ORDER VOC-NAME. PREVIOUS ALSO SET-ORDER ONLY FORTH GET-ORDER DEFINITIONS FIND1 SFIND CONTEXT S-O SEARCH-WORDLIST1 SEARCH-WORDLIST-NFA CDR-BY-NAME SEARCH-WORDLIST FIND NEAR_NFA WordByAddr (WordByAddr) (NEAREST-NFA) (NEAREST3) (NEAREST2) (NEAREST1) FOR-WORDLIST ENUM-VOCS-FORTH (ENUM-VOCS-FORTH) ENUM-VOCS IS-CLASS-FORTH VOC IMMEDIATE ?VOC ?IMMEDIATE IS-VOC IS-IMMEDIATE ID. CDR NAME>L NAME>F NAME>C NAME> WID-EXTRA PAR@ PAR! CLASS@ CLASS! FREE-WORDLIST TEMP-WORDLIST WORDLIST AT-WORDLIST-CREATING BUILD-DATE VERSION WL_SIZE +WORD +SWORD >BODY FORTH-WORDLIST &VOC &IMMEDIATE LAST VOC-LIST _VOC-LIST ALIGN-NOP ALIGN ALIGNED ALIGN-TO ALIGN-BYTES >RESOLVE >RESOLVE1 >ORESOLVE >ORESOLVE1 <MARK >MARK ", SLIT, S", S, ?BRANCH, RLIT, DLIT, LIT, RET, BRANCH, COMPILE, _COMPILE, HERE RESOLVE_OPT J_OPT? J_MOVE J_+! J?_STEP CON>LIT FORLIT, OPT ???BR-OPT ??BR-OPT ?BR-OPT BR-EVEN-EAX ?BR-OPT-RULES MACRO, INLINE, OPT_INIT OPT_CLOSE XC_J _INLINE, 2A_,_STEP 1A_,_STEP 0A_,_STEP A_,_STEP 7_,_STEP 6_,_STEP 5_,_STEP 4_,_STEP 4_,_STEP_ 3_,_STEP 2_,_STEP 1_,_STEP +EBP MACRO? INLINE? DO_OPT OPT_ -EVEN-EBP OPT-RULES ?C-JMP ?EAX=RULES FPOP DO_EAX>ECX ?EAX:=ECX EBX:=EAX ECX:=EAX F?EAX>ECX T?EAX>ECX -EBPCLR -EBPLIT EAX>ECX EAX>ECX0 ?EAX>ECX EAX>EBX EAX>EBX0 ?EAX>EBX }?~EAX ?~EAX{ SAVE-?~EAX ?~EAX OPinsert OPresize MOV_EDX_[EBP] ?EDX_[EBP] XX_STEP ?OPlast OPexcise OP_SIZE ^?EAX= ?ChEAX DUP7B? DUP5B? DUP6B? DUP2B? DUP3B? DUP3B?[EBP] ADD|XOR|OR|AND= +>OFF-EBP EVEN-EBP EVEN-EAX MACROOPT-WL SHORT? ?SET SetJP J_@ SJ@ J@ ClearJpBuff INIT-MACROOPT-LIGHT JP4 JP3 JP2 JP1 JP0 JpBuffSize ToOP0 SetOP OPLast OP8 OP7 OP6 OP5 OP4 OP3 OP2 OP1 OP0 OpBuffSize LAST-HERE J-SET :-SET OFF-EAX OFF-EBP MM_SIZE DIS-OPT SET-OPT J_COD ~BR-OPT OPT? REL@ W, C, , ALLOT DP IS-TEMP-WL GET-CURRENT SET-CURRENT DOES>A CFL (DP) CURRENT NON-OPT-WL REFILL-SOURCE REFILL-FILE FREFILL REFILL-STDIN TAKEN-TIB REFILL CONSOLE-HANDLES ?CONSOLE ?GUI CURSTR <PRE> SOURCE-ID-XT SOURCE-ID SKIP1 SKIP PSKIP PARSE PARSE-NAME NextWord ParseWord SkipUpTo SkipWord OnNotDelimiter SkipDelimiters OnDelimiter GetChar IsDelimiter IsDelimiter1 PeekChar CharAddr EndOfChunk SOURCE! SOURCE DDATA DDP ATIB TIB C/L >IN #TIB SOURCE-NAME +LibraryDirName +ModuleDirName ModuleDirName ModuleName CUT-PATH is_path_delimiter CURFILE SCREEN-LENGTH >NUMBER (.") DUMP PTYPE >PRT .TO-LOG .0 U. . D. (D.) SIGN #> #S # <# HOLDS HOLD DECIMAL HEX PAD SYSTEM-PAD NUMERIC-OUTPUT-LENGTH BASE HLD KEY1 KEY KEY? PENDING-CHAR SPACES SPACE BL EKEY>SCAN EKEY>CHAR EKEY KEY_EVENT ControlKeysMask INPUT_RECORD EKEY? CR EMIT TYPE1 TYPE ACCEPT1 ACCEPT TO-LOG STARTLOG ENDLOG ANSI><OEM FILE-EXIST FLUSH-FILE WRITE-LINE RESIZE-FILE WRITE-FILE lpNumberOfBytesWritten READ-LINE _addr _fp2 _fp1 EOLN UNIX-LINES DOS-LINES LTL LT REPOSITION-FILE READ-FILE lpNumberOfBytesRead OPEN-FILE FILE-SIZE FILE-POSITION lpDistanceToMoveHigh DELETE-FILE OPEN-FILE-SHARED CREATE-FILE-SHARED SA CREATE-FILE CLOSE-FILE SET-EXC-HANDLER DROP-EXC-HANDLER (EXC) <EXC-DUMP> EXC-HANDLER HALT AT-PROCESS-FINISHING AT-THREAD-FINISHING H-STDLOG H-STDERR H-STDOUT H-STDIN ABORT CATCH <SET-EXC-HANDLER> THROW FATAL-HANDLER HANDLER RESIZE FREE ALLOCATE DESTROY-HEAP CREATE-PROCESS-HEAP CREATE-HEAP SET-HEAP EXTRA-MEM USER-HERE USER-ALLOT ERR USER-OFFS THREAD-HEAP R/W W/O R/O FILE_CURRENT FILE_BEGIN OPEN_EXISTING CREATE_ALWAYS FILE_ATTRIBUTE_ARCHIVE INVALID_HANDLE_VALUE MEM_RESERVE MEM_COMMIT PAGE_EXECUTE_READWRITE FlushFileBuffers Sleep TerminateThread ResumeThread SuspendThread CreateThread GetEnvironmentVariableA GetModuleFileNameA OemToCharBuffA CharToOemBuffA GetProcAddress LoadLibraryA GetCommandLineA HeapReAlloc HeapFree HeapAlloc HeapDestroy HeapCreate GetProcessHeap ReadConsoleInputA GetNumberOfConsoleInputEvents ExitThread ExitProcess SetEndOfFile WriteFile ReadFile GetFileSize SetFilePointer DeleteFileA CreateFileA CloseHandle GetFileAttributesA GetLastError GetStdHandle <FORTH-INSTANCE FORTH-INSTANCE> _WNDPROC-CODE _WINAPI-CODE API-CALL AO_INI LIB-ERROR PROC-ERROR ST-RES AOGPA AOLL DOES-CODE HASH DABS ERASE MOVE >CELLS >CHARS CHARS CHAR- CHAR+ */ CELL TRUE FALSE FNOP _FLIT-CODE10 _FLIT-CODE8 `F1- F**2 `F1+ FD> FD< FRSTOR FSAVE FENV> F>ENV F10/ F10* F>D F>D LOW-MODE UP-MODE ROUND-MODE TRUNC-MODE F[LOG] FLOG2 GETFPUSW F--DS F>DS DS>F GETFPUCW SETFPUCW FINIT F>RAD F>DEG FASIN FACOS FATAN2 FATAN FTAN F** FEXPM1 FEXP FLOG FLNP1 FLN SF@ SF! F@ DATA>FLOAT32 FLOAT>DATA32 DATA>FLOAT FLOAT>DATA F! DF@ DF! D>F F1+ FDEPTH FROT FSWAP FINT FOVER FDUP FDROP FSQRT F/ F- F+ F* FABS FSINCOS FSIN FCOS FNEGATE FMIN FMAX F= F< F0< F0= 1.E .E FL2E FL2T FLN2 FLG2 FPI 10.E 2.E (ENTER) TRAP-CODE TIMER@ (LocalsExit) RFREE (RALLOT) RALLOT RP+! RP+ RP+@ NRCOPY N>R NR> DRMOVE C-EXECUTE C-?DUP C-RDROP C-R> C->R C-I ADD[ESP],EAX C-?DO C-DO J FS! FS@ TlsIndex@ TlsIndex! RP@ SP@ RP! SP! ASCIIZ> FILL CMOVE> CMOVE SEARCH COMPARE -TRAILING D2/ D2* D= D0= 0<> 0= 0< U> U< D> D< WITHIN > < <> = DIGIT FM/MOD SM/REM ARSHIFT RSHIFT LSHIFT M* */MOD U2/ 2/ UM/MOD UMOD /MOD MOD +! U/ / UM* C>S U>D D>S S>D NOOP DNEGATE ABS NEGATE INVERT XOR OR AND * COUNT 0! 1+! - D- D+ CELLS CELL- CELL+ + 2* 2- 2+ 1- 1+ 2! 2@ W! W@ C! C@ ! @ 2R@ R@ 2R> 2>R TUCK ROLL PICK -ROT ROT NIP 2OVER OVER 2SWAP SWAP 2DROP 0MAX UMIN UMAX MIN MAX DROP 2DUP DUP TOUSER-VALUE-CODE USER-VALUE-CODE TOVALUE-CODE CONSTANT-CODE USER-CODE CREATE-CODE _---CODE CLITERAL-CODE _CLITERAL-CODE SLITERAL-CODE _TLITERAL-CODE _SLITERAL-CODE _TOUSER-VALUE-CODE _TOVALUE-CODE _VECT-CODE _USER-VECT-CODE _USER-VALUE-CODE USER+ _USER-CODE _CONSTANT-CODE _CREATE-CODE • : TW-1 S" INIT" ; : W-1 S" INIT " ; : TW-2 S" (INIT)" ; : W-2 S" (INIT) " ; : TW-3 S" SPF-INIT?" ; : W-3 S" SPF-INIT? " ; : TW-4 S" ;.." ; : W-4 S" ;.. " ; : TW-5 S" ..:" ; : W-5 S" ..: " ; : TW-6 S" SPF-INI" ; : W-6 S" SPF-INI " ; : TW-7 S" TITLE" ; : W-7 S" TITLE " ; : TW-8 S" (TITLE)" ; : W-8 S" (TITLE) " ; : TW-9 S" FATAL-HANDLER1" ; : W-9 S" FATAL-HANDLER1" ; : TW-10 S" DUMP-TRACE-SHRUNKEN" ; : W-10 S" DUMP-TRACE-SHRUNKEN " ; : TW-11 S" TRACE-TAIL-SIZE" ; : W-11 S" TRACE-TAIL-SIZE " ; : TW-12 S" TRACE-HEAD-SIZE" ; : W-12 S" TRACE-HEAD-SIZE " ; : TW-13 S" WARNING" ; : W-13 S" WARNING " ; : TW-14 S" _CREATE-CODE" ; : W-14 S" _CREATE-CODE " ;
: T-1 TW-1 SFIND ; : dT-1 TWORDS W-1 SEARCH ; : T-2 TW-2 SFIND ; : dT-2 TWORDS W-2 SEARCH ; : T-3 TW-3 SFIND ; : dT-3 TWORDS W-3 SEARCH ; : T-4 TW-4 SFIND ; : dT-4 TWORDS W-4 SEARCH ; : T-5 TW-5 SFIND ; : dT-5 TWORDS W-5 SEARCH ; : T-6 TW-6 SFIND ; : dT-6 TWORDS W-6 SEARCH ; : T-7 TW-7 SFIND ; : dT-7 TWORDS W-7 SEARCH ; : T-8 TW-8 SFIND ; : dT-8 TWORDS W-8 SEARCH ; : T-9 TW-9 SFIND ; : dT-9 TWORDS W-9 SEARCH ; : T-10 TW-10 SFIND ; : dT-10 TWORDS W-10 SEARCH ; : T-11 TW-11 SFIND ; : dT-11 TWORDS W-11 SEARCH ; : T-12 TW-12 SFIND ; : dT-12 TWORDS W-12 SEARCH ; : T-13 TW-13 SFIND ; : dT-13 TWORDS W-13 SEARCH ; : T-14 TW-14 SFIND ; : dT-14 TWORDS W-14 SEARCH ;
REQUIRE METER ~CHESS\TASK\METER.F STARTLOG METER T-1 METER dT-1 METER T-2 METER dT-2 METER T-3 METER dT-3 METER T-4 METER dT-4 METER T-5 METER dT-5 METER T-6 METER dT-6 METER T-7 METER dT-7 METER T-8 METER dT-8 METER T-9 METER dT-9 METER T-10 METER dT-10 METER T-11 METER dT-11 METER T-12 METER dT-12 METER T-13 METER dT-13 METER T-14 METER dT-14 ЛОГ Код: 183843 180396 387 207 176940 177093 540 360 158805 160038 729 504 177381 176733 819 657 176922 176661 999 783 198171 192960 1278 1098 180414 180000 1440 1197 194652 191682 1566 1368 151677 153540 1773 1584 152019 153396 2115 1926 152280 154053 2295 2142 152415 154089 2529 2367 195615 192663 30996 30564 153990 155421 142452 154080 Ok
Заметно ускорение поиска(особенно для слов близких к вершине словаря).
Технику поиска имени слова в длинных строках имен слов словарей
можно усовершенствовать для все того же повышения скорости(SEARCH не совсем подходящий код для этого)
и выйти в итоге на получение xt слова, например, табличным способом, или например пристегнув адрес кода через пробел к имени слова в длинной строке(вариантов много-надо выбрать оптимальный), что в конечном итоге
приведет к ускорению компиляции программы из исходников на лету.
[quote="Гость"]А как быть, если в тексте нужен символ ";"?[/quote]
Можно использовать не клавиатурный символ.
В определении больших строк я сделал ошибку - применил JMP REL8, а надо JMP REL32.
Правильно будет так:
[code]: T: ( name "text" -- ) : 5 ALLOT DP @ >R BEGIN NextWord 2DUP 1 = IF C@ [CHAR] • = IF 2DROP 1 ELSE OVER C@ [CHAR] \ = IF DROP 0xD PARSE DROP OVER - BL FILL ELSE LEX+ THEN 0 THEN ELSE DROP DUP 0= IF 2DROP REFILL DROP ELSE LEX+ THEN 0 THEN UNTIL DP @ R@ 5 - DP ! 0xE9 C, DUP R@ - , DUP DP ! R@ SWAP R> - DLIT, POSTPONE ; ;[/code] Попробовал длинные строки на предмет другой техники поиска слов в словарях. [code]T: TWORDS \ имена слов словаря FORTH DONE INIT (INIT) SPF-INIT? ;.. ..: ... SPF-INI TITLE (TITLE) FATAL-HANDLER1 EXC-DUMP1 DUMP-TRACE-SHRUNKEN TRACE-TAIL-SIZE TRACE-HEAD-SIZE DUMP-TRACE AT-EXC-DUMP STACK-ADDR. IN-EXCEPTION USER-EXIT PROCESS-INIT ERR-EXIT USER-INIT POOL-INIT AT-PROCESS-STARTING AT-THREAD-STARTING ALIGN-BYTES-CONSTANT MAINX OPTIONS (OPTIONS) COMMANDLINE-OPTIONS SUBSTRING-OPTIONS SAVE RESOURCES-SIZE RESOURCES-RVA IMAGE-BASE IMAGE-SIZE IMAGE-BEGIN ORG-ADDR CGI-OPTIONS POST? CGI? TERMINATE PAUSE STOP RESUME SUSPEND START ERASE-IMPORTS TASK: TASK WNDPROC: CALLBACK: EXTERN WINAPI: __WIN: NEW-WINAPI? WINAPLINK OEM>ANSI ANSI>OEM PROC-ERROR1 LIB-ERROR1 ERROR2 DECODE-ERROR (DECODE-ERROR) FORTH_ERROR ENVIRONMENT? (ENVIR?) EXECUTE ?DUP RDROP >R R> }} {{ ;MODULE EXPORT MODULE: UNLOOP LEAVE I +LOOP LOOP ?DO DO RECURSE AGAIN REPEAT WHILE UNTIL BEGIN THEN ELSE IF ?LITERAL2 ?SLITERAL2 HEX-SLITERAL ?LITERAL1 ?SLITERAL1 ['] ABORT" [CHAR] ." C" S" CLITERAL SLITERAL 2LITERAL LITERAL -- FIELD \EOF EXIT ; [COMPILE] ( .( \ POSTPONE TO : :NONAME HIDE SMUDGE C-SMUDGE BEHAVIOR! BEHAVIOR ->VECT USER-VECT USER-VALUE USER USER-CREATE USER-ALIGNED ->VARIABLE VECT VALUE CONSTANT VARIABLE VOCABULARY DOES> (DOES2) (DOES1) CREATE CREATED HEADER SHEADER1 SHEADER LAST-NON LAST-CFA REQUIRE REQUIRED INCLUDED INCLUDED_STD INCLUDE-DEPTH (INCLUDED1) (INCLUDED) INCLUDE-PROBE INCLUDE-FILE TranslateFlow FIND-FULLNAME1 FIND-FULLNAME HEAP-COPY RECEIVE-WITH RECEIVE-WITH-XT PROCESS-ERR1 PROCESS-ERR EVALUATE EVALUATE-WITH RESTORE-SOURCE SAVE-SOURCE QUIT MAIN1 ] [ OK1 .SN #(SIGNED) INTERPRET &INTERPRET INTERPRET_ NOTFOUND EVAL-WORD BYE CHAR ' WORD ?COMP ?STACK DEPTH ?SLITERAL ?LITERAL <MAIN> OK BLK STATE WARNING R0 S0 SAVE-ERR (ABORT1") ?ERROR LAST-WORD ERR-STRING ERR-FILE ERR-LINE ERR-IN# ERR-LINE# ERR-NUMBER NOTSEEN-ERR SEEN-ERR SEEN-ERR? ERR-DATA /err-data err.file err.line err.notseen err.in# err.line# err.number /errstr_ ER-U ER-A (ABORT") ERROR WORDS NLIST W-CNT >OUT LATEST ORDER VOC-NAME. PREVIOUS ALSO SET-ORDER ONLY FORTH GET-ORDER DEFINITIONS FIND1 SFIND CONTEXT S-O SEARCH-WORDLIST1 SEARCH-WORDLIST-NFA CDR-BY-NAME SEARCH-WORDLIST FIND NEAR_NFA WordByAddr (WordByAddr) (NEAREST-NFA) (NEAREST3) (NEAREST2) (NEAREST1) FOR-WORDLIST ENUM-VOCS-FORTH (ENUM-VOCS-FORTH) ENUM-VOCS IS-CLASS-FORTH VOC IMMEDIATE ?VOC ?IMMEDIATE IS-VOC IS-IMMEDIATE ID. CDR NAME>L NAME>F NAME>C NAME> WID-EXTRA PAR@ PAR! CLASS@ CLASS! FREE-WORDLIST TEMP-WORDLIST WORDLIST AT-WORDLIST-CREATING BUILD-DATE VERSION WL_SIZE +WORD +SWORD >BODY FORTH-WORDLIST &VOC &IMMEDIATE LAST VOC-LIST _VOC-LIST ALIGN-NOP ALIGN ALIGNED ALIGN-TO ALIGN-BYTES >RESOLVE >RESOLVE1 >ORESOLVE >ORESOLVE1 <MARK >MARK ", SLIT, S", S, ?BRANCH, RLIT, DLIT, LIT, RET, BRANCH, COMPILE, _COMPILE, HERE RESOLVE_OPT J_OPT? J_MOVE J_+! J?_STEP CON>LIT FORLIT, OPT ???BR-OPT ??BR-OPT ?BR-OPT BR-EVEN-EAX ?BR-OPT-RULES MACRO, INLINE, OPT_INIT OPT_CLOSE XC_J _INLINE, 2A_,_STEP 1A_,_STEP 0A_,_STEP A_,_STEP 7_,_STEP 6_,_STEP 5_,_STEP 4_,_STEP 4_,_STEP_ 3_,_STEP 2_,_STEP 1_,_STEP +EBP MACRO? INLINE? DO_OPT OPT_ -EVEN-EBP OPT-RULES ?C-JMP ?EAX=RULES FPOP DO_EAX>ECX ?EAX:=ECX EBX:=EAX ECX:=EAX F?EAX>ECX T?EAX>ECX -EBPCLR -EBPLIT EAX>ECX EAX>ECX0 ?EAX>ECX EAX>EBX EAX>EBX0 ?EAX>EBX }?~EAX ?~EAX{ SAVE-?~EAX ?~EAX OPinsert OPresize MOV_EDX_[EBP] ?EDX_[EBP] XX_STEP ?OPlast OPexcise OP_SIZE ^?EAX= ?ChEAX DUP7B? DUP5B? DUP6B? DUP2B? DUP3B? DUP3B?[EBP] ADD|XOR|OR|AND= +>OFF-EBP EVEN-EBP EVEN-EAX MACROOPT-WL SHORT? ?SET SetJP J_@ SJ@ J@ ClearJpBuff INIT-MACROOPT-LIGHT JP4 JP3 JP2 JP1 JP0 JpBuffSize ToOP0 SetOP OPLast OP8 OP7 OP6 OP5 OP4 OP3 OP2 OP1 OP0 OpBuffSize LAST-HERE J-SET :-SET OFF-EAX OFF-EBP MM_SIZE DIS-OPT SET-OPT J_COD ~BR-OPT OPT? REL@ W, C, , ALLOT DP IS-TEMP-WL GET-CURRENT SET-CURRENT DOES>A CFL (DP) CURRENT NON-OPT-WL REFILL-SOURCE REFILL-FILE FREFILL REFILL-STDIN TAKEN-TIB REFILL CONSOLE-HANDLES ?CONSOLE ?GUI CURSTR <PRE> SOURCE-ID-XT SOURCE-ID SKIP1 SKIP PSKIP PARSE PARSE-NAME NextWord ParseWord SkipUpTo SkipWord OnNotDelimiter SkipDelimiters OnDelimiter GetChar IsDelimiter IsDelimiter1 PeekChar CharAddr EndOfChunk SOURCE! SOURCE DDATA DDP ATIB TIB C/L >IN #TIB SOURCE-NAME +LibraryDirName +ModuleDirName ModuleDirName ModuleName CUT-PATH is_path_delimiter CURFILE SCREEN-LENGTH >NUMBER (.") DUMP PTYPE >PRT .TO-LOG .0 U. . D. (D.) SIGN #> #S # <# HOLDS HOLD DECIMAL HEX PAD SYSTEM-PAD NUMERIC-OUTPUT-LENGTH BASE HLD KEY1 KEY KEY? PENDING-CHAR SPACES SPACE BL EKEY>SCAN EKEY>CHAR EKEY KEY_EVENT ControlKeysMask INPUT_RECORD EKEY? CR EMIT TYPE1 TYPE ACCEPT1 ACCEPT TO-LOG STARTLOG ENDLOG ANSI><OEM FILE-EXIST FLUSH-FILE WRITE-LINE RESIZE-FILE WRITE-FILE lpNumberOfBytesWritten READ-LINE _addr _fp2 _fp1 EOLN UNIX-LINES DOS-LINES LTL LT REPOSITION-FILE READ-FILE lpNumberOfBytesRead OPEN-FILE FILE-SIZE FILE-POSITION lpDistanceToMoveHigh DELETE-FILE OPEN-FILE-SHARED CREATE-FILE-SHARED SA CREATE-FILE CLOSE-FILE SET-EXC-HANDLER DROP-EXC-HANDLER (EXC) <EXC-DUMP> EXC-HANDLER HALT AT-PROCESS-FINISHING AT-THREAD-FINISHING H-STDLOG H-STDERR H-STDOUT H-STDIN ABORT CATCH <SET-EXC-HANDLER> THROW FATAL-HANDLER HANDLER RESIZE FREE ALLOCATE DESTROY-HEAP CREATE-PROCESS-HEAP CREATE-HEAP SET-HEAP EXTRA-MEM USER-HERE USER-ALLOT ERR USER-OFFS THREAD-HEAP R/W W/O R/O FILE_CURRENT FILE_BEGIN OPEN_EXISTING CREATE_ALWAYS FILE_ATTRIBUTE_ARCHIVE INVALID_HANDLE_VALUE MEM_RESERVE MEM_COMMIT PAGE_EXECUTE_READWRITE FlushFileBuffers Sleep TerminateThread ResumeThread SuspendThread CreateThread GetEnvironmentVariableA GetModuleFileNameA OemToCharBuffA CharToOemBuffA GetProcAddress LoadLibraryA GetCommandLineA HeapReAlloc HeapFree HeapAlloc HeapDestroy HeapCreate GetProcessHeap ReadConsoleInputA GetNumberOfConsoleInputEvents ExitThread ExitProcess SetEndOfFile WriteFile ReadFile GetFileSize SetFilePointer DeleteFileA CreateFileA CloseHandle GetFileAttributesA GetLastError GetStdHandle <FORTH-INSTANCE FORTH-INSTANCE> _WNDPROC-CODE _WINAPI-CODE API-CALL AO_INI LIB-ERROR PROC-ERROR ST-RES AOGPA AOLL DOES-CODE HASH DABS ERASE MOVE >CELLS >CHARS CHARS CHAR- CHAR+ */ CELL TRUE FALSE FNOP _FLIT-CODE10 _FLIT-CODE8 `F1- F**2 `F1+ FD> FD< FRSTOR FSAVE FENV> F>ENV F10/ F10* F>D F>D LOW-MODE UP-MODE ROUND-MODE TRUNC-MODE F[LOG] FLOG2 GETFPUSW F--DS F>DS DS>F GETFPUCW SETFPUCW FINIT F>RAD F>DEG FASIN FACOS FATAN2 FATAN FTAN F** FEXPM1 FEXP FLOG FLNP1 FLN SF@ SF! F@ DATA>FLOAT32 FLOAT>DATA32 DATA>FLOAT FLOAT>DATA F! DF@ DF! D>F F1+ FDEPTH FROT FSWAP FINT FOVER FDUP FDROP FSQRT F/ F- F+ F* FABS FSINCOS FSIN FCOS FNEGATE FMIN FMAX F= F< F0< F0= 1.E .E FL2E FL2T FLN2 FLG2 FPI 10.E 2.E (ENTER) TRAP-CODE TIMER@ (LocalsExit) RFREE (RALLOT) RALLOT RP+! RP+ RP+@ NRCOPY N>R NR> DRMOVE C-EXECUTE C-?DUP C-RDROP C-R> C->R C-I ADD[ESP],EAX C-?DO C-DO J FS! FS@ TlsIndex@ TlsIndex! RP@ SP@ RP! SP! ASCIIZ> FILL CMOVE> CMOVE SEARCH COMPARE -TRAILING D2/ D2* D= D0= 0<> 0= 0< U> U< D> D< WITHIN > < <> = DIGIT FM/MOD SM/REM ARSHIFT RSHIFT LSHIFT M* */MOD U2/ 2/ UM/MOD UMOD /MOD MOD +! U/ / UM* C>S U>D D>S S>D NOOP DNEGATE ABS NEGATE INVERT XOR OR AND * COUNT 0! 1+! - D- D+ CELLS CELL- CELL+ + 2* 2- 2+ 1- 1+ 2! 2@ W! W@ C! C@ ! @ 2R@ R@ 2R> 2>R TUCK ROLL PICK -ROT ROT NIP 2OVER OVER 2SWAP SWAP 2DROP 0MAX UMIN UMAX MIN MAX DROP 2DUP DUP TOUSER-VALUE-CODE USER-VALUE-CODE TOVALUE-CODE CONSTANT-CODE USER-CODE CREATE-CODE _---CODE CLITERAL-CODE _CLITERAL-CODE SLITERAL-CODE _TLITERAL-CODE _SLITERAL-CODE _TOUSER-VALUE-CODE _TOVALUE-CODE _VECT-CODE _USER-VECT-CODE _USER-VALUE-CODE USER+ _USER-CODE _CONSTANT-CODE _CREATE-CODE • : TW-1 S" INIT" ; : W-1 S" INIT " ; : TW-2 S" (INIT)" ; : W-2 S" (INIT) " ; : TW-3 S" SPF-INIT?" ; : W-3 S" SPF-INIT? " ; : TW-4 S" ;.." ; : W-4 S" ;.. " ; : TW-5 S" ..:" ; : W-5 S" ..: " ; : TW-6 S" SPF-INI" ; : W-6 S" SPF-INI " ; : TW-7 S" TITLE" ; : W-7 S" TITLE " ; : TW-8 S" (TITLE)" ; : W-8 S" (TITLE) " ; : TW-9 S" FATAL-HANDLER1" ; : W-9 S" FATAL-HANDLER1" ; : TW-10 S" DUMP-TRACE-SHRUNKEN" ; : W-10 S" DUMP-TRACE-SHRUNKEN " ; : TW-11 S" TRACE-TAIL-SIZE" ; : W-11 S" TRACE-TAIL-SIZE " ; : TW-12 S" TRACE-HEAD-SIZE" ; : W-12 S" TRACE-HEAD-SIZE " ; : TW-13 S" WARNING" ; : W-13 S" WARNING " ; : TW-14 S" _CREATE-CODE" ; : W-14 S" _CREATE-CODE " ;
: T-1 TW-1 SFIND ; : dT-1 TWORDS W-1 SEARCH ; : T-2 TW-2 SFIND ; : dT-2 TWORDS W-2 SEARCH ; : T-3 TW-3 SFIND ; : dT-3 TWORDS W-3 SEARCH ; : T-4 TW-4 SFIND ; : dT-4 TWORDS W-4 SEARCH ; : T-5 TW-5 SFIND ; : dT-5 TWORDS W-5 SEARCH ; : T-6 TW-6 SFIND ; : dT-6 TWORDS W-6 SEARCH ; : T-7 TW-7 SFIND ; : dT-7 TWORDS W-7 SEARCH ; : T-8 TW-8 SFIND ; : dT-8 TWORDS W-8 SEARCH ; : T-9 TW-9 SFIND ; : dT-9 TWORDS W-9 SEARCH ; : T-10 TW-10 SFIND ; : dT-10 TWORDS W-10 SEARCH ; : T-11 TW-11 SFIND ; : dT-11 TWORDS W-11 SEARCH ; : T-12 TW-12 SFIND ; : dT-12 TWORDS W-12 SEARCH ; : T-13 TW-13 SFIND ; : dT-13 TWORDS W-13 SEARCH ; : T-14 TW-14 SFIND ; : dT-14 TWORDS W-14 SEARCH ;
REQUIRE METER ~CHESS\TASK\METER.F STARTLOG METER T-1 METER dT-1 METER T-2 METER dT-2 METER T-3 METER dT-3 METER T-4 METER dT-4 METER T-5 METER dT-5 METER T-6 METER dT-6 METER T-7 METER dT-7 METER T-8 METER dT-8 METER T-9 METER dT-9 METER T-10 METER dT-10 METER T-11 METER dT-11 METER T-12 METER dT-12 METER T-13 METER dT-13 METER T-14 METER dT-14[/code]
ЛОГ
[code]183843 180396 387 207 176940 177093 540 360 158805 160038 729 504 177381 176733 819 657 176922 176661 999 783 198171 192960 1278 1098 180414 180000 1440 1197 194652 191682 1566 1368 151677 153540 1773 1584 152019 153396 2115 1926 152280 154053 2295 2142 152415 154089 2529 2367 195615 192663 30996 30564 153990 155421 142452 154080 Ok[/code]
Заметно ускорение поиска(особенно для слов близких к вершине словаря).
Технику поиска имени слова в длинных строках имен слов словарей
можно усовершенствовать для все того же повышения скорости(SEARCH не совсем подходящий код для этого)
и выйти в итоге на получение xt слова, например, табличным способом, или например пристегнув адрес кода через пробел к имени слова в длинной строке(вариантов много-надо выбрать оптимальный), что в конечном итоге
приведет к ускорению компиляции программы из исходников на лету.
|
|
|
|
Добавлено: Сб сен 06, 2008 11:11 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
нужно в исходнике передавать управляющие символы парой символов
как в С++ '\t' '\r' '\n' '\\' и т.д.
нужно в исходнике передавать управляющие символы парой символов
как в С++ '\t' '\r' '\n' '\\' и т.д.
|
|
|
|
Добавлено: Ср сен 03, 2008 01:07 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
А как быть, если в тексте нужен символ ";"?
А как быть, если в тексте нужен символ ";"?
|
|
|
|
Добавлено: Ср сен 03, 2008 00:10 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
chess писал(а): Вариантов много.
Вот еще один вариант реализации именованных больших строк - строка пишется сразу в словарную статью
без использования промежуточного буфера.
Если в определении слова T: слово DLIT, заменить на EVALUATE , то это уже будет определение макроса-шаблона.
Сами байты счетчика здесь не формируются - что-то необходимости в нем, что для строк, что для макросов, не видно.
Код: : HEAD-JMP 0xEB C, ; : MOVE-LEX DP @ SWAP DUP ALLOT MOVE 0 C, ;
\ слово резервирует 2 байта под код перехода на код выдающий адрес начала строки и ее длину, \ запоминает адрес начала строки в кодофайле, \ грузит строку в кодофайл и запоминает адрес конца строки \ пишет код перехода в зарезервированные 2 байта \ пишет сам код выдачи A U для загруженной строки и пишет RET
: T: : 2 ALLOT DP @ >R BEGIN NextWord 2DUP 1 = IF C@ [CHAR] ; = IF 2DROP 1 ELSE OVER C@ [CHAR] \ = IF DROP 0xD PARSE DROP OVER - 0 FILL ELSE MOVE-LEX THEN 0 THEN ELSE DROP DUP 0= IF 2DROP REFILL DROP ELSE MOVE-LEX THEN 0 THEN UNTIL DP @ R@ 2- DP ! HEAD-JMP DUP R@ - C, DUP DP ! R@ SWAP R> - DLIT, POSTPONE ; ;
\ EOF T: S1 ~!@#$%^ 1234 ABCDEFG \ GJHGHJGJHGF 5 \\\\\ '''' 6 \ IOUIOYUITGUY
HH KJKLJKL O ; STARTLOG S1 TYPE лог Код: ~!@#$%^ 1234 ABCDEFG 5 \\\\\ '''' 6 HH KJKLJKL O Ok
[quote="chess"]Вариантов много.[/quote]
Вот еще один вариант реализации именованных больших строк - строка пишется сразу в словарную статью
без использования промежуточного буфера.
Если в определении слова T: слово DLIT, заменить на EVALUATE , то это уже будет определение макроса-шаблона.
Сами байты счетчика здесь не формируются - что-то необходимости в нем, что для строк, что для макросов, не видно.
[code]: HEAD-JMP 0xEB C, ; : MOVE-LEX DP @ SWAP DUP ALLOT MOVE 0 C, ;
\ слово резервирует 2 байта под код перехода на код выдающий адрес начала строки и ее длину, \ запоминает адрес начала строки в кодофайле, \ грузит строку в кодофайл и запоминает адрес конца строки \ пишет код перехода в зарезервированные 2 байта \ пишет сам код выдачи A U для загруженной строки и пишет RET
: T: : 2 ALLOT DP @ >R BEGIN NextWord 2DUP 1 = IF C@ [CHAR] ; = IF 2DROP 1 ELSE OVER C@ [CHAR] \ = IF DROP 0xD PARSE DROP OVER - 0 FILL ELSE MOVE-LEX THEN 0 THEN ELSE DROP DUP 0= IF 2DROP REFILL DROP ELSE MOVE-LEX THEN 0 THEN UNTIL DP @ R@ 2- DP ! HEAD-JMP DUP R@ - C, DUP DP ! R@ SWAP R> - DLIT, POSTPONE ; ;
\ EOF T: S1 ~!@#$%^ 1234 ABCDEFG \ GJHGHJGJHGF 5 \\\\\ '''' 6 \ IOUIOYUITGUY
HH KJKLJKL O ; STARTLOG S1 TYPE[/code] лог [code]~!@#$%^ 1234 ABCDEFG 5 \\\\\ '''' 6 HH KJKLJKL O Ok[/code]
|
|
|
|
Добавлено: Вт сен 02, 2008 20:36 |
|
|
|
|
|
Заголовок сообщения: |
слова-строки |
|
|
Слова-строки (счетчик - 4 байта)
длина создаваемых строк ограничена размером промежуточного буфера - макс. размер буфера м.б. 2^31
годятся для SEARCH, EVALUATE и прочих синтаксических разборок.
Реализация:
Код: : _TLITERAL-CODE ( -- a2 u , где a2 - адрес начала строки в кодофайле, u - длина строки ) -8 P+ \ наращиваем стек на две ячейки $ 4 @P=A \ сохраняем предыдущий tos B=RS \ снимаем адрес возврата с вершины стека возврата в EBX A=@B \ в tos кладем число по адресу возврата - это значение 4-х байтного счетчика (длина строки) 4 B+ \ обходим байты счетчика, увеличивая адрес возврата на 4 @P=B \ под tos на стек кладем адрес первого байта строки B=aBA \ вычисляем новый адрес возврата путем добавки к адресу первого байта строки длины строки 1 B+ \ учитываем, что в конце строки будет 0-й завершающий байт - обходим его, увеличивая адрес возврата на 1 JRB \ уходим по новому адресу возврата -;
\ перемещает строку из адреса а1 в кодофайл по адресу a2 : TLIT, ( a1 u -- a2 u ) _TLITERAL-CODE, DUP , S, 0 C, ;
\ _TLITERAL-CODE, - такого слова нет, но есть _TLITERAL-CODE - т.е. запятая в конце \ определенного в словаре слова приводит к трансляции (соответствующим NOTFOUND) \ следующего текста: POSTPONE _TLITERAL-CODE
CREATE T-BUF 8000 ALLOT 0 VALUE T-DP : T-BUF0 T-BUF 8000 0 FILL ;
\ слово name определенное через T: выдает a u - записанной в кодофайл строки "text" \ причем символы перевода строк и возврата каретки в тексте затираются 0-мя, а лишние пробелы удаляются : T: ( name "text" -- a u) : 0 TO T-DP T-BUF0 BEGIN NextWord 2DUP >R >R NIP DUP 1 = IF DROP R@ C@ [CHAR] ; = IF RDROP RDROP T-BUF T-DP TLIT, POSTPONE ; 0 TO T-DP EXIT ELSE R@ C@ [CHAR] \ = IF R@ 0xD PARSE DROP R@ - 0 FILL THEN THEN ELSE 0= IF REFILL DROP THEN THEN R> T-BUF T-DP + R@ CMOVE> T-DP R> + 1+ TO T-DP T-DP 0= UNTIL ; Код: \ EOF T: WSTRING1 WORD1 WORD2 WORD3 ..... \ ..... ..... WORD8 WORD9 WORD10 ..... ..... !! ! T: NIP- 3\23 |; ..... ..... ..... WORD80 .......... \ WORD90 .......... WORD100 11111111111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222222222 33333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444 55555555555555555555555555555555555555555555555555555555 ; T: WSTRING2 1234 877854 453465 ABCDEFGH ; STARTLOG SEE _TLITERAL-CODE
CR CR WSTRING1 TYPE CR CR WSTRING2 TYPE лог Код: CODE _TLITERAL-CODE (23 bytes) 5AD2B3 8D6DF8 LEA EBP , F8 [EBP] 5AD2B6 894504 MOV 4 [EBP] , EAX 5AD2B9 5B POP EBX 5AD2BA 8B03 MOV EAX , [EBX] 5AD2BC 8D5B04 LEA EBX , 4 [EBX] 5AD2BF 895D00 MOV 0 [EBP] , EBX 5AD2C2 8D1C03 LEA EBX , [EBX] [EAX] 5AD2C5 8D5B01 LEA EBX , 1 [EBX] 5AD2C8 FFE3 JMP EBX END-CODE (9 instructions)
WORD1 WORD2 WORD3 ..... WORD8 WORD9 WORD10 ..... ..... !! ! T: NIP- 3\23 |; ..... ..... ..... WORD80 .......... WORD100 11111111111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222222222 33333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444 55555555555555555555555555555555555555555555555555555555
1234 877854 453465 ABCDEFGH Ok
Буфер можно делать в куче и удалять сразу после создания строк.
Слова _TLITERAL-CODE и TLIT, можно ввести в ядро.
Вариантов много.
Слова-строки (счетчик - 4 байта)
длина создаваемых строк ограничена размером промежуточного буфера - макс. размер буфера м.б. 2^31
годятся для SEARCH, EVALUATE и прочих синтаксических разборок.
Реализация:
[code]: _TLITERAL-CODE ( -- a2 u , где a2 - адрес начала строки в кодофайле, u - длина строки ) -8 P+ \ наращиваем стек на две ячейки $ 4 @P=A \ сохраняем предыдущий tos B=RS \ снимаем адрес возврата с вершины стека возврата в EBX A=@B \ в tos кладем число по адресу возврата - это значение 4-х байтного счетчика (длина строки) 4 B+ \ обходим байты счетчика, увеличивая адрес возврата на 4 @P=B \ под tos на стек кладем адрес первого байта строки B=aBA \ вычисляем новый адрес возврата путем добавки к адресу первого байта строки длины строки 1 B+ \ учитываем, что в конце строки будет 0-й завершающий байт - обходим его, увеличивая адрес возврата на 1 JRB \ уходим по новому адресу возврата -;
\ перемещает строку из адреса а1 в кодофайл по адресу a2 : TLIT, ( a1 u -- a2 u ) _TLITERAL-CODE, DUP , S, 0 C, ;
\ _TLITERAL-CODE, - такого слова нет, но есть _TLITERAL-CODE - т.е. запятая в конце \ определенного в словаре слова приводит к трансляции (соответствующим NOTFOUND) \ следующего текста: POSTPONE _TLITERAL-CODE
CREATE T-BUF 8000 ALLOT 0 VALUE T-DP : T-BUF0 T-BUF 8000 0 FILL ;
\ слово name определенное через T: выдает a u - записанной в кодофайл строки "text" \ причем символы перевода строк и возврата каретки в тексте затираются 0-мя, а лишние пробелы удаляются : T: ( name "text" -- a u) : 0 TO T-DP T-BUF0 BEGIN NextWord 2DUP >R >R NIP DUP 1 = IF DROP R@ C@ [CHAR] ; = IF RDROP RDROP T-BUF T-DP TLIT, POSTPONE ; 0 TO T-DP EXIT ELSE R@ C@ [CHAR] \ = IF R@ 0xD PARSE DROP R@ - 0 FILL THEN THEN ELSE 0= IF REFILL DROP THEN THEN R> T-BUF T-DP + R@ CMOVE> T-DP R> + 1+ TO T-DP T-DP 0= UNTIL ;[/code]
[code]\ EOF T: WSTRING1 WORD1 WORD2 WORD3 ..... \ ..... ..... WORD8 WORD9 WORD10 ..... ..... !! ! T: NIP- 3\23 |; ..... ..... ..... WORD80 .......... \ WORD90 .......... WORD100 11111111111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222222222 33333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444 55555555555555555555555555555555555555555555555555555555 ; T: WSTRING2 1234 877854 453465 ABCDEFGH ; STARTLOG SEE _TLITERAL-CODE
CR CR WSTRING1 TYPE CR CR WSTRING2 TYPE[/code]
лог [code]CODE _TLITERAL-CODE (23 bytes) 5AD2B3 8D6DF8 LEA EBP , F8 [EBP] 5AD2B6 894504 MOV 4 [EBP] , EAX 5AD2B9 5B POP EBX 5AD2BA 8B03 MOV EAX , [EBX] 5AD2BC 8D5B04 LEA EBX , 4 [EBX] 5AD2BF 895D00 MOV 0 [EBP] , EBX 5AD2C2 8D1C03 LEA EBX , [EBX] [EAX] 5AD2C5 8D5B01 LEA EBX , 1 [EBX] 5AD2C8 FFE3 JMP EBX END-CODE (9 instructions)
WORD1 WORD2 WORD3 ..... WORD8 WORD9 WORD10 ..... ..... !! ! T: NIP- 3\23 |; ..... ..... ..... WORD80 .......... WORD100 11111111111111111111111111111111111111111111111111111111 22222222222222222222222222222222222222222222222222222222 33333333333333333333333333333333333333333333333333333333 44444444444444444444444444444444444444444444444444444444 55555555555555555555555555555555555555555555555555555555
1234 877854 453465 ABCDEFGH Ok[/code]
Буфер можно делать в куче и удалять сразу после создания строк.
Слова _TLITERAL-CODE и TLIT, можно ввести в ядро.
Вариантов много.
|
|
|
|
Добавлено: Ср авг 27, 2008 15:58 |
|
|
|
|