( Из SMAL32 Модифицированно Максимовым М.О. email:mak@rtc.ru http://forth.spb.su:8888 т д {812}705-92-03 т р {812}552-47-64 ) REQUIRE [IF] ~MAK\CompIF.f REQUIRE PLACE ~MAK\PLACE.f REQUIRE CASE lib\ext\case.f VOCABULARY S_ASSEM C" HIDDEN" FIND NIP 0= [IF] VOCABULARY HIDDEN [THEN] ALSO HIDDEN DEFINITIONS C" FLOAD" FIND NIP [IF] FLOAD asmbase.f [ELSE] REQUIRE S= ~mak\asm\asmbase.f [THEN] : 1Op1 ( name ( byte --> ) ( --> ) CREATE C, DOES> C@ C, ; 4 VALUE *DefDatasz \ 4 VALUE *DefDatasz : 1Op1W ( name ( byte --> ) ( --> ) CREATE C, DOES> C@ C, *DefDatasz 4 = IF 0x66 C, THEN ; : 1Op1D ( name ( byte --> ) ( --> ) CREATE C, DOES> C@ C, *DefDatasz 2 = IF 0x66 C, THEN ; : 1Op2 ( name ( word --> ) ( --> ) CREATE W, DOES> W@ W, ; : REF-ERROR IF 87 THROW THEN ; : #OPER-ERROR SWAP IF H. 94 THROW THEN DROP ; 0x2E 1Op1 CS: 0x3E 1Op1 DS: 0x26 1Op1 ES: 0x64 1Op1 FS: 0x65 1Op1 GS: 0x36 1Op1 SS: : IFIND ( c-addr --> xt -1 | c-addr 0 ) DUP COUNT CONTEXT @ SEARCH-WORDLIST IF NIP -1 ELSE 0 THEN ; 0 VALUE *OpcSize 0 VALUE *OpCode 0 VALUE *Mod 0 VALUE *Reg 0 VALUE *R/M 0 VALUE *Scale 0 VALUE *Index 0 VALUE *Base 0 VALUE *OpSize 0 VALUE *ImSize 0 VALUE *AdSize 0 VALUE *Imm 0 VALUE *OfSize 0 VALUE *Offset 0 VALUE *SegReg 0 VALUE *OpArray 0 VALUE *OfRel 0 VALUE *OpRel CREATE *OffName 256 ALLOT CREATE *ImmName 256 ALLOT CREATE *GenName 256 ALLOT : (OthSz) ( n1 --> n2 ) 6 XOR ; : *OpSize>DEF *OpSize 4 = IF *DefDatasz TO *OpSize THEN ; : (Seg) ( --> ) *SegReg CASE 0 OF ES: ENDOF 1 OF CS: ENDOF 2 OF SS: ENDOF 3 OF DS: ENDOF 4 OF FS: ENDOF 5 OF GS: ENDOF ENDCASE ; : CompileCommand ( --> ) *OpcSize IF *AdSize *DefDatasz (OthSz) = IF 0x67 C, THEN *OpSize *DefDatasz (OthSz) = IF 0x66 C, THEN *SegReg 0< IFNOT (Seg) THEN *OpCode HERE ! *OpcSize ALLOT *Mod 0< IFNOT *Mod 3 AND 0x40 * *Reg 7 AND 8 * *R/M 7 AND OR OR C, THEN *Scale 0< *Mod 0< OR IFNOT *Scale 3 AND 0x40 * *Index 7 AND 8 * *Base 7 AND OR OR C, THEN *OfRel IF *OfSize *DefDatasz <> IF 0x54 THROW THEN *OffName C@ IFNOT 1 *OffName 1+ C! THEN *OffName 1+ C@ IF *OffName HERE 2 AddStrObject ELSE *OffName C@ 1- *OffName 1+ C! *OffName 1+ HERE 5 AddStrObject THEN THEN *Offset HERE ! *OfSize ALLOT *OpRel IF *ImSize *DefDatasz <> IF 0x55 THROW THEN *ImmName C@ IFNOT 1 *ImmName 1+ C! THEN *ImmName 1+ C@ IF *ImmName HERE 2 AddStrObject ELSE *ImmName C@ 1- *ImmName 1+ C! *ImmName 1+ HERE 5 AddStrObject THEN THEN *Imm HERE ! *ImSize ALLOT THEN ; : InitCommand ( --> ) 0 TO *OpcSize 0 TO *AdSize 0 TO *OpSize 0 TO *ImSize 0 TO *OfSize 0 TO *OfRel 0 TO *OpRel 0 TO *Offset 0 TO *Imm -1 TO *SegReg -1 TO *Mod -1 TO *Scale -1 TO *Base -1 TO *Index *OffName 0! *ImmName 0! *GenName 0! ; : GetOp ( --> c-addr|char|n type ) (GetOp) CASE 1 OF 1+ C@ DUP [CHAR] ; = IF SOURCE >IN ! 2DROP NullString 0 ELSE 1 THEN ENDOF 2 OF BASE @ >R DUP C@ OVER + C@ CASE [CHAR] H OF 16 BASE ! DUP 1-! ENDOF [CHAR] B OF 2 BASE ! DUP 1-! ENDOF [CHAR] O OF 8 BASE ! DUP 1-! ENDOF [CHAR] D OF 10 BASE ! DUP 1-! ENDOF ENDCASE VAL 0= IF 0x61 THROW THEN DROP R> BASE ! 2 ENDOF 4 OF COUNT ConvertString OVER 1- C! 1- 4 ENDOF 5 OF COUNT ConvertString OVER 1- C! 1- 5 ENDOF \ HEX DUP \ [ HERE DROP ] ENDCASE ; : SCopy ( c-addr1 c-addr2 --> ) OVER C@ 1+ CMOVE ; : ?Reg8 ( --> n true | false ) IN>R GetOp 3 = IF C" AL" S= 0 ?S= C" CL" S= 1 ?S= C" DL" S= 2 ?S= C" BL" S= 3 ?S= C" AH" S= 4 ?S= C" CH" S= 5 ?S= C" DH" S= 6 ?S= C" BH" S= 7 ?S= THEN DROP FALSE R>IN ; : ?Reg16 ( --> n true | FALSE ) IN>R GetOp 3 = IF C" AX" S= 0 ?S= C" CX" S= 1 ?S= C" DX" S= 2 ?S= C" BX" S= 3 ?S= C" SP" S= 4 ?S= C" BP" S= 5 ?S= C" SI" S= 6 ?S= C" DI" S= 7 ?S= THEN DROP FALSE R>IN ; : ?Reg32 ( --> n true | FALSE ) IN>R GetOp 3 = IF C" EAX" S= 0 ?S= C" ECX" S= 1 ?S= C" EDX" S= 2 ?S= C" EBX" S= 3 ?S= C" ESP" S= 4 ?S= C" EBP" S= 5 ?S= C" ESI" S= 6 ?S= C" EDI" S= 7 ?S= THEN DROP FALSE R>IN ; : ?SegReg ( --> n true | FALSE ) IN>R GetOp 3 = IF C" ES" S= 0 ?S= C" CS" S= 1 ?S= C" SS" S= 2 ?S= C" DS" S= 3 ?S= C" FS" S= 4 ?S= C" GS" S= 5 ?S= THEN DROP FALSE R>IN ; : SEG ( --> ) ?SegReg 0= IF 104 THROW THEN (Seg) ; : (?Ptr_) ( --> n true | FALSE ) IN>R GetOp 3 = IF C" DWORD" S= 4 ?S= C" BYTE" S= 1 ?S= C" WORD" S= 2 ?S= THEN DROP FALSE R>IN ; ' (?Ptr_) ->VECT (?Ptr) : ?Ptr ( --> flag ) (?Ptr) IF *OpSize IF *OpSize <> IF 0x50 THROW THEN ELSE TO *OpSize THEN IN>R GetOp 3 = IF C" PTR" S= IF RDROP TRUE EXIT ELSE DROP THEN ELSE DROP THEN R>IN TRUE ELSE FALSE THEN ; : ?FWord ( ? --> ? ) IN>R GetOp 3 = IF C" FWORD" S= IF RDROP IN>R GetOp 3 = IF C" PTR" S= IF RDROP ELSE R>IN DROP THEN ELSE R>IN DROP THEN TRUE EXIT ELSE DROP FALSE THEN ELSE DROP FALSE THEN R>IN ; : ?Reg ( --> flag ) ?Reg32 IF *OpSize 1 2 BETWEEN IF 0x50 THROW THEN 4 TO *OpSize TO *Reg TRUE ELSE ?Reg8 IF *OpSize 2 4 BETWEEN IF 0x50 THROW THEN 1 TO *OpSize TO *Reg TRUE ELSE ?Reg16 IF *OpSize 4 = *OpSize 1 = OR IF 0x50 THROW THEN 2 TO *OpSize TO *Reg TRUE ELSE FALSE THEN THEN THEN ; : Comma ( --> ) GetOp 1 = IF [CHAR] , = ?EXIT THEN 0x51 THROW ; : ?Colon ( --> flag ) IN>R GetOp 1 = IF [CHAR] : = ELSE DROP FALSE THEN DUP IF RDROP ELSE R>IN THEN ; : ?Bracket[ ( --> flag ) IN>R GetOp 1 = IF [CHAR] [ = IF RDROP TRUE EXIT THEN ELSE DROP THEN R>IN FALSE ; : (?Label) ( --> addr|0 TRUE | FALSE ) IN>R GetOp DUP 3 = IF DROP DUP 1 FindStrObject IF RDROP NIP TRUE ELSE RDROP \ DUP FIND IF \ SWAP >R DUP >Name Off_Attr + @ 0x1000000 AND IF \ IF PUBLIC \ RDROP EXECUTE TRUE \ ELSE \ *GenName C@ REF-ERROR R> *GenName SCopy DROP 0 TRUE \ THEN \ ELSE ( DROP ) *GenName C@ REF-ERROR *GenName SCopy 0 TRUE \ THEN THEN ELSE DUP 1 = IF DROP [CHAR] $ = IF RDROP HERE TRUE ELSE R>IN FALSE THEN ELSE 4 = IF *GenName C@ REF-ERROR *GenName 1+ SCopy *GenName 1+ C@ 1+ *GenName W! RDROP 0 TRUE ELSE DROP R>IN FALSE THEN THEN THEN ; : 'XFA ( --> cfa ) GetOp 3 5 BETWEEN IF CONTEXT @ >R PREVIOUS FIND ALSO R> CONTEXT ! 0= IF 0x64 THROW THEN ELSE 0x63 THROW THEN ; : ?Label ( --> addr|0 TRUE | FALSE ) IN>R GetOp \ DUP 1 = \ IF DROP [CHAR] { = \ IF RDROP [CHAR] } PARSE EVALUATE TRUE \ ELSE R>IN FALSE \ THEN EXIT \ ELSE 3 = IF C" OFFSET" S= IF RDROP (?Label) 0= IF 0x5D THROW THEN TRUE EXIT THEN C" CFA" S= IF RDROP 'XFA TRUE EXIT THEN C" PFA" S= IF RDROP 'XFA >BODY TRUE EXIT THEN C" NFA" S= IF RDROP 'XFA >NAME TRUE EXIT THEN THEN \ THEN DROP R>IN (?Label) ; : ?Number ( --> n TRUE | FALSE ) IN>R GetOp CASE 2 OF TRUE RDROP ENDOF 1 OF DUP [CHAR] { = IF DROP [CHAR] } PARSE EVALUATE TRUE RDROP ELSE [CHAR] - = IF GetOp 2 = IF NEGATE TRUE RDROP ELSE DROP FALSE R>IN THEN ELSE FALSE R>IN THEN THEN ENDOF 5 OF DUP C@ IF 1+ C@ ELSE DROP 0 THEN TRUE RDROP ENDOF 3 OF 7 FindStrObject IF RDROP TRUE ELSE FALSE R>IN THEN ENDOF 2DROP FALSE DUP R>IN ENDCASE ; VARIABLE *Sign : Imm ( --> ) *Sign 0! 0 TO *Imm 0 TO *OpRel *GenName 0! BEGIN ?Number IF \ *Sign @ IF -To *Imm ELSE +To *Imm THEN *Sign @ IF NEGATE THEN *Imm + TO *Imm ELSE ?Label IF *GenName C@ IF *ImmName C@ REF-ERROR *GenName *ImmName SCopy *Sign @ REF-ERROR *GenName 0! THEN \ *Sign @ IF 1-To *OpRel -To *Imm ELSE 1+To *OpRel +To *Imm THEN *Sign @ IF *OpRel 1- TO *OpRel NEGATE ELSE *OpRel 1+ TO *OpRel THEN *Imm + TO *Imm ELSE GetOp IF 0x59 ELSE 0x66 THEN THROW THEN THEN *OpRel 0 1 BETWEEN 0= REF-ERROR *OpRel IF *OpSize 1 = *OpSize *DefDatasz (OthSz) = OR IF 0x50 THROW THEN *DefDatasz TO *OpSize THEN GetOp DUP 1 > REF-ERROR IF CASE [CHAR] + OF *Sign 0! FALSE ENDOF [CHAR] - OF *Sign ON FALSE ENDOF [CHAR] , OF TRUE >IN 1-! ENDOF 0x59 THROW ENDCASE ELSE DROP TRUE THEN UNTIL *OpRel IF *DefDatasz TO *ImSize EXIT THEN *OpSize CASE 1 OF *Imm -256 AND IF 0x5A THROW THEN 1 TO *ImSize ENDOF 2 OF \ *Imm -65536 AND IF 0x5A THROW THEN *Imm -128 AND DUP 0= SWAP -128 = OR IF 1 ELSE 2 THEN TO *ImSize ENDOF 4 OF *Imm -128 AND DUP 0= SWAP -128 = OR IF 1 ELSE 4 THEN TO *ImSize ENDOF DROP *Imm -32768 AND DUP 0= SWAP -32768 = OR IF 0x5C THROW THEN *DefDatasz TO *OpSize *DefDatasz TO *ImSize DUP ENDCASE ; : Mult ( n1 --> n2 ) CASE 1 OF 0 ENDOF 2 OF 1 ENDOF 4 OF 2 ENDOF 8 OF 3 ENDOF TRUE IF 0x58 THROW THEN ENDCASE ; 0 VALUE *OldReg : ?MemReg ( --> flag ) *Reg ?Reg IF *Reg TO *R/M TO *Reg 3 TO *Mod ELSE DROP ?Ptr *Sign ! *SegReg TO *OldReg IN>R ?SegReg IF TO *SegReg ?Colon IFNOT *Sign @ IF 82 THROW THEN *OldReg TO *SegReg R>IN FALSE EXIT THEN *Sign ON THEN RDROP ?Bracket[ DUP *Sign @ OR *Sign ! *Sign @ IFNOT DROP FALSE EXIT THEN 0= IF 0x56 THROW THEN *Sign 0! 0 TO *Offset BEGIN ?Reg32 IF *Sign @ REF-ERROR *AdSize 2 = IF 0x50 THROW THEN 4 TO *AdSize IN>R GetOp 1 = SWAP [CHAR] * = AND IF *Index 0< 0= REF-ERROR GetOp 2 <> REF-ERROR Mult TO *Scale TO *Index RDROP *Index 4 = REF-ERROR ELSE R>IN *Base 0< IFNOT *Index 0< 0= REF-ERROR 0 TO *Scale *Base TO *Index *Index 4 = REF-ERROR THEN TO *Base THEN ELSE ?Reg16 IF *Sign @ REF-ERROR *AdSize 4 = IF 0x50 THROW THEN 2 TO *AdSize CASE 3 OF *Base 0< 0= REF-ERROR 3 TO *Base ENDOF 5 OF *Base 0< 0= REF-ERROR 5 TO *Base ENDOF 6 OF *Index 0< 0= REF-ERROR 6 TO *Index ENDOF 7 OF *Index 0< 0= REF-ERROR 7 TO *Index ENDOF TRUE REF-ERROR ENDCASE ELSE ?Number IF *AdSize IFNOT *DefDatasz TO *AdSize THEN *Sign @ IF NEGATE *Offset + TO *Offset ELSE IN>R GetOp 1 = SWAP [CHAR] * = AND IF *Index 0< 0= REF-ERROR ?Reg32 0= REF-ERROR TO *Index Mult TO *Scale RDROP *Index 4 = REF-ERROR ELSE R>IN *Offset + TO *Offset THEN THEN ELSE ?Label IF *AdSize 2 = IF 0x50 THROW THEN *DefDatasz TO *AdSize *GenName C@ IF *OffName C@ REF-ERROR *GenName *OffName SCopy DUP HERE <> IF *Sign @ REF-ERROR THEN *GenName 0! THEN *Sign @ IF *OfRel 1- TO *OfRel NEGATE ELSE *OfRel 1+ TO *OfRel THEN *Offset + TO *Offset ELSE 89 THROW THEN THEN THEN THEN *OfRel 0 1 BETWEEN 0= REF-ERROR GetOp 1 <> REF-ERROR CASE [CHAR] + OF *Sign 0! FALSE ENDOF [CHAR] - OF *Sign ON FALSE ENDOF [CHAR] ] OF TRUE ENDOF 89 THROW ENDCASE UNTIL THEN *OfSize IFNOT *Offset IF *Offset 127 > *Offset -128 < OR IF *DefDatasz TO *OfSize *AdSize 2 = IF *Offset 32767 > *Offset -32768 < OR IF 91 THROW ELSE 2 TO *OfSize THEN THEN ELSE 1 TO *OfSize THEN THEN THEN *OfRel IF *DefDatasz TO *OfSize THEN *AdSize *DefDatasz = IF *Base 0< IF 0 TO *Mod *Index 0< IF 5 TO *R/M ELSE 4 TO *R/M 5 TO *Base THEN *DefDatasz TO *OfSize ELSE *OfSize 4 = IF 2 ELSE *OfSize THEN TO *Mod *Base 5 = *Mod 0= AND IF 0 TO *Offset 1 TO *Mod 1 TO *OfSize THEN *Index 0< IF *Base 4 = IF 0 TO *Scale 4 TO *Index 4 TO *R/M THEN *Base TO *R/M ELSE 4 TO *R/M THEN THEN ELSE *AdSize 2 = IF *OfSize TO *Mod *Base 6 = *Index 0< *OfSize 0= AND AND IF 1 TO *Mod 0 TO *Offset 1 TO *OfSize THEN *Base CASE 3 OF *Index CASE 6 OF 0 ENDOF 7 OF 1 ENDOF DROP 7 DUP ENDCASE ENDOF 5 OF *Index CASE 6 OF 2 ENDOF 7 OF 3 ENDOF DROP 6 DUP ENDCASE ENDOF *Index CASE 6 OF 4 ENDOF 7 OF 5 ENDOF DROP 0 TO *Mod 2 TO *OfSize 6 DUP ENDCASE ENDCASE TO *R/M THEN THEN TRUE ; ALSO S_ASSEM DEFINITIONS PREVIOUS : FCALL ( --> ) 0xE8 C, \ машинная команда CALL ' HERE CELL+ - , ; : FOR CONTEXT @ >R PREVIOUS INTERPRET ALSO R> CONTEXT ! ; : EQU ( --> ) LSP @ C@ 1 = LSP @ 3 + @ HERE \ *DefDatasz 2 = IF 0xFFFF AND THEN = AND IF InitCommand *DefDatasz TO *OpSize Imm *Imm LSP @ 3 + ! *OpRel IFNOT 7 LSP @ C! THEN ELSE 93 THROW THEN ; : DD ( --> ) BEGIN InitCommand 4 TO *OpSize Imm 4 TO *ImSize *OpRel IF *DefDatasz 4 <> REF-ERROR *ImSize 4 <> IF 85 THROW THEN *ImmName C@ IFNOT 1 *ImmName 1+ C! THEN *ImmName 1+ C@ IF *ImmName HERE 2 AddStrObject ELSE *ImmName C@ 1- *ImmName 1+ C! *ImmName 1+ HERE 5 AddStrObject THEN THEN *Imm , IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE ELSE R>IN TRUE THEN UNTIL ; : DW ( --> ) BEGIN InitCommand 4 TO *OpSize Imm *OpRel REF-ERROR 2 TO *OpSize 2 TO *ImSize \ *Imm -65536 AND DUP 0= SWAP -65536 = OR 0= IF 0x5A THROW THEN *Imm W, IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE ELSE R>IN TRUE THEN UNTIL ; : DS ( --> ) InitCommand 4 TO *OpSize Imm 4 TO *ImSize *OpRel IF 101 THROW THEN HERE *Imm DUP ALLOT ERASE ; : DB ( --> ) BEGIN InitCommand IN>R GetOp 1 INVERT AND 4 = IF RDROP COUNT ?DUP IF HERE SWAP DUP ALLOT CMOVE ELSE DROP THEN ELSE DROP R>IN 4 TO *OpSize Imm *OpRel REF-ERROR 1 TO *OpSize *Imm -128 AND DUP 0= SWAP -128 = OR *Imm 256 U< OR 0= IF 0x5A THROW THEN *Imm C, THEN IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE ELSE R>IN TRUE THEN UNTIL ; HIDDEN DEFINITIONS 0 VALUE ?ENDCODE : DEF+! ( N ADDR -- ) *DefDatasz 4 = IF +! ELSE DUP>R @ + R> W! THEN ; : DEF! ( N ADDR -- ) *DefDatasz 4 = IF ! ELSE W! THEN ; : ENDCODE ( 0x5030F8 --> ) TRUE TO ?ENDCODE PREVIOUS 0x5030F8 ?PAIRS LSP @ >R BEGIN R@ C@ WHILE R@ C@ 5 = IF NullString R@ 3 + @ 2 AddStrObject R@ 7 + 9 FindStrObject IF R@ 3 + @ DEF+! 10 R@ C! ELSE HERE R@ 3 + @ DEF+! HERE R@ 3 + ! R@ 8 + HERE R@ 7 + C@ DUP ALLOT CMOVE 9 R@ C! THEN THEN R@ 1+ W@ R> + >R REPEAT RDROP LSP @ >R BEGIN R@ C@ WHILE R@ C@ 8 = IF NullString R@ 3 + @ 2 AddStrObject NullString HERE 2 AddStrObject HERE R@ 3 + @ DEF! R@ 7 + @ , THEN R@ 1+ W@ R> + >R REPEAT RDROP LSP @ >R BEGIN R@ C@ WHILE R@ C@ 2 = IF R@ 7 + C@ IF R@ 7 + 1 FindStrObject IF R@ 3 + @ DEF+! 0 R@ 7 + C! ELSE \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ THEN THEN \ R@ 3 + @ LAST @ Name> - RMark ELSE R@ C@ 4 = IF R@ 7 + 1 FindStrObject IF R@ 3 + @ - 1- DUP -128 AND DUP 0= SWAP -128 = OR IF R@ 3 + @ C! ELSE 96 THROW THEN ELSE \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ THEN ELSE R@ C@ 3 = IF R@ 7 + 1 FindStrObject IF R@ 3 + @ - *DefDatasz - R@ 3 + @ DEF! ELSE \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x53 Error ." ASM: Label not found:" R@ 7 + COUNT TYPE ERR_ THEN THEN THEN THEN R@ 1+ W@ R> + >R REPEAT RDROP ( Save-Input) LSP @ >R BEGIN R@ C@ WHILE R@ C@ 6 = IF R@ 7 + 1 FindStrObject IF \ R@ 7 + COUNT SetStream VALUE 5 RMark Public ELSE R@ 7 + 7 FindStrObject IF \ R@ 7 + COUNT SetStream VALUE Public ELSE \ R@ 7 + >ASCIIZ 0x21 - ErrNo ! 0x62 Error ." ASM: Unresolved PUBLIC reference: R@ 7 + COUNT TYPE ERR_ THEN THEN THEN R@ 1+ W@ R> + >R REPEAT RDROP ( Restore-Input DROP ) ; : STARTCODE ( -- ) ALSO S_ASSEM FALSE TO ?ENDCODE LSP @ >R 0x5030F8 0 >L BEGIN BEGIN GetOp DUP WHILE DUP 3 = IF DROP IFIND IF EXECUTE ?ENDCODE IF R> LSP ! EXIT THEN ELSE *GenName SCopy GetOp 1 = SWAP [CHAR] : = AND IF *GenName 1 FindStrObject IF \ *GenName >ASCIIZ 0x21 - ErrNo ! 0x5F Error ." ASM: Label already defined:" R@ 7 + COUNT TYPE ERR_ ELSE *GenName HERE \ *DefDatasz 2 = IF 0xFFFF AND THEN 1 AddStrObject THEN ELSE -321 THROW THEN THEN ELSE 1 = IF [CHAR] [ = IF [CHAR] ] WORD COUNT EVALUATE ELSE -321 THROW THEN ELSE -321 THROW THEN THEN REPEAT 2DROP REFILL 0= ABORT" endcode not found" AGAIN ; : PUBLIC ( --> ) BEGIN GetOp 3 = IF 0 6 AddStrObject ELSE 0x5D THROW THEN IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP FALSE ELSE R>IN TRUE THEN UNTIL ; : 2Op ( name ( c1opc c1reg ... c9opc c9reg --> ) ( --> ) \ One-byte opcodes only, but with possible "reg" modIFier CREATE 9 0 DO SWAP C, C, LOOP DOES> TO *OpArray InitCommand 1 TO *OpcSize ?Reg IF Comma ?MemReg IF *OpSize CASE 1 OF *OpArray 2+ ENDOF 2 OF *OpArray ENDOF 4 OF *OpArray ENDOF 0x5C THROW ENDCASE ELSE 3 TO *Mod *Reg TO *R/M Imm *OpSize CASE 1 OF *OpArray *Reg IF 12 ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize 16 THEN + DUP 1+ C@ TO *Reg ENDOF 2 OF *OpArray *Reg IF *ImSize 1 = IF 8 ELSE 10 THEN ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize *OpSize TO *ImSize 14 THEN + DUP 1+ C@ TO *Reg ENDOF 4 OF *OpArray *Reg *ImSize 1 = OR IF *ImSize 1 = IF 8 ELSE 10 THEN ELSE -1 TO *Mod -1 TO *Scale 0 TO *OfSize *OpSize TO *ImSize 14 THEN + DUP 1+ C@ TO *Reg ENDOF 0x5C THROW ENDCASE THEN ELSE ?MemReg 0= IF 94 THROW THEN Comma ?Reg IF *OpSize CASE 1 OF *OpArray 6 + ENDOF 2 OF *OpArray CELL+ ENDOF 4 OF *OpArray CELL+ ENDOF 0x5C THROW ENDCASE ELSE Imm *OpSize CASE 1 OF *OpArray 12 + DUP 1+ C@ TO *Reg ENDOF 2 OF *OpArray *ImSize 1 = IF 8 ELSE 10 THEN + DUP 1+ C@ TO *Reg ENDOF 4 OF *OpArray *ImSize 1 = IF 8 ELSE 10 THEN + DUP 1+ C@ TO *Reg ENDOF 0x5C THROW ENDCASE THEN THEN C@ DUP TO *OpCode 0xF7 = IF *OpSize TO *ImSize THEN CompileCommand ; : PUSH ( --> ) InitCommand ?MemReg IF 1 TO *OpcSize *OpSize 2 < IF 0x50 THROW THEN *Mod 3 = IF -1 TO *Mod *R/M 0x50 + TO *OpCode ELSE 0xFF TO *OpCode 6 TO *Reg THEN ELSE ?SegReg IF CASE 0 OF 1 0x06 ENDOF 1 OF 1 0x0E ENDOF 2 OF 1 0x16 ENDOF 3 OF 1 0x1E ENDOF 4 OF 2 0xA00F ENDOF 5 OF 2 0xA80F ENDOF DUP ENDCASE TO *OpCode TO *OpcSize ELSE *DefDatasz TO *OpSize Imm 1 TO *OpcSize *ImSize 4 = *Imm -32768 AND DUP 0= SWAP -32768 = OR AND *OpRel 0= AND IF 2 TO *ImSize THEN *ImSize TO *OpSize *ImSize 1 = IF 0x6A ELSE 0x68 THEN TO *OpCode THEN THEN CompileCommand ; : POP ( --> ) InitCommand ?MemReg IF 1 TO *OpcSize *OpSize 2 < IF 0x50 THROW THEN *Mod 3 = IF -1 TO *Mod *R/M 0x58 + TO *OpCode ELSE 0x8F TO *OpCode 0 TO *Reg THEN ELSE ?SegReg IF CASE 0 OF 1 0x07 ENDOF 1 OF TRUE 1 #OPER-ERROR ENDOF 2 OF 1 0x17 ENDOF 3 OF 1 0x1F ENDOF 4 OF 2 0xA10F ENDOF 5 OF 2 0xA90F ENDOF DUP ENDCASE TO *OpCode TO *OpcSize ELSE 92 THROW THEN THEN CompileCommand ; : IncDec ( name ( byte_opc b_reg word_opc w_reg reg_baseopc dummy --> ) ( --> ) \ One-byte opcodes only, but with possible "reg" modIFier CREATE 3 0 DO SWAP C, C, LOOP DOES> TO *OpArray InitCommand ?MemReg IF *OpSize 0= IF 92 THROW THEN 1 TO *OpcSize *Mod 3 = *OpSize 1 > AND IF -1 TO *Mod *OpArray C@ *R/M + ELSE *OpSize 1 = IF 4 ELSE 2 THEN *OpArray + DUP 1+ C@ TO *Reg C@ THEN TO *OpCode ELSE TRUE 2 #OPER-ERROR THEN CompileCommand ; : NegNot ( name ( byte_opc b_reg word_opc w_reg --> ) ( --> ) \ One-byte opcodes only, but with possible "reg" modIFier CREATE 2 0 DO SWAP C, C, LOOP DOES> TO *OpArray InitCommand ?MemReg IF *OpSize 0= IF 92 THROW THEN 1 TO *OpcSize *OpArray *OpSize 1 = IF 2 + THEN DUP 1+ C@ TO *Reg C@ TO *OpCode ELSE TRUE 3 #OPER-ERROR THEN CompileCommand ; : MOV ( --> ) InitCommand 1 TO *OpcSize ?MemReg IF Comma *Mod 3 = IF *R/M TO *Reg -1 TO *Mod ?MemReg IF *Reg 0= *Mod 0= *R/M 5 = AND AND IF -1 TO *Mod *OpSize 1 = IF 0xA0 ELSE 0xA1 THEN ELSE *OpSize 1 = IF 0x8A ELSE 0x8B THEN THEN ELSE ?SegReg IF *OpSize 2 < IF 0x50 THROW THEN *Reg TO *R/M 3 TO *Mod TO *Reg 0x8C ELSE Imm *OpSize TO *ImSize *Reg *OpSize 1 = IF 0xB0 ELSE 0xB8 THEN + THEN THEN ELSE ?Reg IF *Reg 0= *Mod 0= *R/M 5 = AND AND IF -1 TO *Mod *OpSize 1 = IF 0xA2 ELSE 0xA3 THEN ELSE *OpSize 1 = IF 0x88 ELSE 0x89 THEN THEN ELSE Imm *OpSize TO *ImSize 0 TO *Reg *OpSize 1 = IF 0xC6 ELSE 0xC7 THEN THEN THEN ELSE ?SegReg IF Comma TO *Reg ?MemReg IF *DefDatasz TO *OpSize 0x8E ELSE TRUE 4 #OPER-ERROR THEN ELSE TRUE 5 #OPER-ERROR THEN THEN TO *OpCode CompileCommand ; : INT ( --> ) InitCommand 1 TO *OpSize Imm *Imm 3 = IF 0xCC C, ELSE 0xCD C, *Imm C, THEN ; : OUT ( --> ) InitCommand ?Reg IF *Reg 2 = *OpSize 2 = AND IF Comma InitCommand ?Reg IF *Reg IF TRUE 6 #OPER-ERROR THEN *OpSize CASE 1 OF 0xEE C, ENDOF 2 OF 0xEF66 W, ENDOF 4 OF 0xEF C, ENDOF DUP ENDCASE ELSE TRUE 7 #OPER-ERROR THEN ELSE TRUE 8 #OPER-ERROR THEN ELSE 1 TO *OpSize Imm Comma *Imm >R InitCommand ?Reg IF *Reg IF TRUE 9 #OPER-ERROR THEN *OpSize CASE 1 OF 0xE6 C, ENDOF 2 OF 0xE766 W, ENDOF 4 OF 0xE7 C, ENDOF DUP ENDCASE ELSE TRUE 10 #OPER-ERROR THEN R> C, THEN ; : IN ( --> ) InitCommand ?Reg IF *Reg 11 #OPER-ERROR ELSE TRUE 12 #OPER-ERROR THEN Comma *OpSize >R InitCommand ?Reg IF *Reg 2 = *OpSize 2 = AND 0= 13 #OPER-ERROR R> CASE 1 OF 0xEC C, ENDOF 2 OF 0xED66 W, ENDOF 4 OF 0xED C, ENDOF DUP ENDCASE ELSE 1 TO *OpSize Imm R> CASE 1 OF 0xE4 C, ENDOF 2 OF 0xE566 W, ENDOF 4 OF 0xE5 C, ENDOF DUP ENDCASE *Imm C, THEN ; : LxS ( name ( opcode opcsize --> ) ( --> ) CREATE C, W, DOES> InitCommand DUP C@ TO *OpcSize 1+ W@ TO *OpCode ?Reg IF *OpSize TO *OpArray Comma *OpSize 2 < IF 0x50 THROW THEN *OpSize 2 = *OpCode 0x8D = OR IF \ Opcode 8D belongs TO LEA *OpCode 0x8D = IF 0 ELSE 4 THEN TO *OpSize ?MemReg IF *Mod 3 = 14 #OPER-ERROR *OpCode 0x8D = IF *OpArray ELSE 2 THEN TO *OpSize ELSE TRUE 15 #OPER-ERROR THEN ELSE ?Ptr IF 0x50 THROW THEN ?FWord DROP *DefDatasz TO *OpSize ?MemReg IF *Mod 3 = 16 #OPER-ERROR ELSE TRUE 17 #OPER-ERROR THEN THEN ELSE TRUE 18 #OPER-ERROR THEN CompileCommand ; : JShort ( --> ) *OpArray C@ 0= 19 #OPER-ERROR *DefDatasz TO *OpSize Imm *ImmName C@ IF *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT *ImmName HERE 4 AddStrObject 0 C, ELSE *Imm HERE 2+ - -128 AND DUP 0= SWAP -128 = OR IF *Imm HERE 2+ - *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT C, ELSE 96 THROW THEN THEN ; : Jxx ( name ( indir_opcsize i_opc i_reg near_sze n_opc short_sz s_opc --> ) ( --> ) CREATE SWAP C, W, SWAP C, W, ROT C, SWAP W, C, DOES> TO *OpArray InitCommand IN>R GetOp 3 = IF C" SHORT" S= IF RDROP JShort EXIT THEN THEN DROP R>IN 0 TO *AdSize ?MemReg IF *OpArray 6 + C@ ?DUP IF TO *OpcSize ELSE 20 #OPER-ERROR THEN *OpArray 7 + W@ TO *OpCode *OpArray 9 + C@ TO *Reg CompileCommand EXIT THEN *DefDatasz TO *OpSize Imm *OpSize>DEF *OpArray C@ *OpArray 3 + C@ OR 0= 21 #OPER-ERROR *ImmName C@ IF *OpArray 3 + C@ IF *OpArray CELL+ W@ HERE ! *OpArray 3 + C@ ALLOT *ImmName HERE 3 AddStrObject 0 *DefDatasz 4 = IF , ELSE W, THEN ELSE *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT *ImmName HERE 4 AddStrObject 0 C, THEN ELSE \ *Imm 0x100 KernelSize + LAST @ Name> BETWEEN IF \ 0 TO *OpRel *OffName 0! *ImmName 0! 0 TO *ImSize 0 TO *Offset 4 TO *OfSize \ 4 TO *AdSize -1 TO *Base -1 TO *Index -1 TO *Scale 5 TO *R/M 0 TO *Mod \ *OpArray 6 + C@ ?DUP 0= ABORT" ASM: External address reference not allowed" \ TO *OpcSize \ *OpArray 7 + W@ TO *OpCode *OpArray 9 + C@ TO *Reg \ *Imm HERE *OpcSize + 1+ 8 AddNumObject \ CompileCommand EXIT \ THEN *OpArray C@ *Imm HERE 2+ - -128 AND DUP 0= SWAP -128 = OR AND IF *Imm HERE 1+ *OpArray C@ + - *OpArray 1+ W@ HERE ! *OpArray C@ ALLOT C, ELSE *OpArray 3 + C@ IF *Imm HERE *DefDatasz 4 = IF CELL+ THEN *OpArray 3 + C@ + - *OpArray CELL+ W@ HERE ! *OpArray 3 + C@ ALLOT *DefDatasz 4 = IF , ELSE W, THEN ELSE 96 THROW THEN THEN THEN ; : ShIFt ( name ( reg --> ) ( --> ) \ Hardcoded opcodes - "reg" modIFiers only CREATE C, DOES> InitCommand C@ TO *Reg ?MemReg IF Comma ?Reg8 IF 1 <> 22 #OPER-ERROR *OpSize 1 = IF 0xD2 ELSE 0xD3 THEN ELSE Imm *Imm 0xFF U> IF 90 THROW THEN *Imm 1 = IF *OpSize 1 = IF 0xD0 ELSE 0xD1 THEN 0 TO *ImSize ELSE *OpSize 1 = IF 0xC0 ELSE 0xC1 THEN 1 TO *ImSize THEN THEN ELSE TRUE 23 #OPER-ERROR THEN TO *OpCode 1 TO *OpcSize CompileCommand ; : XCHG ( --> ) InitCommand ?MemReg IF Comma *Mod 3 = IF -1 TO *Mod *R/M TO *Reg ?MemReg IF *Mod 3 = *R/M 0= *Reg 0= OR AND *OpSize 1 > AND IF *OpSize 2 = IF 0x66 C, THEN 0x90 *Reg + *R/M + C, EXIT THEN ELSE TRUE 24 #OPER-ERROR THEN ELSE ?Reg 0= 25 #OPER-ERROR THEN ELSE 25 #OPER-ERROR THEN *OpSize 1 = IF 0x86 ELSE 0x87 THEN TO *OpCode 1 TO *OpcSize CompileCommand ; : IMUL ( --> ) InitCommand ?MemReg IF IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP *Mod 3 <> 26 #OPER-ERROR *OpSize 1 > 0= 27 #OPER-ERROR *R/M TO *Reg -1 TO *Mod ?MemReg IF IN>R GetOp 1 = SWAP [CHAR] , = AND IF RDROP Imm 1 TO *OpcSize *ImSize 1 = IF 0x6B ELSE 0x69 THEN TO *OpCode ELSE R>IN 0xAF0F TO *OpCode 2 TO *OpcSize THEN ELSE Imm 3 TO *Mod *Reg TO *R/M 1 TO *OpcSize *ImSize 1 = IF 0x6B ELSE 0x69 THEN TO *OpCode THEN ELSE R>IN *OpSize 1 = IF 0xF6 ELSE 0xF7 THEN TO *OpCode 1 TO *OpcSize 5 TO *Reg THEN ELSE TRUE 28 #OPER-ERROR THEN CompileCommand ; : MOVxx ( name ( opc1 opc2 --> ) ( --> ) \ Two-byte opcodes only CREATE W, W, DOES> InitCommand TO *OpArray 2 TO *OpcSize ?Reg IF *OpSize >R 0 TO *OpSize Comma ?MemReg IF *OpSize 4 = IF 0x50 THROW THEN *OpSize 2 = R> TO *OpSize IF *OpSize 4 <> IF 0x50 THROW THEN *OpArray W@ TO *OpCode ELSE *OpArray 2+ W@ TO *OpCode THEN ELSE TRUE 29 #OPER-ERROR THEN ELSE TRUE 29 #OPER-ERROR THEN CompileCommand ; : Bit ( name ( c1opc c1reg c2opc c2reg --> ) ( --> ) \ Two-byte opcodes only, with possible "reg" modIFier CREATE SWAP W, C, SWAP W, C, DOES> InitCommand TO *OpArray 2 TO *OpcSize ?MemReg IF *OpSize 2 < 30 #OPER-ERROR Comma ?Reg IF *OpArray 3 + ELSE Imm *Imm 0xFF > IF 90 THROW THEN 1 TO *ImSize *OpArray 2+ C@ TO *Reg *OpArray THEN W@ TO *OpCode ELSE TRUE 31 #OPER-ERROR THEN CompileCommand ; : SETxx ( name ( opc --> ) ( --> ) \ Two-byte opcodes only CREATE W, DOES> InitCommand W@ TO *OpCode 2 TO *OpcSize ?MemReg IF *OpSize 1 <> 33 #OPER-ERROR 0 TO *Reg ELSE TRUE 34 #OPER-ERROR THEN CompileCommand ; : SHxD ( name ( opc1 opc2 --> ) ( --> ) \ Two-byte opcodes only CREATE W, W, DOES> InitCommand TO *OpArray 2 TO *OpcSize ?MemReg IF *OpSize 2 < 0= 35 #OPER-ERROR Comma ?Reg IF Comma ?Reg8 IF 1 <> 36 #OPER-ERROR *OpArray ELSE Imm *Imm 0xFF > IF 90 THROW THEN *OpArray 2+ THEN ELSE TRUE 37 #OPER-ERROR THEN ELSE TRUE 38 #OPER-ERROR THEN W@ TO *OpCode CompileCommand ; : BSx ( name ( WORD --> ) ( --> ) CREATE W, DOES> InitCommand W@ TO *OpCode 2 TO *OpcSize ?Reg IF *OpSize 2 < 39 #OPER-ERROR Comma ?MemReg 0= TRUE 40 #OPER-ERROR ELSE TRUE 41 #OPER-ERROR THEN CompileCommand ; : Rxx ( name ( opc --> ) ( --> ) CREATE C, DOES> C@ C, 1 C, 0xC3 C, ; : ALIGN ( --> ) InitCommand *DefDatasz TO *OpSize Imm 4 TO *ImSize *OpRel IF 101 THROW THEN BEGIN HERE *Imm MOD WHILE 0 C, REPEAT ; : I' BL WORD IFIND 0= IF -321 THROW THEN ( -? ) ; ALSO S_ASSEM DEFINITIONS S" ~mak\asm\ASM_SIF.F" INCLUDED 0xC9 1Op1 LEAVE 0xCC 1Op1 INT3 0xCE 1Op1 INTO 0x37 1Op1 AAA 0x3F 1Op1 AAS 0x99 1Op1D CDQ 0x98 1Op1D CWDE 0xF8 1Op1 CLC 0xFC 1Op1 CLD 0xFA 1Op1 CLI 0xF5 1Op1 CMC 0xA6 1Op1 CMPSB 0xA7 1Op1D CMPSD 0x27 1Op1 DAA 0x2F 1Op1 DAS 0xF4 1Op1 HLT 0x6C 1Op1 INSB 0x6D 1Op1D INSD 0xCF 1Op1D IRETD 0x9F 1Op1 LAHF 0xAC 1Op1 LODSB 0xAD 1Op1D LODSD 0xA4 1Op1 MOVSB 0xA5 1Op1D MOVSD 0x90 1Op1 NOP 0x6E 1Op1 OUTSB 0x6F 1Op1D OUTSD 0x61 1Op1D POPAD 0x60 1Op1D PUSHAD 0x9D 1Op1D POPFD 0x9C 1Op1D PUSHFD 0xC3 1Op1 RET 0xCB 1Op1 RETF 0x9E 1Op1 SAHF 0xAE 1Op1 SCASB 0xAF 1Op1D SCASD 0xF9 1Op1 STC 0xFD 1Op1 STD 0xFB 1Op1 STI 0xAA 1Op1 STOSB 0xAB 1Op1D STOSD 0x9B 1Op1 WAIT 0xD7 1Op1 XLAT 0xD7 1Op1 XLATB 0xF0 1Op1 LOCK 0xF3 1Op1 REP 0xF3 1Op1 REPE 0xF3 1Op1 REPZ 0xF2 1Op1 REPNE 0xF2 1Op1 REPNZ 0x0AD5 1Op2 AAD 0x0AD4 1Op2 AAM 0x310F 1Op2 RDTSC 0x98 1Op1W CBW 0x99 1Op1W CWD 0xA7 1Op1W CMPSW 0x6D 1Op1W INSW 0xCF 1Op1W IRET 0xAD 1Op1W LODSW 0xA5 1Op1W MOVSW 0x6F 1Op1W OUTSW 0x61 1Op1W POPA 0x60 1Op1W PUSHA 0x9D 1Op1W POPF 0x9C 1Op1W PUSHF 0xAF 1Op1W SCASW 0xAB 1Op1W STOSW 0x14 0 0x15 0 0x80 2 0x81 2 0x83 2 0x10 0 0x11 0 0x12 0 0x13 0 2Op ADC 0x04 0 0x05 0 0x80 0 0x81 0 0x83 0 0x00 0 0x01 0 0x02 0 0x03 0 2Op ADD 0x24 0 0x25 0 0x80 4 0x81 4 0x83 4 0x20 0 0x21 0 0x22 0 0x23 0 2Op AND 0x3C 0 0x3D 0 0x80 7 0x81 7 0x83 7 0x38 0 0x39 0 0x3A 0 0x3B 0 2Op CMP 0x1C 0 0x1D 0 0x80 3 0x81 3 0x83 3 0x18 0 0x19 0 0x1A 0 0x1B 0 2Op SBB 0x2C 0 0x2D 0 0x80 5 0x81 5 0x83 5 0x28 0 0x29 0 0x2A 0 0x2B 0 2Op SUB 0x34 0 0x35 0 0x80 6 0x81 6 0x83 6 0x30 0 0x31 0 0x32 0 0x33 0 2Op XOR 0x0C 0 0x0D 0 0x80 1 0x81 1 0x83 1 0x08 0 0x09 0 0x0A 0 0x0B 0 2Op OR 0xA8 0 0xA9 0 0xF6 0 0xF7 0 0xF7 0 0x84 0 0x85 0 0x84 0 0x85 0 2Op TEST 0xFE 0 0xFF 0 0x40 0 IncDec INC 0xFE 1 0xFF 1 0x48 0 IncDec DEC 0xF6 3 0xF7 3 NegNot NEG 0xF6 2 0xF7 2 NegNot NOT 0xF6 4 0xF7 4 NegNot MUL 0xF6 6 0xF7 6 NegNot DIV 0xF6 7 0xF7 7 NegNot IDIV 0x8D 1 LxS LEA 0xC5 1 LxS LDS 0xC4 1 LxS LES 0xB20F 2 LxS LSS 0xB40F 2 LxS LFS 0xB50F 2 LxS LGS 1 0xFF 4 1 0xE9 1 0xEB Jxx JMP 1 0xFF 2 1 0xE8 0 0 Jxx CALL 0 0 0 0 0 1 0xE3 Jxx JECXZ 0 0 0 0 0 2 0xE367 Jxx JCXZ 0 0 0 0 0 1 0xE2 Jxx LOOP 0 0 0 0 0 1 0xE1 Jxx LOOPZ 0 0 0 0 0 1 0xE0 Jxx LOOPNZ 0 0 0 2 0x840F 1 0x74 Jxx JZ 0 0 0 2 0x800F 1 0x70 Jxx JO 0 0 0 2 0x810F 1 0x71 Jxx JNO 0 0 0 2 0x820F 1 0x72 Jxx JC 0 0 0 2 0x830F 1 0x73 Jxx JNC 0 0 0 2 0x850F 1 0x75 Jxx JNZ 0 0 0 2 0x860F 1 0x76 Jxx JNA 0 0 0 2 0x870F 1 0x77 Jxx JA 0 0 0 2 0x880F 1 0x78 Jxx JS 0 0 0 2 0x890F 1 0x79 Jxx JNS 0 0 0 2 0x8A0F 1 0x7A Jxx JPE 0 0 0 2 0x8B0F 1 0x7B Jxx JPO 0 0 0 2 0x8C0F 1 0x7C Jxx JL 0 0 0 2 0x8D0F 1 0x7D Jxx JGE 0 0 0 2 0x8E0F 1 0x7E Jxx JLE 0 0 0 2 0x8F0F 1 0x7F Jxx JG : JE JZ ; : JB JC ; : JNAE JC ; : JAE JNC ; : JNB JNC ; : JNE JNZ ; : JBE JNA ; : JNBE JA ; : JP JPE ; : JNP JPO ; : JNGE JL ; : JNL JGE ; : JNG JLE ; : JNLE JG ; : LOOPE LOOPZ ; : LOOPNE LOOPNZ ; 0x02 ShIFt RCL 0x03 ShIFt RCR 0x00 ShIFt ROL 0x01 ShIFt ROR 0x04 ShIFt SAL 0x07 ShIFt SAR 0x04 ShIFt SHL 0x05 ShIFt SHR 0xBE0F 0xBF0F MOVxx MOVSX 0xB60F 0xB70F MOVxx MOVZX 0 0xA30F 4 0xBA0F Bit BT 0 0xBB0F 7 0xBA0F Bit BTC 0 0xB30F 6 0xBA0F Bit BTR 0 0xAB0F 5 0xBA0F Bit BTS 0x970F SETxx SETA 0x930F SETxx SETAE 0x920F SETxx SETC 0x960F SETxx SETNA 0x940F SETxx SETZ 0x9F0F SETxx SETG 0x9D0F SETxx SETGE 0x9C0F SETxx SETL 0x9E0F SETxx SETLE 0x950F SETxx SETNZ 0x900F SETxx SETO 0x910F SETxx SETNO 0x980F SETxx SETS 0x990F SETxx SETNS 0x9A0F SETxx SETP 0x9B0F SETxx SETNP : SETNBE SETA ; : SETNB SETAE ; : SETNC SETAE ; : SETB SETC ; : SETNAE SETC ; : SETBE SETNA ; : SETE SETZ ; : SETNLE SETG ; : SETNL SETGE ; : SETNGE SETL ; : SETNG SETLE ; : SETNE SETNZ ; : SETPE SETP ; : SETPO SETNP ; 0xA40F 0xA50F SHxD SHLD 0xAC0F 0xAD0F SHxD SHRD 0xBC0F BSx BSF 0xBD0F BSx BSR 0x73 Rxx RC 0x72 Rxx RNC 0x75 Rxx RZ 0x74 Rxx RNZ 0x76 Rxx RA 0x77 Rxx RNA 0x7A Rxx RPO 0x7B Rxx RPE 0x71 Rxx RO 0x70 Rxx RNO 0x7E Rxx RG 0x7F Rxx RNG 0x7D Rxx RL 0x7C Rxx RNL : RE RZ ; : RB RC ; : RNAE RC ; : RAE RNC ; : RNB RNC ; : RNE RNZ ; : RBE RNA ; : RNBE RA ; : RP RPE ; : RNP RPO ; : RNGE RL ; : RGE RNL ; : RLE RNG ; : RNLE RG ; PREVIOUS ALSO FORTH DEFINITIONS : Code ( -- ) HEADER STARTCODE ; : STARTCODE STARTCODE ; : USE16 ( --> ) 2 TO *DefDatasz ; : USE32 ( --> ) 4 TO *DefDatasz ; S_ASSEM DEFINITIONS : MOVSD 0xA5 C, *DefDatasz 2 = IF 0x66 C, THEN ; : MOVSW 0xA5 C, *DefDatasz 4 = IF 0x66 C, THEN ; : SEG SEG ; : PUBLIC PUBLIC ; : ENDCODE ENDCODE ; : PUSH PUSH ; : POP POP ; : MOV MOV ; : INT INT ; : OUT OUT ; : IN IN ; : XCHG XCHG ; : IMUL IMUL ; : ALIGN ALIGN ; PREVIOUS PREVIOUS DEFINITIONS \EOF USE16 Code ZZ mov bp, msg msg: ; EQU 4444H RET ENDCODE \EOF C" DBG" FIND NIP [IF] ALSO S_ASSEM mov Ebp, msg USE16 DBG mov bp, msg [THEN] \S Code ZZ ADD EBX, {KEY} ADD EBX, 44H ADD EBX, 4444444H WWW: MOV EAX, WWW+4 MOV EAX, [EBP+EDX*4] FOR 0x44444 , JMP SHORT SS1 SS1: JMP SS2 SS2: EndCode ' ZZ 20 DUMP \ 4B22AE 09C0 OR EAX , EAX \ http://win32asm.chat.ru/