Pembuatan Program “9 Gambar Yang Bisa Mencerminkan Kepribadian Anda” Dengan MASM32 (Microsoft...

24
MAKALAH TUGAS BESAR PEMROGRAMAN BAHASA ASSEMBLER PEMBUATAN PROGRAM 9 GAMBAR YANG BISA MENCERMINKAN KEPRIBADIAN ANDADENGAN 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

description

Bahasa Pemrograman Assembly

Transcript of Pembuatan Program “9 Gambar Yang Bisa Mencerminkan Kepribadian Anda” Dengan MASM32 (Microsoft...

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

xor eax,eaxret

EditWndProc endp

end start

; offset : untuk mendapatkan alamat memori dari variabel global; addr : untuk mendapatkan alamat memori dari variabel global danlokal