1C: Assembler - Schreiben Sie einen sauberen Bytecode für die gestapelte Maschine. 1C: Enterprise


Stapelmaschinen werden in einer Vielzahl moderner Programmiersprachen eingesetzt. Sie sind leicht zu verstehen und gleichzeitig sehr effektiv. Möchten Sie eine solche in Aktion ausprobieren?


Sie alle haben wahrscheinlich gehört, dass sich 1C-Spitznamen über ihr System beschweren, da die 1C-Sprache nicht niedrig genug, langweilig usw. ist. Alle schauen sehnsüchtig auf die "echten" Programmiersprachen. Also, meine Herren, sie liegen falsch. Im 1C-System gibt es Orte, an denen Sie das Gehirn des Programmierers dehnen und die Low-Level-Technologie genießen können. Ich schlage vor, Sie tauchen in die Eingeweide der virtuellen 1C-Maschine ein und verstehen, wie sie funktioniert. Es hat einen eigenen "Assembler" und heute werden wir Arbeitscode für 1C darauf schreiben. Komm unter den Schnitt, es wird Spaß machen!


Gestapelte virtuelle Maschinen


Dynamische Programmiersprachen erobern zunehmend die Welt. Vielleicht war nur noch C von den "ehrlichen" Muttersprachen in den Reihen übrig (mit und ohne Pluspunkte). Dies ist, wenn wir den industriellen Mainstream nehmen. Alle gängigen Sprachen haben auf die eine oder andere Weise eine Schicht in Form einer "Laufzeitumgebung" oder einer "virtuellen Maschine", die die Codeausführung auf einer bestimmten Eisenarchitektur ermöglicht. Und die überwiegende Mehrheit dieser "virtuellen Maschinen" ist gestapelt, d.h. Implementieren von Verarbeitungsoperationen unter Verwendung einer solchen Struktur, die in der Computerwelt als "Stapel" bekannt ist.


Bemerkung für diejenigen, die vergessen haben


(Stack) "". (, ) - , . . .. . "LIFO" — last in/first out. ( ). — .


Java, Python, C# 1 — . , node.js — , , . 95% , . JIT , , ? :)


, , . , — , -, . , . , — , . Java — . , . , , Java JVM — . ( ) Dalvik. , , . — , . , , , ( ) , , .


1 . — 1, — , 1Script. , .



. 2014 , .


, = 1 + 1; ?


PushConst 1
PushConst 1
Add
LoadVar A

- 1 (2 ), Add.


Add (2 ) . . LoadVar , ( — ).


. , = 1+1+2 :


PushConst 1 ;    
PushConst 1 ;    
Add ;  2    (1   1), ,    
PushConst 2 ;    
Add ;  2    (2   2), ,    
LoadVar A ;    ,    (4)     .

, , , : - - .


, , "-". "" .


- 1


, 1 - , , , . , , - - — . , 1 - . , , epf . v8unpack.



1. , .


epf. , chocolatey


choco install v8unpack --version 3.0.41 --source https://www.myget.org/F/onescript/api/v2

, chocolatey (, , ?) https://github.com/e8tools/v8unpack/releases/download/v.3.0.40/v8unpack.exe exe PATH, .


, 1, , .


v8unpack -P .epf content

content, 1 ( — : https://infostart.ru/public/250142/)


, "<--GUID>.0", "info" "text". "text" , , . content . "" " ". , .



, ? , content


v8unpack -P .epf content

GUID.0 , image, text — - . , , - , ? 1 - image. :



— 1. , . , ? , ! ? , !


?


, -, , , . .


-, , - 1 , . 1-, , . " 1" , . , , , 1. . , ?


. , , , .. . . , 1 . , , ( ) " ", " 1" — , .


, . , . - -, 1 . , .


: , ( , ), , , .


, ?


- 1, . - .


, v8unpack "" "image", .



, , , 1.


""


(). — . (OpCode), . , . . , , . ( ). , , — : .


? 1 128, , . .


""


. - , — , — . " ", . .. - , , / . , / . , .


. , , "". " = 2" 1 . . " - ".


""


1 ( ) . - ( ). , . . "", ( ) , .



-?


. — , — , . 2 1.


2. 0 .


2 2 :


LdConst 0
LdConst 0
Add 0

! : , - , Ld "Load". , .


LdConst , ( , 0 ). , . — .


, 2 ( — )


— . , , , Add 0. 2 1 ( ).


, "" .


, , .


, !


, "Hello World".


"" "" :



" " "" , .


, " "



, "" :


LdConst 0
ArgNum 1
CallLoc 0
End 0

"". , -



?


"" " " v8unpack . 1- . " " "". .



. .


 = 8;
 =  + 2;
 =  - ;

: -, 8 2 "" . 0, — 1. , , . .



08
12


0
1
2

LdVar. , . , :


LineNum 1 ;   
LdVar 0 ;     0 ()
LdConst 0 ;     0 ( 8)
Assign ;  -       , .
LineNum 2 ;   
LdVar 1 ;     1 ()
LdVar 0 ;     0 ()
LdConst 1 ;     1 ( 2)
Add ;  2   ,     (+2)
Assign ;  -       ,  ( = (+2)).
LineNum 3 ;  
LdVar 2 ;   2 ()
LdVar 1 ;   1 ()
LdVar 0 ;   0 ()
Sub; .  2 ,  
Assign;   = (-)
End;   

, , , , . , LineNum? , , , . . , , " , " . , LineNum. , , , .



. -, , . ( ) . :


ArgNum, ( )
CallLoc
CallProc,
CallFunc, ( )
Ret( )
LdRet

. "" . 0.


, LineNum. "" 1 .


LdConst 0;    - 
ArgNum 1;           
CallLoc 0;     0.

, ArgNum. — . , . , .



, ( ), , — - . Assign, . 2 . . LdRet. , , . , Ret, . LdRet — . , . . 1Script "" .



, , . . , . Jmp. , Jmp . . , , 1. - — , .



, , 1 . , " " , — . = , " " . :


 () = ("")  . = 2 

2 : . 1 . , , . , " " .


, . , . 2 — And Or . , , .


, "" , , , .. , .. . ( ). , , , .. , ).


