OPTIMASI VB DENGAN TEKNIK PRECOMPILE ASSEMBLY


Sudahkah anda mengenal apa itu teknik precompile assembly ??.. Ya.. teknik precompile merupakan salah satu teknik yang sering digunakan oleh para programmer VB tingkat lanjut untuk optimalisasi program buatanya karena VB tidak mendukung inline Assembly. Memang sudah ada dan disediakan sebuah plugins tambahan untuk menyisipkan code assembly kedalam VB tetapi kebanyakan dari mereka lebih memilih teknik precompile Asm karena menurut mereka teknik ini relatif lebih mudah dibandingkan harus memakai plugins tersebut. Cara kerja teknik ini dapat digambarkan sebagai berikut :
precompile
Sudah jelaskan bagaimana teknik precompile bekerja. Nah sekarang kita sudah siap untuk Melanjutakan pembahasan kita, nah sebagai contoh apabila kita ingin memasukkan code Assembly penjumlahan sederhana sebagai berikut :
Adding proc add1:DWORD,add2:DWORD mov eax, add1 add eax, add2 ret Adding endp  
Nah kita tidak bisa langsung memasukkan fungsi penjumlahan assembly tersebut kedalam project VB kita, karena VB tidak mengizinkan untuk penulisan inline Assembly. Terus bagaimana solusi yang tepat agar kita tetap dapat memasukkan Fungsi Assembly, jawabanya adalah teknik Precompile Asm. Nah sesuai dari gambaran diatas langkah-langkah sederhananya sebagai berikut: Kita mengunakan OP Code Fungsi dari Assembly tersebut untuk kemudian dirubah dalam bentuk Byte(). Nah sebelumnya kita harus mengetahui dahulu OPCode dari fungi Assembly kita, nah agar tidak panjang lebar lagi disini sudah saya sertakan OPCode dari fungsi Penjumlahan dari Assembly.
OP CODEFungsi Assemby
55PUSH EBP
8BECMOV EBP ESP
8B4508MOV EAX, DWORD PTR [EBP+0x8]
03450CADD EAX, DWORD PTR [EBP+0xC]
C9LEAVE
C3RETN
Dari data diatas diketahui bahwa total dari OPCode Fungsi tersebut adalah : "558BEC8B450803450CC9C3" Nah langkah selanjutnya adalah merubah OPCode tersebut menjadi byte agar nantinya dapat diload di panggil di memory. Nah dalam VB kita dapat membuat fungsi sederhana untuk merubah OPCode tadi menjadi type Byte().
    OPCodeAdd = "558BEC8B450803450CC9C3"

ReDim AsmAdd(Len(OPCodeAdd) \ 2 - 1)

For i = 1 To Len(OPCodeAdd) Step 2
AsmAdd(i \ 2) = Val("&H" & Mid$(OPCodeAdd, i, 2))
Next i
Fungsi Assembly yang sudah dalam bentuk Byte di Load di Memory. Nah dalam kasus ini code diatas secara otomatis sudah me Load byte tersebut di memory, potongan fungsi tersebut adalah.
AsmAdd(i \ 2) = Val("&H" & Mid$(OPCodeAdd, i, 2))
Fungsi yang berada di Memory dipanggil dengan menggunakan API “CallWindowProc”Sebelum kita memanggil fungsi tersebut hal pertama yang harus kita lakukan adalah mengetahui Alamat (Pointer) fungsi yang kita Load tadi di Memory untuk kemudian dapat dipanggil dari menggunakan alamat tersebut. Dalam Vb fungsi yang tepat untuk mengetahui alamat tersebut adalah “VarPtr”.
PtrCode = VarPtr(AsmAdd(0))
Kemudian setelah alamat dari fungsi tersebut sudah kita kantongi, kita tinggal memanggil fungsi tersebut menggunakan “CallWindowProc” :
Adding = CallWindowProc(PtrCode, Bin1, Bin2, 0, 0)
“PtrCode” merupakan Alamat fungsi yang kita panggil sedangkan “Bin1” dan “Bin2” adalah param dari fungsi tersebut atau dalam kasus ini merupakan nilai – nilai yang akan kita jumlahkan. Nah hasil dari penjumlahan tersebut ditampung dalam variable “Adding”. Nah gimana mudah bukan tahapan – tahapan dalam Implementasi teknik PreCompile Asm dalam kasus diatas. Nah ekarang saatnya kita membuat project tersebut secara utuh agar dapat dirasakan dan dilihat hasilnya. Buat Project baru dalam VB kemudian tambahkan satu component “CommandButtond” dalam project tersebut. Tulis code ini dalam Form editor :
'Author         : Agus Minanur Rohman
'Description : Teknik Precompile
'Date : Rabu, 11 Desember, 2010, 15:00
Dim OPCodeAdd$, AsmAdd() As Byte
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal Source As Long, ByVal x1 As Long, ByVal x2 As Long, ByVal x3 As Long, ByVal x4 As Long) As Long

Private Sub Command1_Click()
Dim xx As String
Dim h1&, h2&

h1 = 200574000 + 12250
h2 = Adding(200574000, 12250)

MsgBox "Hasil penjumlahan Fungsi VB = " & h1 & vbCrLf & _
"Hasil Penjumlahan Teknik Precompile = " & h2

End Sub

Private Function Adding(ByVal Bin1 As Long, ByVal Bin2 As Long) As Long
Dim PtrCode&

PtrCode = VarPtr(AsmAdd(0))
Adding = CallWindowProc(PtrCode, Bin1, Bin2, 0, 0)
End Function

Private Sub Initialize()

'55 PUSH EBP
'8BEC MOV EBP,ESP
'8B4508 MOV EAX,DWORD PTR [EBP+0x8]
'03450C ADD EAX,DWORD PTR [EBP+0xC]
'C9 LEAVE
'C3 RETN

OPCodeAdd = "558BEC8B450803450CC9C3"

ReDim AsmAdd(Len(OPCodeAdd) \ 2 - 1)

For i = 1 To Len(OPCodeAdd) Step 2
AsmAdd(i \ 2) = Val("&H" & Mid$(OPCodeAdd, i, 2))
Next i

End Sub

Private Sub Form_Load()
Call Initialize
End Sub

'Created by Agus Minanur R.| A.k.a| ManiaX Code| Copyright © 2010 DarmaSoft, indonesia
Setelah itu compile dan lihat hasilnya, ini hasil compile saya : hasilx
Download Source Code Precompile

Related Posts:

0 Response to "OPTIMASI VB DENGAN TEKNIK PRECOMPILE ASSEMBLY"

Posting Komentar