Upload
nadya-amalia
View
20
Download
1
Embed Size (px)
DESCRIPTION
Bahasa Pemrograman Assembly
Citation preview
MAKALAH TUGAS BESAR
PEMROGRAMAN BAHASA ASSEMBLER
PEMBUATAN PROGRAM “9 GAMBAR YANG BISA MENCERMINKAN
KEPRIBADIAN ANDA” DENGAN MASM32
(MICROSOFT MACRO ASSEMBLER 32)
OLEH :
NADYA AMALIA (NIM J1D108034)
PROGRAM STUDI S-1 FISIKA
FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS LAMBUNG MANGKURAT
BANJARBARU
2011
I. TUJUAN
1. Memahami lebih jauh mengenai pemrograman bahasa assembler 32 bit
dengan MASM32.
2. Membuat program “9 Gambar Yang Bisa Mencerminkan Kepribadian
Anda” dengan MASM32.
II. TINJAUAN PUSTAKA
2.1. Pemrograman Bahasa Assembler 32 bit (Win32Asm ) dengan MASM
32
Sejarah pemrograman Win32 dimulai sejak munculnya prosesor Intel
80386. Generasi awal dari lingkungan Win32 adalah munculnya sistim operasi
Windows 3.0. Sedangkan munculnya konsep PE (PortableExecutable) yang
mendukung pemrograman Win32 adalah saat dikeluarkannya Windows Nt versi
3.1 oleh Microsoft Corp. Pemrograman Win32 memiliki kemampuan mengakses
ruang alamat memori sebesar 4 GB (Giga Byte). Tetapi tidak berarti bahwa semua
program berbasis Win32 menggunakan keseluruhan dari ruang memori fisik
tersebut. Hal ini berbeda sekali dengan lingkungan Win16 (sistim operasi DOS),
dimana program-program Win16 hanya dapat mengakses ruang alamat memori
DOS sebesar 640 KB (Kilo Byte). Selain itu pemrograman Win16 juga dibatasi
oleh adanya pemakaian segmen-segmen memori yang hanya berukuran 64 KB
serta ukuran register memori sebesar 16 bit (AX,BX,CX). Sedangkan pada
lingkungan Windows, kebutuhan akan segmensegmen memori tersebut tidak
efektif lagi. Karena pada lingkungan Win32 (Windows) hanya memiliki satu
model memori, yang bernama flat memory model. Selain itu pada lingkungan
pemrograman Win32 memiliki kapasitas register memori sebesar 32 bit (Extended
AX/EAX,EBX,ECX). Berikut ini adalah gambar ruang register memori pada
lingkungan Win32.
Gambar 2.1. Ruang Register Memori pada Lingkungan Win32
Pemrograman Win32Asm adalah suatu bentuk bahasa pemrograman di
lingkungan assembly yang memanfaatkan segala kelebihan aplikasi Win32 atau
yang lebih dikenal sebagai Windows 32 bit. Kelebihan-kelebihan yang dimiliki
bahasa pemrograman Win32Asm dibandingkan dengan bahasa tingkat tinggi
seperti bahasa C adalah sebagai berikut :
1. Hasil kompilasi program memiliki ukuran yang sangat kecil.
2. Program yang dihasilkan relatif sangat cepat saat dieksekusi.
3. Sangat mudah dalam berinteraksi dengan perangkat keras (hardware)
sehingga sangat cocok dalam pembuatan aplikasi driver / library. MASM32
(Microsoft Macro Assembler 32) merupakan salah satu kompiler bahasa
assembly 32 bit yang diproduksi oleh Microsoft.
MASM32 memiliki beberapa kelebihan yang tidak dimiliki oleh kompiler
lain seperti TASM (Borland Turbo Assembler) serta NASM, yaitu diantaranya
(Gunawan) :
1. MASM32 memiliki kemampuan bahasa tingkat tinggi ,yaitu adanya sintaks
perbandingan dan perulangan (looping) seperti “.IF, .ELSE, .ELSEIF,
.ENDIF, .REPEAT, .UNTIL, .WHILE, .ENDW, .BREAK, .CONTINUE “.
Contoh :
a. IF EAX == 1
XOR EAX,EAX
MOV EAX,ECX
.ENDIF
b. WHILE EAX!=0
INC ECX
DEC EAX
.ENDW
2. Adanya suatu fungsi pemanggil bernama INVOKE yang mempermudah
dalam pemanggilan fungsi / prosedur. Sintaksnya adalah : INVOKE
expression [,arguments]
Contoh :
a. INVOKE procedure, parameter1, parameter2, parameter3
Identik dengan bentuk :
PUSH parameter3
PUSH parameter3
PUSH parameter3
CALL procedure
b. INVOKE MessageBoxA, ADDR szMsg, ADDR szTitle, MB_OK
3. Adanya MACRO yang merupakan keunggulan utama dari MASM32.
MACRO tersebut sangat berguna dalam kecepatan oleh karena mendukung
adanya pemrosesan awal (pre processing) dari suatu atau beberapa kode
sebelum assembler menganalisa dan menterjemahkannya. Sintaksnya adalah :
name MACRO [parameter[:tag]]
[,parameter[:tag]]...]
[LOCAL varlist]
statements
[EXITM [textitem]]
ENDM
Berikut ini adalah kerangka struktur kode pemrograman MASM32 :
.386
.MODEL Flat, STDCALL
option casemap:none
.DATA
<Data yang sudah diinisialisasi>
......
.DATA?
< Data yang belum diinisialisasi nilainya>
......
.CONST
<nilai konstanta>
......
.CODE
<label>
<rutin kode>
.....
end <label>
Penjelasan untuk masing-masing baris sintaks adalah sebagai berikut :
1. .386
Merupakan kode direktif assembler yang menggunakan kompatibilitas serta
optimasi dari instruction set tipe prosesor Intel 80386. Beberapa kode direktif
yang dapat digunakan adalah “.386/.386p, .486/.486p, .586/586p“ serta
generasi prosesor Intel diatasnya, seperti Pentium. Kode p di belakang tipe
prosesor menunjukkan bahwa program yang dihasilkan memiliki
keistimewaan instruksi (priveleged instruction) serta biasanya digunakan
pada program driver (VxD – Virtual device Driver).
2. .MODEL Flat, STDCALL
.Model Flat adalah kode direktif assembler yang menunjukkan model
memori yang digunakan pada lingkungan Windows (Win32).
STDCALL adalah standarisasi pengiriman parameter-parameter fungsi
atau prosedur, yaitu dikirim dari kanan ke kiri (format bahasa C) atau
sebaliknya (format bahasa Pascal).
3. Option casemap:none
Berfungsi agar label-label bersifat case sensitive (adanya perbedaan antara
penggunaan huruf besar dan kecil).
4. .DATA
Berisi data-data yang telah di inisialisasi (initialized data).
5. .DATA?
Berisi data-data yang belum terinisialisasi (uninitialized data).
6. .CONST
Berisi deklarasi konstanta yang digunakan oleh program.
7. .CODE
Berisi kode-kode baik prosedur maupun fungsi yang berjalan pada program.
2.2. Child Window Controls
Windows telah menyediakan beberapa kelas window dan kebanyakan
mereka digunakan sebagai komponen dari suatu message box sehingga mereka
seringkali dijuluki child window controls (window controls anak). Child window
controls memproses pesan-pesan keyboard dan mouse dengan cara mereka sendiri
dan memberitahu window induk mereka ketika suatu keadaan (state) telah
berubah. Beberapa contoh dari kelas window adalah button, list box, check box,
radio button, edit box, dan sebagainya.
Untuk dapat menggunakan suatu child window controls, CreateWindow
atau CreateWindowEx harus diciptakan terlebih dahulu. Kelas window
tersebut tidak harus didaftarkan karena Windows telah melakukannya. Parameter
nama kelas harus diisi nama dari kelas yang telah ditetapkan tersebut. Apabila
programmer ingin menciptakan suatu tombol (button), programmer harus
menuliskan button sebagai nama kelas dalam CreateWindowEx. Parameter
lainnya harus diisi adalah handle ke window induk dan control ID. Control ID
haruslah bersifat unik di antara control sebab control ID adalah pengenal dari
suatu control. Anda menggunakan ID tersebut untuk membedakan antara sesama
control yang lain.
Setelah control tersebut diciptakan, ia akan mengirimkan pesan-pesan
yang memberitahukan bahwa keadaannya telah berubah kepada window induk-
nya. Biasanya, anda menciptakan beberapa window anak ketika pesan
WM_CREATE sedang diproses oleh window induk. Window anak mengirimkan
pesan WM_COMMAND beserta control ID-nya dalam nilai word bawah pada
wParam, kode pemberitahuan pada nilai word tinggi pada wParam, serta handle
dari window pada lParam. Window induk juga dapat mengirimkan pesan
perintah kepada window anak dengan memanggil fungsi SendMessage. Fungsi
SendMessage mengirimkan pesan yang telah ditentukan beserta nilai yang
terdapat dalam wParam dan lParam kepada window yang ditentukan oleh
handle window. Ini merupakan fungsi yang sangat berguna karena dia dapat
mengirimkan pesan ke window apapun yang anda ketahui handle-nya. Jadi,
setelah menciptakan window anak, window induk harus memroses pesan
WM_COMMAND agar dapat menerima kode pemberitahuan dari window anak.
III. IMPLEMENTASI PROGRAM
Secara garis besar program “9 Gambar Yang Bisa Mencerminkan
Kepribadian Anda” yang dibuat menampilkan sembilan buah gambar dengan
keterangan nomor masing-masing, satu edit box, dan satu button. Sebagai
gambaran umum mengenai sistem secara keseluruhan dapat dilihat pada gambar
3.1.
Gambar 3.1. Gambaran umum sistem
Selain dari gambaran umum tersebut, program yang dibuat juga memiliki
satu Menu yang terdiri atas submenu-submenu Petunjuk, Hapus, Hak Cipta, dan
Exit. Apabila user memilih submenu Petunjuk, maka program akan menampilkan
petunjuk dari penggunaan program 9 gambar yang bisa mencerminkan
kepribadian itu sendiri. Adapun submenu Hapus digunakan untuk
mengkosongkan kembali edit box setelah diberikan input. Sementara submenu
PROGRAM “9 GAMBAR YANG BISA MENCERMINKAN
KEPRIBADIAN” DENGAN MASM32
Input ?
Memasukkan salah satu nomor gambar yang
disukai dari 9 gambar yang bisa mencerminkan
kepribadian pada edit box, kemudian menekan
button OK.
Menampilkan keterangan kepribadian dari nomor
gambar yang telah dipilih.
Hak Cipta untuk menampilkan hak cipta dari program yang dibuat, dan submenu
Exit digunakan untuk mengakhiri atau keluar dari program
IV. PENGUJIAN DAN ANALISIS PROGRAM
4.1 Output
Tampilan Program “9 Gambar yang Bisa Mencerminkan Kepribadian”
dengan MASM32.
Gambar 4.1. Tampilan Program “9 Gambar yang Bisa Mencerminkan
Kepribadian” dengan MASM32
Setelah program berhasil ditampilkan, user dapat mengetahui petunjuk
penggunaan dari program “9 Karakter Yang Bisa Mencerminkan Kepribadian
Anda” tersebut dengan memilih submenu Petunjuk yang terdapat pada Menu.
Gambar 4.2. Petunjuk penggunaan
Setelah user mengetahui dan dapat memahami petunjuk penggunaan program,
user dapat keluar dari message box Petunjuk dengan menekan button OK ataupun
tanda close pada pojok kanan atas message box tersebut. Dilanjutkan dengan
memberikan input pada edit box berupa salah satu nomor yang dipilih dari
sembilan gambar yang ditampilkan, selanjutnya menekan button OK. Sebagai
contoh nomor yang dijadikan input adalah 1, maka akan muncul message box
sebagai berikut :
Gambar 4.3. Input nomor 1
Gambar 4.4. Contoh output dengan input 1 pada edit box
Apabila user hendak mengetahui keterangan kepribadian dari gambar yang
lain, user dapat langsung mengganti input nomor yang ada pada edit box sesuai
dengan nomor lain yang dikehendaki. Atau, user dapat terlebih dahulu
mengosongkan edit box tersebut dengan menggunakan submenu Hapus, kemudian
dan kemudian memberikan input nomor yang dikehendaki. Dan untuk keluar
ataupun mengakhiri program user dapat memilih submenu Exit ataupun memilih
close yang terdapat pada pojok kanan atas program.
4.2 Resource
#define IDB_MAIN 1#define IDM_TEXT 1#define IDM_CLEAR 2#define IDM_COPY 3#define IDM_GETTEXT 4#define IDM_EXIT 5
Beberapa baris di atas menjelaskan ID menu yang digunakan oleh script
menu.
IDB_MAIN BITMAP "image.bmp"
Mendeklarasikan nama file dari image yang akan ditampilkan.
FirstMenu MENU
Mendeklarasikan menu anda dengan kata kunci MENU
POPUP "&Menu"{
MENUITEM "Petunjuk",IDM_TEXTMENUITEM "Hapus",IDM_CLEARMENUITEM "Hak Cipta",IDM_COPYMENUITEM SEPARATORMENUITEM "E&xit",IDM_EXIT
}
Menciptakan menu popup dengan lima item menu sedangkan yang keempat
adalah pemisah menu.
4.3 Source Code
.386
.model flat,stdcalloption casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORDEditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
include \masm32\include\windows.incinclude \masm32\include\user32.inc
include \masm32\include\kernel32.incinclude \masm32\include\gdi32.incincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.libincludelib \masm32\lib\gdi32.lib
Tiga baris pertama adalah “keharusan”. .386 memberitahukan kepada
MASM bahwa instruksi-instruksi prosesor 80386 akan digunakan dalam program
ini. .model flat, stdcall memberitahukan kepada MASM bahwa model
pengalamatan yang digunakan adalah memori FLAT. Baris berikutnya
memberitahukan bahwa penulisan dalam kode sumber adalah case-sensitive. Dan
pada baris keempat adalah prototipe fungsi WinMain dan EditWndProc.
Karena belakangan WinMain dan EditWndProc akan digunakan, prototipe
fungsinya harus didefinisikan terlebih dahulu sehingga dapat di-invoke.
Selain itu harus disertakan file windows.inc di awal kode sumber. File
tersebut berisi struktur-struktur dan konstanta-konstanta penting yang digunakan
dalam program ini. File sertaan tersebut, windows.inc, adalah file text biasa.
kernel32.inc dan kernel32.lib digunakan karena dalam program ini
digunakan perintah GetModuleHandle, GetCommandLine,
GlobalAlloc, GlobalLock, ReadFile, CreateFile, dan
ExitProcess. Selain itu, juga ditambahkan gdi32.inc dan gdi32.lib
agar programmer dapat menggunakan perintah DeleteObject,
CreateCompatibleDC, SelectObject, BitBlt, dan DeleteDC
pada source code berikutnya.
.dataClassName db "SimpleWin32ASMBitmapClass",0AppName db " 9 Gambar Yang Bisa MencerminkanKepribadian Anda ",0MenuName db "FirstMenu",0ButtonClassName db "button",0ButtonText db "OK",0EditClassName db "edit",0Copyright db "Program ini dibuat untuk memenuhitugas mata kuliah Pemrograman Bahasa Assembler.Copyright © AYDAN 2011",0Copy db "Hak Cipta",0Direct db "c:\direct.txt",0Text db "Petunjuk",0
Result db "Kepribadian Anda",0Im1 db "c:\Gambar1.txt",0…Im9 db "c:\Gambar9.txt",0
.data?hFile HANDLE ?hMemory HANDLE ?pMemory DWORD ?ReadSize DWORD ?hInstance HINSTANCE ?CommandLine LPSTR ?hBitmap dd ?hwndButton HWND ?hwndEdit dd ?OldWndProcdd ?buffer db 512 dup(?)
Dalam .DATA, dideklarasikan dua buah zero-terminated string yaitu:
ClassName yaitu nama dari kelas window dan AppName yaitu nama dari
window. Dimana, kedua variabel tersebut diinisialisasikan sejak awal. Dalam
.DATA?, dua buah variabel dideklarasikan: hInstance (instance handle dari
program) dan CommandLine (baris perintah dari program kita). Tipe data yang
kurang dikenal, HINSTANCE dan LPSTR, merupakan nama lain untuk DWORD.
Semua variabel dalam bagian .DATA? tidak diinisialisasikan, sehingga mereka
mula-mula tidak berisi nilai apapun yang spesifik tetapi kita ingin mencadangkan
ruang untuk mereka untuk digunakan lebih lanjut belakangan.
.constMEMORYSIZE equ 65535ButtonID equ 1EditID equ 2IDB_MAIN equ 1IDM_TEXT equ 1IDM_CLEAR equ 2IDM_COPY equ 3IDM_GETTEXT equ 4IDM_EXIT equ 5
Menetapkan ID menu untuk digunakan pada window procedure. Nilai-
nilai tersebut harus sama dengan nilai yang telah ditetapkan di dalam file resource.
.codestart:
invoke GetModuleHandle, NULLmov hInstance,eaxinvoke GetCommandLinemov CommandLine,eaxinvoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULTinvoke ExitProcess,eax
.CODE berisi semua dari kode instruksi program. Instruksi pertama adalah
panggilan ke GetModuleHandle untuk menerima instance handle dari
program. Berikutnya adalah pemanggilan WinMain. WinMain menerima empat
buah parameter: instance handle dari program, instance handle dari instance
sebelumnya dari program, baris perintah, dan keadaan window saat pertama kali
ditampilkan. Setelah kembali dari WinMain, kini EAX berisi dengan kode exit.
Kode tersebut dilewatkan sebagai parameter kepada ExitProcess yang akan
menutup program kita.
LOCAL wc:WNDCLASSEXLOCAL msg:MSGLOCAL hwnd:HWND
Directive LOCAL menyediakan memori dari stack untuk variabel lokal
yang digunakan dalam fungsi. Kumpulan dari directive LOCAL harus berada tepat
di bawah directive proc. Directive LOCAL selalu diikuti dengan
<nama_variabel_lokal>:<tipe_variabel>. Jadi LOCAL wc:WNDCLASSEX
memberitahu kepada MASM untuk menyediakan memori dari stack dengan
ukuran struktur WNDCLASSEX untuk variabel bernama wc.
invoke CreateWindowEx, WS_EX_CLIENTEDGE, ADDRClassName, ADDR AppName,\WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\CW_USEDEFAULT,530,520,NULL,NULL,\hInst,NULL
mov hwnd,eax
Pada bagian WM_CREATE, diciptakan sebuah edit control. Parameter yang
menentukan koordinat x, y, adalah 530, 520, dan tinggi, serta lebar dari control
adalah nol. ShowWindow dipangggil untuk menampilkan edit control pada layar.
LOCAL ps:PAINTSTRUCTLOCAL hdc:HDCLOCAL hMemDC:HDC
LOCAL rect:RECT
Mereka adalah variabel lokal yang digunakan oleh fungsi-fungsi GDI
dalam bagian WM_PAINT. hdc digunakan untuk menyimpan handle ke device
context setelah kembali dari pemanggilan BeginPaint. ps adalah sebuah
struktur PAINTSTRUCT. ps hanya digunakan untuk dilewatkan pada fungsi
BeginPaint ketika client area selesai digambar. rect adalah sebuah struktur
RECT yang telah terdefinisi sebagai berikut:
RECT Structleft LONG ?top LONG ?right LONG ?bottom LONG ?
RECT ends
left dan top adalah koordinat dari pojok kiri atas dari sebuah
segiempat sedangkan right dan bottom adalah koordinat dari pojok kanan bawah
segiempat tersebut. Satu hal yang perlu diingat sumbu nol dari sumbu x-y client
area terletak pada pojok kiri atas. Sehingga titik y = 10 berada di bawah titik y =
0.
invoke LoadBitmap,hInstance,IDB_MAINmov hBitmap,eax
invoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDREditClassName,NULL,\WS_CHILD or WS_VISIBLE orWS_BORDER or ES_LEFT or\ES_AUTOHSCROLL,\220,370,100,25,hWnd,EditID,hInstance,NULL
Sebelum memanggil CreateWindowEx, LoadBitmap dipanggil
dengan instance handle dan sebuah pointer yang mengarah ke nama file image
tersebut. LoadBitmap mengembalikan handle dari menu dalam file resource
yang kelak dilewatkan pada fungsi CreateWindowEx.
.ELSEIF uMsg==WM_COMMANDmov eax,wParam
.IF lParam==0
Jika lParam bernilai 0 maka pesan WM_COMMAND yang sekarang adalah
berasal dari sebuah menu. wParam tidak bisa digunakan untuk membedakan
antara sebuah menu dan sebuah control karena bisa saja menu ID dan control ID
adalah sama serta kode pemberitahuannya mungkin bernilai 0.
.IF ax==IDM_TEXTinvoke CreateFile, addr Direct, GENERIC_READ,FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULLmov hFile, eaxinvoke GlobalAlloc, GMEM_MOVEABLE orGMEM_ZEROINIT, MEMORYSIZEmov hMemory, eaxinvoke GlobalLock, hMemorymov pMemory, eaxinvoke ReadFile, hFile, pMemory, MEMORYSIZE-1, addr ReadSize, NULLinvoke MessageBox, NULL, pMemory, addr Text,MB_OK
.ELSEIF ax==IDM_CLEARinvoke SetWindowText,hwndEdit,NULL
.ELSEIF ax==IDM_COPYinvoke MessageBox,NULL,ADDR Copyright,ADDRCopy,MB_OK
.ELSEinvoke DestroyWindow,hWnd
.ENDIF
Dalam window procedure, pesan WM_COMMAND diproses. Ketika suatu
item menu dipilih maka ID dari menu tersebut akan dikirim ke window procedure
melalui nilai word bawah dari wParam bersamaan dengan pesan WM_COMMAND.
Jadi ketika nilai wParam disimpan dalam EAX, nilai AX dibandingkan dengan
ID menu yang telah ditetapkan sebelumnya dan bereaksi sesuai dengan hasil
perbandingan tersebut. Dalam tiga kasus pertama, ketika item menu Petunjuk,
Hapus, dan Hak Cipta dipilih, hanya ditampilkan sebuah tulisan (string) dalam
message box. Untuk Petunjuk dan Hak Cipta, masing-masing tulisan yang
ditampilkan berasal dari file .txt yang disimpan pada direktori C:\. Ketika salah
satu file tersebut dibuka, sebuah blok memori dialokasikan untuk digunakan oleh
fungsi ReadFile dan WriteFile. Tanda (flag) GMEM_MOVEABLE untuk
mengizinkan Windows menggabungkan blok memori yang tersebar. Tanda (flag)
GMEM_ZEROINIT memberitahukan fungsi GlobalAlloc untuk mengisikan
blok memori yang baru saja dialokasikan dengan nilai 0. Ketika GlobalAlloc
berhasil kembali, EAX akan berisi handle ke blok memori yang dialokasikan.
Handle ini dilewatkan ke fungsi GlobalLock di mana ia akan mengembalikan
sebuah pointer ke blok memori. Ketika blok memori siap digunakan, fungsi
ReadFile dipanggil untuk membaca data dari file. Ketika sebuah file dibuka
atau diciptakan, pointer file berada pada offset 0. Jika item menu Exit dipilih,
DestroyWindow dipanggil dengan parameter handle kepada window sehingga
window akan ditutup.
.IF ax==ButtonIDshr eax,16.IF ax==BN_CLICKEDinvoke GetWindowText,hwndEdit,ADDR buffer,512
.IF ax==1mov eax,wParam.IF buffer=="1"
invoke CreateFile, addr Im1,GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
….IF buffer=="9"
invoke CreateFile, addr Im9,GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ENDIFmov hFile, eaxinvoke GlobalAlloc, GMEM_MOVEABLEor GMEM_ZEROINIT, MEMORYSIZEmov hMemory, eaxinvoke GlobalLock, hMemorymov pMemory, eaxinvoke ReadFile, hFile, pMemory,MEMORYSIZE-1, addr ReadSize, NULLinvoke MessageBox, NULL, pMemory,addr Result, MB_OK
.ENDIF.ENDIF
.ENDIF
Penggalan kode di atas berkaitan dengan kondisi saat terjadi penekanan
tombol mouse. Pertama ia akan memeriksa nilai word bawah dari wParam untuk
mengetahui apakah cocok dengan control ID dari button. Bila ya, maka ia akan
memeriksa nilai word tinggi dari wParam untuk mengetahui apakah itu
merupakan kode pemberitahuan BN_CLICKED yang dikirim ketika button
ditekan.
Setelah kode pemberitahuan BN_CLICKED diketahui, nomor yang
diinputkan pada edit box akan dicocokkan untuk menampilkan keterangan
kepribadian yang sesuai pada message box. Setelah sebuah file telah dipilih untuk
dibuka, dipanggil CreateFile untuk membuka file. Setelah file berhasil
dibuka, fungsi tersebut mengembalikan handle ke file yang dibuka yang mana
akan kita simpan pada variabel global untuk penggunaan lebih lanjut.
EditWndProc PROChEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
.IF uMsg==WM_CHARmov eax,wParam.IF (al>="1" && al<="9") || al==VK_BACKinvokeCallWindowProc,OldWndProc,hEdit,uMsg,eax,lParamret
.ENDIF
Dalam EditWndProc, pesan-pesan WM_CHAR disaring. Jika karakter
yang diketikkan adalah antara 1-9, edit box menerimanya dengan melewatkan
pesan tersebut ke window procedure yang sebenarnya. Dan jika karakter yang
diketikkan bukan yang diinginkan, edit box akan mengabaikannya. karakter yang
tidak sesuai tidak akan dilewatkan ke window procedure yang asli. Jadi ketika
user mengetikkan sesuatu kecuali karakter 1-9, karakter tersebut tidak akan
ditampilkan pada edit box.
end start
Program diakhiri.
V. KESIMPULAN
Dari hasil proses pembuatan, pengujian serta analisis program ini, maka
dapat ditarik kesimpulan bahwa program telah sesuai dengan tujuan yang
diharapkan, yaitu dengan terpenuhinya hasil dari masing-masing pengujian
(message box yang dihasilkan menampilkan keterangan kepribadian yang sesuai
dengan nomor gambar yang dijadikan input).
DAFTAR PUSTAKA
Gunawan, Salmon. Pemrograman Aplikasi Proteksi File Executable Berbasiskan
(Portable Executable) Dengan Menggunakan Kompiler Masm 32 (Microsoft
Macro Assembler 32). Makalah Tugas Akhir: Teknik Elektro UNDIP.
Iczelion. 2011. MASM32 Tutorial.
http://203.148.211.201/iczelion/index.html
Diakses pada 13 November 2011
LAMPIRAN
Source Code
; aydan; tugas besar pemrograman bahasa assembler
.386 ; direktif untukmenggunakan instruksi asm untuk arsitektur 32 bit.model flat,stdcall ; menggunakan register32 bit, offset 32 bit,
; semua data dan kodedalam 32 bit segment.
; parameter passinguntuk fungsi dari kiri ke kananoption casemap:none ; menonaktifkan casesensitif
include \masm32\include\windows.incinclude \masm32\include\user32.inc ; memanggil fungsidalam user32.libinclude \masm32\include\kernel32.incinclude \masm32\include\gdi32.incincludelib \masm32\lib\user32.libincludelib \masm32\lib\kernel32.lib ; dan kernel32.libincludelib \masm32\lib\gdi32.lib
WinMain proto :DWORD,:DWORD,:DWORD,:DWORDEditWndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.data ; data yangterinisialisasiClassName db "SimpleWin32ASMBitmapClass",0AppName db " 9 Gambar Yang Bisa Mencerminkan Kepribadian Anda",0MenuName db "FirstMenu",0ButtonClassName db "button",0ButtonText db "OK",0EditClassName db "edit",0Copyright db "Program ini dibuat untuk memenuhi tugas mata kuliahPemrograman Bahasa Assembler. Copyright © AYDAN 2011",0Copy db "Hak Cipta",0Direct db "c:\direct.txt",0Text db "Petunjuk",0Result db "Kepribadian Anda",0Im1 db "c:\Gambar1.txt",0Im2 db "c:\Gambar2.txt",0Im3 db "c:\Gambar3.txt",0Im4 db "c:\Gambar4.txt",0Im5 db "c:\Gambar5.txt",0Im6 db "c:\Gambar6.txt",0Im7 db "c:\Gambar7.txt",0Im8 db "c:\Gambar8.txt",0Im9 db "c:\Gambar9.txt",0.data? ; data yang belum
terinisialisasihFile HANDLE ?
hMemory HANDLE ?pMemory DWORD ?ReadSize DWORD ?hInstance HINSTANCE ?CommandLine LPSTR ?hBitmap dd ?hwndButton HWND ?hwndEdit dd ?OldWndProc dd ?buffer db 512 dup(?)
.constMEMORYSIZE equ 65535ButtonID equ 1EditID equ 2IDB_MAIN equ 1IDM_TEXT equ 1IDM_CLEAR equ 2IDM_COPY equ 3IDM_GETTEXT equ 4IDM_EXIT equ 5
.codestart:
invoke GetModuleHandle, NULLmov hInstance,eaxinvoke GetCommandLinemov CommandLine,eaxinvoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULTinvoke ExitProcess,eax ; keluar dari program.
kode keluar (exit code); dikembalikan dalam
EAN dari WinMain
; pemanggilan fungsi utamaWinMain prochInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX ; menciptakan variabellokal dalam tumpukan (stack)
LOCAL msg:MSGLOCAL hwnd:HWNDmov wc.cbSize,SIZEOF WNDCLASSEXmov wc.style, CS_HREDRAW or CS_VREDRAWmov wc.lpfnWndProc, OFFSET WndProcmov wc.cbClsExtra,NULLmov wc.cbWndExtra,NULLpush hInstpop wc.hInstancemov wc.hbrBackground,COLOR_BTNFACE+1mov wc.lpszMenuName,OFFSET MenuNamemov wc.lpszClassName,OFFSET ClassNameinvoke LoadIcon,NULL,IDI_APPLICATIONmov wc.hIcon,eaxmov wc.hIconSm,eaxinvoke LoadCursor,NULL,IDC_ARROWmov wc.hCursor,eaxinvoke RegisterClassEx, addr wc ; mendaftarkan kelas
window
invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR ClassName,ADDRAppName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\CW_USEDEFAULT,530,520,NULL,NULL,\hInst,NULL
mov hwnd,eaxinvoke ShowWindow, hwnd,SW_SHOWNORMAL ; menampilkan window
pada desktopinvoke UpdateWindow, hwnd ; refresh client area.WHILE TRUE ; masuk dalam
perulangan pesanINVOKE GetMessage, ADDR msg,NULL,0,0.BREAK .IF (!eax)INVOKE TranslateMessage, ADDR msgINVOKE DispatchMessage, ADDR msg
.ENDWmov eax,msg.wParamret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAMLOCAL ps:PAINTSTRUCTLOCAL hdc:HDCLOCAL hMemDC:HDCLOCAL rect:RECT.IF uMsg==WM_DESTROY
invoke DeleteObject,hBitmapinvoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_CREATEinvoke LoadBitmap,hInstance,IDB_MAINmov hBitmap,eaxinvoke CreateWindowEx,WS_EX_CLIENTEDGE, ADDR
EditClassName,NULL,\WS_CHILD or WS_VISIBLE or WS_BORDER or ES_LEFT or\ES_AUTOHSCROLL,\220,370,100,25,hWnd,EditID,hInstance,NULL
mov hwndEdit,eaxinvoke SetFocus, hwndEdit;-----------------------------------------; Subclass it!;-----------------------------------------invoke SetWindowLong,hwndEdit,GWL_WNDPROC,addr
EditWndProcmov OldWndProc,eaxinvoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR
ButtonText,\WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\240,410,60,25,hWnd,ButtonID,hInstance,NULL
mov hwndButton,eax.ELSEIF uMsg==WM_PAINT
invoke BeginPaint,hWnd,addr psmov hdc,eaxinvoke CreateCompatibleDC,hdcmov hMemDC,eaxinvoke SelectObject,hMemDC,hBitmapinvoke GetClientRect,hWnd,addr rectinvoke
BitBlt,hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPYinvoke DeleteDC,hMemDC
invoke EndPaint,hWnd,addr ps.ELSEIF uMsg==WM_COMMAND
mov eax,wParam.IF lParam==0
.IF ax==IDM_TEXTinvoke CreateFile, addr Direct,
GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULLmov hFile, eaxinvoke GlobalAlloc, GMEM_MOVEABLE or
GMEM_ZEROINIT, MEMORYSIZEmov hMemory, eaxinvoke GlobalLock, hMemorymov pMemory, eaxinvoke ReadFile, hFile, pMemory,
MEMORYSIZE-1, addr ReadSize, NULLinvoke MessageBox, NULL, pMemory, addr
Text, MB_OK.ELSEIF ax==IDM_CLEAR
invoke SetWindowText,hwndEdit,NULL.ELSEIF ax==IDM_COPY
invoke MessageBox,NULL,ADDR Copyright,ADDRCopy,MB_OK
.ELSEinvoke DestroyWindow,hWnd
.ENDIF.ELSE
.IF ax==ButtonIDshr eax,16.IF ax==BN_CLICKED
invoke GetWindowText,hwndEdit,ADDRbuffer,512
.IF ax==1mov eax,wParam.IF buffer=="1"
invoke CreateFile, addr Im1,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ELSEIF buffer=="2"invoke CreateFile, addr Im2,
GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL.ELSEIF buffer=="3"
invoke CreateFile, addr Im3,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ELSEIF buffer=="4"invoke CreateFile, addr Im4,
GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL.ELSEIF buffer=="5"
invoke CreateFile, addr Im5,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ELSEIF buffer=="6"invoke CreateFile, addr Im6,
GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL.ELSEIF buffer=="7"
invoke CreateFile, addr Im7,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ELSEIF buffer=="8"invoke CreateFile, addr Im8,
GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL.ELSEIF buffer=="9"
invoke CreateFile, addr Im9,GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL
.ENDIFmov hFile, eaxinvoke GlobalAlloc, GMEM_MOVEABLE
or GMEM_ZEROINIT, MEMORYSIZEmov hMemory, eaxinvoke GlobalLock, hMemorymov pMemory, eaxinvoke ReadFile, hFile, pMemory,
MEMORYSIZE-1, addr ReadSize, NULLinvoke MessageBox, NULL, pMemory,
addr Result, MB_OK.ENDIF
.ENDIF.ENDIF
.ENDIF.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam ;proses pesan default
ret.ENDIFxor eax,eaxret
WndProc endp
EditWndProc PROC hEdit:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD.IF uMsg==WM_CHAR
mov eax,wParam.IF (al>="1" && al<="9") || al==VK_BACK
invokeCallWindowProc,OldWndProc,hEdit,uMsg,eax,lParam
ret.ENDIF
.ELSEinvoke
CallWindowProc,OldWndProc,hEdit,uMsg,wParam,lParamret
.ENDIF