2 : JmpTrue JmpFalse. ( ), , , . , JmpTrue 1 . .. , JmpTrue, , .. 1 (trollface) , 1Script JmpTrue .



? 0 1, 0 1


0: LdVar 0 ;     
1: LdConst 0 ;     1
2: Cmp ;  (     )
3: JmpFalse 6 ;    6,    
4:  IF ;  
5:  IF ;  
6:  … ; 

— . — .



3 : "", "… " " … ". "" , .


"… " " ", , . , , . Gte (--) JmpFalse . , "".


" "


. — , Next()


Iter, Next , . , … , , 1 , , .


. , , :


 ()

         
        .();
    ; 


, "" 0, "" 1. , , "0", . , ? , :)


? , :


PutTmp ;   
LdTmp ;     

( 0)


LdLoc 0 ;    

, , .


Iter ;          -.
Assign ;   Tmp

, :


0LineNum4.
1PutTmp0
2LdTmp0
3LdLoc0. Var
4Iter0
5Assign0= ()
6LineNum4.
7LdLoc2. Var
8LdTmp0
9Assign0= ()
10LdLoc2. Var
11Next0. , , ( — , — )
12JmpFalse26, . Cmd
13LdLoc1. Var
14LdLoc2. Var
15Assign0= ()
16LdLoc2. Var
17LdUndef0
18Assign0= ()
19LineNum5.
20LdLoc1. Var
21ArgNum0(, ). , . , , ( ) ( )
22CallProc0.< >() ( , .. ). Const,
23LineNum5.
24LineNum6.
25Jmp6. Cmd
26PopTmp11? (, - )
27LdLoc2. Var
28LdUndef0
29Assign0= ()
30LdLoc2. Var
31LdUndef0
32Assign0= ()
33LineNum8.
34End0(, )
35End0(, )
36End0(, )

5. Assign, 2 — . .


:


LdLoc 2 ;      0
LdTmp 0 ;    
Assign;     0
LdLoc 2;   0  
Next;        
JmpFalse 26 ;     -      .

Next. , (0), , , , , . JmpFalse .


, JmpFalse 0 , . 0, 0 — .


- . 19-23 . 25 — Jmp , 26 — .


27- 32-. 0, - 2 . , , … , +3 , 0 . , , …


, 1Script :


0  :(LineNum     3)
1  :(PushLoc     0)
2  :(PushIterator  0)
3  :(LineNum     3)
4  :(IteratorNext  0)
5  :(JmpFalse   12)
6  :(LoadLoc     1)
7  :(LineNum     4)
8  :(PushLoc     1)
9  :(ArgNum      0)
10 :(ResolveMethodProc  0)
11 :(Jmp         3)
12 :(StopIterator  0)
13 :(PushConst   1)
14 :(Return      0)

15 37. , .. , . , 1Script 1. .



, , , . ? , , . , .


? , , , "" "".


- , 1 . BlckEnd Jmp . , BlckEnd — - . BlckEnd 0.


. "" BlckEnd, .


 // 1
     // 2
         // 3
             2; // BlckEnd 3

.. "" — BlckEnd 0, "" — BlckEnd < >. , " " , , .. "" " ".


-


BeginTry, . .. . , , BlckEnd <> Jmp ;


:


 ()
    
       ;
    
       ;
    ;


0: BeginTry 4 ;    Cmd  
1: LineNum 6 ;    
2:BlckEnd 1 ;    1
3:Jmp 6 ;   
4:LineNum 6 ;  :    
5:EndTry 0 ; (  )
6:LineNum 7 ;  :    
7:End 0 ;  (, )
8:End 0 ;  (, )
9:End 0 ;  (, ) 

. BeginTry , , ( ).


( ), BlckEnd ( 2-3). EndTry.


, , . .



? , ? , "" "". image -, , v8unpack epf.


, .


: . , . , (-) , ? , " " :


 = .();

 .() 
    (.);
;

, , " " "-()". 1 , 1 , !


. "" "" . , "" — . :


LdVar 0-
ArgNum 0()
New 0, 0
Assign
LdVar 0
Iter
,
ArgNum 1,
CallLoc 0
End

"". "". ? , "(())" "". - -. ? — !


(dmpas), , :)


Disclaimer


, , . , , 1 . , . "" . , . . , "" , .



1C ist ein komplexes und mehrschichtiges System und es ist äußerst interessant, es zu untersuchen. Und je besser Sie wissen, wie Ihr System funktioniert, desto effizienter können Sie es nutzen. Heute haben wir untersucht, wie die virtuelle 1C-Maschine funktioniert, und hoffentlich unseren technischen Horizont erweitert. Nun, und außerdem haben wir ein Konstruktionsspielzeug in die Hände bekommen, weil das Spielen mit dem Assembler ziemlich lustig ist!


Ich wünsche Ihnen kreativen Erfolg!


All Articles