1C: Assembler - tulis bytecode yang bersih untuk mesin bertumpuk 1C: Enterprise


Mesin tumpukan digunakan dalam berbagai bahasa pemrograman modern. Mereka mudah dimengerti dan pada saat yang sama cukup efektif. Ingin mencoba tindakan seperti itu?


Kalian semua, mungkin, pernah mendengar bahwa nama panggilan 1C mengeluh tentang sistem mereka, mengingat bahasa 1C tidak cukup rendah, membosankan, dll. Semua dari mereka melihat ke arah bahasa pemrograman "nyata". Jadi, tuan-tuan, mereka salah. Dalam sistem 1C ada tempat di mana Anda dapat meregangkan otak programmer dan menikmati teknologi tingkat rendah. Saya sarankan Anda menyelam ke dalam mesin virtual 1C dan memahami cara kerjanya. Ini memiliki "assembler" sendiri dan hari ini kita akan menulis kode kerja untuk 1C di atasnya. Di bawah luka, itu akan menyenangkan!


Mesin Virtual Tertumpuk


Bahasa pemrograman dinamis semakin menangkap dunia. Dari bahasa asli "jujur" di peringkat, mungkin, hanya C yang tersisa (dengan plus dan tanpa). Ini jika kita mengambil arus utama industri. Semua bahasa populer, dengan satu atau lain cara, memiliki lapisan dalam bentuk "lingkungan runtime" atau "mesin virtual", yang menyediakan eksekusi kode pada arsitektur besi tertentu. Dan sebagian besar "mesin virtual" ini ditumpuk, mis. mengimplementasikan operasi pemrosesan menggunakan struktur yang dikenal di dunia komputer sebagai "tumpukan".


Komentar untuk mereka yang lupa


(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 adalah sistem yang kompleks dan multi-layer dan sangat menarik untuk mempelajarinya. Dan semakin baik Anda mengetahui cara kerja sistem Anda, semakin efisien Anda dapat menggunakannya. Hari ini kami memeriksa cara kerja mesin virtual 1C dan, semoga, memperluas cakrawala teknis kami. Yah, dan selain itu, kami mendapatkan mainan konstruksi, karena bermain dengan assembler sangat menyenangkan!


Semoga sukses kreatif!


All Articles