P. 1
6866569 Tutorial Pemrograman Bahasa C Dan Assembly

6866569 Tutorial Pemrograman Bahasa C Dan Assembly

|Views: 17|Likes:
Published by Ambar Jati Waluyo

More info:

Published by: Ambar Jati Waluyo on Dec 24, 2012
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as DOC, PDF, TXT or read online from Scribd
See more
See less

09/07/2013

pdf

text

original

Tutorial Pemrograman Bahasa C dan Assembly

oleh Darmawan MS a.k.a Pinczakko Daftar Isi

• •

Pengetahuan Dasar Pemrograman Assembly dan C Pemrograman Bahasa C o Alasan Penggunaan Bahasa C o Pengenalan Sintaks Bahasa C

o •

Lebih Lanjut Tentang Fungsi Arsitektur Driver Windows 2000/XP

            

Preprocessor dan Macro Compiler Linker Pernyataan Variabel Operator Percabangan Perulangan Fungsi dan Struktur Program C Fungsi untuk Input dan Output Pointer dan Array Struct dan Union

Pemrograman Bahasa Assembly o Arsitektur Microprocessor x86

o o • • •

Arsitektur x86 Modern Sintaks Bahasa Assembly x86 Program Assembly Sederhana

  

Arsitektur Dasar Mode Kerja Microprocessor x86

Penggunaan Assembly dan C dalam satu Program Beberapa Sumber Informasi Credits

Artikel ini pada dasarnya adalah follow up dari artikel Tutorial Membuat Patch dalam Bentuk Driver pada Windows 2000/XP. Sebagian source code yang akan dipelajari pada tulisan ini adalah source code dari artikel tersebut. Tujuan pembuatan tutorial ini adalah 'Bringing System Level Programming to the Mass'. Tutorial ini sendiri akan terbagi menjadi dua bagian besar, yaitu pemrogaman bahasa C dan pemrograman bahasa assembly, namun pada bagian akhir akan kita bahas penggunaan bahasa assembly yang terintegrasi dalam sebuah source code bahasa C, yang lazim disebut inline assembly. Penulis mengikutsertakan bagian yang agak "advanced" ini karena pada source code Tutorial Membuat Patch dalam bentuk Driver pada Windows 2000/XP teknik ini dimanfaatkan. Perlu anda ketahui bahwa bahasa assembly yang akan dibahas pada tulisan ini adalah bahasa assembly untuk arsitektur hardware x86(PC) dan tidak dapat diaplikasikan pada arsitektur hardware lainnya. Petunjuk: Bagi yang sudah pernah menggunakan bahasa C sebelumnya, penulis menyarankan untuk langsung

membaca bagian Pointer dan Array , kemudian bagian Struct dan Union dan dilanjutkan sampai bagian akhir Pemrograman C.

Pengetahuan Dasar Pemrograman C dan Assembly
Bagian ini diperuntukkan bagi pembaca yang masih belum mengetahui pemrograman sama sekali atau yang sudah tahu tetapi ingin menyegarkan kembali ingatannya. Kita akan memulai dengan sistem bilangan yang digunakan pada komputer. Komputer hanya mengenal nilai 0 dan 1, oleh karena itu digunakanlah beberapa sistem bilangan untuk mempermudah. Sistem bilangan tersebut antara lain:

1. 2. 3.

Bilangan Biner (binary), yaitu bilangan basis 2, sehingga nilai yang dikenal hanya 0 dan 1. Contoh : 101biner bernilai sama dengan 5desimal, sebab 101biner = 1 x 20 + 0 x 21 + 1 x 22 atau 5desimal. Operasi matematis lainnya sama dengan bilangan desimal, hanya di sini bilangan yang digunakan adalah basis 2. Bilangan Oktal (octal), yaitu bilangan basis 8, sehingga nilai yang dikenal hanya 0 s/d 7. Contoh : 072octal (prefix 0 digunakan pada bahasa pemrograman C) bernilai sama dengan 58desimal, sebab 072octal = 2 x 80 + 7 x 81 atau 58desimal. Operasi matematis lainnya sama dengan bilangan desimal, hanya di sini bilangan yang digunakan adalah basis 8. Bilangan Heksadesimal (Hexadecimal), yaitu bilangan basis 16, sehingga nilai yang dikenal hanya 0 s/d 9 dan huruf A s/d F melambangkan 10desimal s/d 15 desimal. Contoh : 0x72hexadecimal (prefix 0x digunakan pada bahasa pemrograman C) bernilai sama dengan 114desimal, sebab 0x72hexadecimal = 2 x 160 + 7 x 161 atau 114desimal. Operasi matematis lainnya sama dengan bilangan desimal, hanya di sini bilangan yang digunakan adalah basis 16. Ada satu hal yang perlu anda perhatikan, yaitu konversi dari bilangan biner ke hexadecimal adalah suatu operasi yang "agak natural", sebab anda tinggal memecah bilangan hexadecimal tersebut menjadi elemen-elemennya kemudian setiap elemen direpresentasikan dengan 4 bilangan biner, maka anda telah memperoleh bilangan biner yang bernilai sama dengan bilangan hexadecimal tersebut. Contoh: 0xA2 = ... biner, solusi: pertama pecah menjadi elemennya , kita peroleh A dan 2. A jika direpresentasikan dalam 4 angka biner adalah 1010 (10desimal) dan 2 jika direpresentasikan dalam 4 angka biner adalah 0010 sehingga kita peroleh 0xA2 = 1010 0010 biner. Kemudahan operasi ini akan membantu anda saat berurusan dengan pemrograman yang mengolah informasi bilangan biner, jadi sangat perlu untuk dipahami.

Pemrograman atau programming secara umum dilakukan untuk membuat sekumpulan instruksi yang dapat dieksekusi (dijalankan) pada komputer. Jadi, instruksi-instruksi yang dapat dijalankan (executable) tersebut merupakan hasil akhir yang kita inginkan. Kumpulan instruksi-instruksi itulah yang disebut software. Instruksi yang dihasilkan biasanya hanya dapat dieksekusi pada satu arsitektur komputer. Instruksi yang dimaksud adalah "machine code" atau "bahasa mesin", bahasa mesin ini tidak lebih dari kumpulan bit-bit 0 dan 1 yang dapat dipahami oleh sebuah komputer. Perbedaan satu arsitektur komputer (misalnya x861) dengan arsitektur lain (misalnya Sparc2) adalah bagaimana bit-bit tersebut diorganisasikan, hal inilah yang menyebabkan machine code untuk satu macam arsitektur tidak dapat dieksekusi pada arsitektur yang lain. Prosesnya kira-kira seperti ini:

Pembuatan Machine Code --> Machine Code --> Eksekusi pada Komputer
Catatan: 1 x86 adalah keluarga microprocessor yang digunakan oleh para pemakai PC, yang termasuk ke dalam keluarga ini antara lain: Intel 80286, 80386, 80486, Pentium (i586), PentiumPro (i686),Pentium 4 (i786); AMD K6, K6-2, K6-3, Athlon (K7), Duron; Via Cyrix III; Transmeta Crusoe, dan lain-lain. 2 Sparc adalah keluarga microprocessor yang digunakan pada Server-server Sun Microsystem, yang termasuk ke dalamnya antara lain: UltraSparc II, IIIi, III. Teknik pemrograman merupakan teknik yang digunakan untuk menghasilkan kumpulan machine code tadi. Ketika komputer digital pertama kali muncul (komputer ENIAC), untuk membuat program, orang harus langsung memasukkan bit-bit machine code tadi ke dalam komputer melalui pengaturan saklarsaklar dan punch cards (kartu yang dilubangi). Perkembangan selanjutnya adalah orang tidak perlu lagi pusing dengan bit-bit program yang sangat mudah salah (sebab anda langsung bekerja dengan angka 0 dan 1 dalam jumlah yang sangat besar), muncul lah apa yang disebut assembler, yaitu program yang dapat mengubah token-token (potongan kata-kata tertentu yang dapat dipahami oleh assembler)

sederhana menjadi machine code. Karena adanya assembler, orang mulai mengenal apa yang dinamakan bahasa assembly, yaitu bahasa yang menggunakan token-token yang dapat dikenali oleh assembler, jadi bahasa assembly satu level lebih maju dibanding bahasa mesin atau machine code. Sejak saat inilah orang mulai mengenal apa yang dikatakan source code , yaitu bentuk program yang belum diolah oleh sebuah bahasa pemrograman menjadi bentuk yang dapat dieksekusi pada komputer. Source code biasanya berbentuk file yang dapat di edit. Perlu anda ketahui, bahwa saat ini pun anda dapat memprogram dalam machine code jika anda memang benar-benar menginginkannya. Caranya mudah, anda tinggal mencari program hexeditor, misalnya Hexworkshop kemudian membuat file yang berisi machine code dalam hexadesimal (bilangan basis 16). Penulis beberapa kali melakukan hal ini karena belum mampu menggunakan assembler dengan baik (output file biner yang dihasilkan oleh assembler tidak sesuai dengan yang diharapkan). Sebenarnya jika anda membaca dan mencoba trik ke-3 pada artikel Trik Modifikasi Bios, anda telah memprogram dengan menggunakan machine code untuk microprocessor keluarga x86. Jadi, cukup mudah bukan :). Dalam tutorial ini kita akan belajar tentang assembler. Assembler pada dasarnya bekerja dengan cara "mencocokkan (matching)". Setiap baris perintah yang anda tulis dalam bahasa assembly akan di asosiasikan dengan satu machine code tertentu, sehingga pada assembler setiap baris perintah yang anda ketikkan akan menghasilkan satu machine code. Jadi jika anda menggunakan assembler, prosesnya akan kurang lebih seperti ini (tentang linker akan dijelaskan lebih lanjut):

Pembuatan Source Code Assembly | V Source Code Assembly | V Assembler | V library,object file--> Linker | V Machine Code | V Eksekusi pada komputer
Perkembangan selanjutnya adalah bahasa tingkat menengah, yaitu bahasa pemrograman C. Pada bahasa pemrograman ini, machine code dihasilkan melalui tahap yang lebih panjang. Mungkin anda bertanya, kalau orang sudah bisa membuat program dengan assembler, mengapa harus ada bahasa C ? , jawabannya adalah bahasa assembly masih terlalu "machine oriented", sukar dipahami dan bahasanya lebih dekat kepada machine code daripada ke bahasa manusia, alasan lain adalah karena dengan membuat bahasa yang levelnya lebih tinggi (lebih dekat ke bahasa manusia) maka pengembangan perangkat lunak (software) akan lebih cepat, masih ada satu alasan lagi dan mungkin yang terpenting yaitu bahasa assembly hanya dapat dieksekusi oleh satu macam arsitektur komputer saja seperti yang disebutkan sebelumnya. Jika kita dapat membuat program yang dapat berjalan di berbagai macam arsitektur komputer maka itu akan mempercepat pengembangan software. Namun demikian, itu tidak berarti bahwa setiap program yang ditulis dengan bahasa C akan dapat berjalan pada semua mesin. Misalnya, program driver yang di buat pada Tutorial Membuat Patch ... yang akan kita bahas adalah program C yang tidak portable (dapat digunakan pada komputer dengan arsitektur yang berbeda), karena tidak dapat dieksekusi di luar arsitektur komputer x86 yang menggunakan system bus PCI compliant. Software yang dijamin portable biasanya adalah software yang tidak mengutak-atik sistem, atau yang menggunakan API(Application Programming Interface) standar dan tersedia di berbagai arsitektur komputer misalnya software yang menggunakan OpenGL atau yang dibuat dengan kriteria ANSI C.

Berikut ini adalah langkah-langkah pembuatan program dengan bahasa C (tentang preprocessor, compiler & linker akan dijelaskan lebih lanjut):

Pembuatan Source Code C | V Source Code C | V Preprocessor | V Compiler | V Assembler | V library,object file--> Linker | V Machine Code | V Eksekusi pada komputer

Inilah garis besar dari apa yang harus kita lakukan untuk menghasilkan sebuah program dalam bahasa C. Anda tidak perlu khawatir dengan langkah-langkah yang begitu banyak, sebab dalam sebagian besar kasus, kita hanya perlu membuat source code kemudian tools programming yang kita gunakan akan mengerjakan langkah -langkah selanjutnya sampai sebuah file executable dihasilkan. Bahasa pemrograman yang lain sebagian besar melakukan pembuatan program seperti C namun dengan beberapa langkah tambahan, tetapi ada juga bahasa pemrograman yang menggunakan cara yang agak berbeda, misalnya Java. Untuk mengetahui bagaimana cara kerja bahasa tingkat tinggi lainnya anda perlu membaca buku atau tutorial dalam bahasa yang bersangkutan.

Pemrograman Bahasa C
Setelah membaca ulasan di atas, selnjutnya kita akan membahas tentang bahasa C. Bahasa ini adalah salah satu bahasa pemrograman yang andal dan banyak digunakan. Seperti yang telah disebutkan sebelumnya, bahasa C dapat berjalan pada berbagai platform, jadi dengan mempelajari bahasa ini, pengetahuan yang anda proleh dapat digunakan untuk mmeprogram di komputer dengan arsitektur selain x86.

Alasan Penggunaan Bahasa C
Bahasa C saat ini masih merupakan bahasa pemrograman yang banyak digunakan dan powerful. Sebelum melangkah lebih jauh, penulis akan menjelaskan beberapa alasan penggunaan bahasa C.

" akan membuat preprocessor mencari file yang namanya dicantumkan di dalam tanda petik ganda pada direktori file yang . Preprocessor pada dasarnya menerjemahkan source code yang kita buat ke bentuk yang dapat dikenali oleh compiler. sebab dalam tutorial ini akan dijelaskan prinsip dasarnya. namun demikian. Perlu diketahui bahwa Windows saat ini belum merupakan sistem operasi yang benar-benar object oriented (C++ adalah bahasa pemrograman yang object oriented) dan "core" dari sistem operasinya sendiri masih diimplementasikan dalam bahasa C. Keyword yang diolah oleh preprocessor antara lain: Catatan: 3 Preprocessor juga ada dalam bahasa lain. #include. Pada bagian ini akan di bahas beberapa sintaks yang umum digunakan dalam bahasa C..h > akan membuat preprocessor mengekspansikan file stdio. Preprocessor dan Macro Preprocessor3 adalah bagian dari sebuah software development tool4 untuk bahasa C yang bertugas untuk melakukan pengolahan source code sebelum diberikan kepada compiler untuk diolah lebih lanjut. Borland C++ Builder. Pengenalan Sintaks Bahasa C Sintaks adalah suatu bentuk dasar (biasanya kata) yang dapat dipahami dan diolah oleh compiler.. tetapi yang kita maksud di sini adalah preprocessor untuk bahasa C. INCLUDE. dibuat dengan C++. ada beberapa keyword5 yang sebenarnya tidak dikenali oleh compiler. kemudian membandingkan kinerjanya. namun dukungan ofisial dari microsoft untuk penggunaan C++ pada kasus yang disebutkan sebelumnya belum ada sehingga anda harus membuat semacam "wrapper" sendiri jika ingin menggunakan C++ dan hal ini sulit dilakukan bagi pemrogram pemula. Misalnya: #include < stdio. Var. umumnya keyword ini diawali dengan #. cara ini juga merupakan salah satu cara yang cukup sulit bagi para pemrogram pemula.." . Sebagai contoh. ternyata software yang diimplementasikan dengan C memiliki kinerja yang lebih tinggi. #include <. #include mempunyai dua macam bentuk yaitu #include <. namun C++ merupakan bahasa yang terbanyak digunakan untuk memudahkan pemeliharaan dan pengembangan. 5 Kata-kata yang mempunyai arti khusus dan digunakan secara internal oleh compiler. kita tidak dapat atau sangat sulit menggunakan bahasa pemrograman selain C. software ExploChip pada artikel Tutorial Membuat Patch. titik-titik tersebut adalah nama file. Dalam bahasa C..1. Kelemahan dari bahasa C yang penulis ketahui sampai saat ini adalah dari segi kompleksitas pemeliharaan dan pengembangan software yang kita buat.... namun anda tidak perlu khawatir. yaitu C "murni" dan C++ . hal ini bisa dicapai dengan mudah jika kita menggunakan bahasa pemrograman yang "sederhana" seperti C. keyword inilah yang diolah oleh preprocessor. sehingga fleksibilitas terbesar dalam membuat software untuk windows akan kita peroleh jika kita menggunakan bahasa C. misalnya pada direktory INC. Visual C++. misalnya untuk mengaplikasikan sebuah User Interface yang belum memiliki dukungan library untuk C++ pada visual C++ atau dalam pembuatan driver. #pragma dan lainlain. selain itu akan dijelaskan bagaimana cara kerja compiler C secara umum. Sebelum melangkah lebih jauh.direktori yang telah didefinisikan oleh software development tool yang kita gunakan. dan VAR adalah tiga hal yang berbeda pada bahasa C. 3. sehingga var.h pada tempat keyword #include tadi diketikkan. Preprocessor merupakan salah satu bagian Software Development Tool yang tergantung kepada vendor yang membuat tool tersebut. Penulis menyebutkan sangat sulit berarti tidak menutup kemungkinan menggunakan bahasa lain. #include.> akan membuat preprocessor mencari file yang namanya dicantumkan di dalam kurung pada direktori.> dan #include ". bahasa lain tersebut adalah C++. #define. #include ". Beberapa software membutuhkan kinerja yang tinggi dari segi kecepatan. Dalam beberapa aplikasi pemrograman pada sistem operasi windows. dan lain-lain. 2. jika software tersebut sudah cukup kompleks. Namun demikian. 4 Software development Tool misalnya Turbo C. keyword ini membuat kita seakan-akan telah mengetik isi dari file yang dicantumkan sesudah keyword tersebut.. kita akan membahas beberapa keyword yang umum diolah oleh preprocessor (telah di standarisasi). C dan Assembly. GNU C dan lain-lain yang dapat mengolah source code C.. Penulis sendiri telah membuat beberapa software dalam dua versi. perlu anda ketahui bahwa C adalah bahasa pemrograman yang case sensitive. misalnya #macro..

b) ((a)*(b)) 20. expression adalah sebuah ekspresi yang valid (dapat diolah oleh compiler). Preprocessor akan mengganti setiap kemunculan identifier dengan nilai pada token-string... Contoh: makro #define a ((c)*(d)) akan mengganti setiap kemunculan a dengan nilai hasil perkalian variabel c dan d. #define.z) berubah menjadi ((y)*(z)) sehingga diperoleh 20x90 = 1800. yang akan diolah terlebih dulu adalah perkalian a dan b. keyword ini mempunyai format: #define identifier token-stringopt. Keyword ini harus digunakan bersama dengan keyword #endif untuk menandakan batas penggunaan keyword tersebut dalam source code. #if. sebab ada yang disebut dengan operator precedence.c yang ada pada direktori bernama test. maka preprocessor akan mencari file test. token-string dapat merupakan sebuah ekspresi6.memiliki keyword #include tersebut. Jika token-string dikosongkan. memindahkan nilai ke dalam suatu objek atau fungsi (fungsi akan dijelaskan lebih lanjut). int adalah tipe data variabel. dan anda mengetikkan #include "test. Saat preprocessor menemukan ekspresi kali(y. ekspresi ini kemudian diolah oleh compiler.. kali(y. Identifier adalah nama sebuah konstanta yang akan kita gunakan dalam program kita. Tanda kurung yang banyak untuk memastikan bahwa makro kita dieksekusi sesuai dengan yang kita inginkan. . kemudian hasilnya dijumlahkan dengan c. Formatnya adalah : #if expression . Jika pada #define identifier token-stringopt.z). tokenstring merupakan sebuah ekspresi.h". Misalnya: a*b+c . maka identifier tersebut disebut sebagai makro. 90. Makro akan diolah preprocessor. baris source code..z) .z). int y = int z = int x = kali(a. Pada source code di atas. maka nilai y dan z dari baris-baris sebelumnya akan menggantikan y dan z pada kali(y. Contoh: #define a 0xff akan membuat setiap kemunculan a dalam program.. pada ekspresi ini. atau menghasilkan efek samping (misalnya membuat sebuah baris program dieksekusi atau tidak). sampai dengan keyword #endif. yaitu urutan pengerjaan operator jika berbagai operator muncul dalam sebuah pernyataan. Contoh: #define TEST 2 #if (TEST > 0) . -. dll) dan operand (variabel yang dikenai operasi) yang mengerjakan salah satu kombinasi aktivitas berikut: Menghitung nilai. setiap kemunculan identifier pada source code yang akan diganti dengan ekspresi token-string (jika baris source code tsb tidak mengandung # sebagai karakter pertamanya). Jika ekspresi tersebut benar maka baris-baris source code sesudah #if akan diolah dan sebaliknya jika ekspresi tersebut bernilai salah. Berikut ini contohnya: #define . Dengan demikian penggunaan a pada baris-baris selanjutnya adalah ilegal (compiler akan memberikan pesan kesalahan saat program di buat/ di-compile). identifier menjadi tidak dikenali sebab tidak memiliki nilai lagi). Misalnya anda mengerjakan file test. dan jika sesudah baris Function1(a) ada baris #define a . maka identifier tadi akan hilang dari source code program kita (pada baris-baris selanjutnya. kemudian kali(y. keyword ini digunakan untuk menentukan pengolahan baris-baris source code sesudahnya. makro dapat mempunyai parameter(nilai input). Catatan: 6 Ekspresi adalah sekumpulan operator (misalnya +. misalnya Function1(a) diganti dengan 0xff (255 desimal). maka a sudah tidak akan dikenali lagi pada bagian selanjutnya.h pada direktori test. kemudian hasil ini dipindahkan ke x (tanda = artinya pindahkan nilai di sebelah kanan tanda ini ke variabel yang ada di sebelah kiri tanda ini). dan token-string adalah nilai dari identifier tersebut (nilai ini harus dapat dikenali oleh compiler). kita akan belajar lebih lanjut tentang hal ini.

#else . identifier adalah sebuah konstanta. baris source code akan diolah sebab ekspresi TEST > 0 adalah benar. #ifdef. #ifndef dengan keyword #endif. sesuai dengan tipe arsitektur yang kita pilih (dengan menggunakan switch tersebut). Keyword ini harus digunakan bersama dengan keyword #endif untuk menandakan batas penggunaan keyword tersebut dalam source code #ifndef.baris program sesudahnya justru diolah jika identifier tidak didefinisikan sebelumnya. #endif Pada potongan program diatas. #ifdef.demikian pula sebaliknya. akan diolah sebab ekspresi TEST > 0 adalah salah.#endif Pada potongan program diatas. Linker juga mempunyai fungsi lain.. yang bertugas menerjemahkan source code yang telah diolah oleh prepocessor menjadi bahasa assembly yang selanjutnya akan diolah oleh assembler untuk dijadikan machine code yang dapat dieksekusi. tidak akan dieksekusi. Sebuah file yang dapat dieksekusi mempunyai format header tertentu. Jika identifier telah didefinisikan sebelumnya (dengan keyword #define) maka baris-baris source code sesudah #ifdef akan diolah oleh kompiler. dan dari satu sistem operasi ke sistem operasi yang lain formatnya berbeda-beda. keyword ini penggunaannya sama dengan #if.. Jika ekspresi pada keyword #if. compiler akan menghasilkan file assembly yang berbeda. baris source code2. #ifdef. Keyword ini harus digunakan bersama dengan keyword #endif untuk menandakan batas penggunaan keyword tersebut dalam source code #endif . Bahasa C dikatakan sebagai bahasa pemrograman yang portable. keyword ini mempunyai format yang sama dengan #ifdef. demikian pula sebaliknya. Linker Linker adalah bagian dari Software development Tool yang bertugas mengubah format machine code yang dihasilkan oleh assembler menjadi instruksi yang dapat dieksekusi. contoh resource: ikon . keyword ini digunakan di antara keyword #if. tetapi cara kerjanya adalah kebalikan dari #ifdef... keyword ini sebagai pembatas untuk menadakan bagian akhir dari source code yang akan dikenai efek jika keyword #if. Formatnya: #ifdef identifier. Compiler Compiler adalah bagian dari Software Development Tool yang kita gunakan. sebab dengan memberikan switch tertentu kepada compiler C pada saat kompilasi dilakukan. namun kemampuan ini juga tergantung kepada Software development Tool yang kita gunakan. misalnya software tersebut mempunyai komponen eksternal seperti resource pada windows. sehingga jika baris. #ifdef dan #ifndef dievaluasi. Dengan demikian kita dapat mendefinisikan kembali identifier tadi setelah #undef. #ifndef benar maka source code sesudah #else. Jadi sebenarnya assembler tidak menghasilkan sebuah program yang dapat dieksekusi. baris source code1. #else. efeknya sama dengan #define identifier . resource sebenarnya bukan bagian dari program yang dieksekusi tetapi ikut disertakan dalam program karena dibutuhkan . adalah keyword untuk menonaktifkan identifier yang telah didefinisikan dengan #define.Contoh: #define TEST 0 #if (TEST > 0) . yaitu menyatukan komponen-komponen dari software yang kita buat ke dalam file executable yang nantinya akan dihasilkan setelah melalui linker. baris source code2. #undef.

Perlu diperhatikan bahwa variabel bertipe bool dianggap bernilai false jika . bool b = false int a = -255 . Variabel adalah sebuah simbol yang mewakili sebuah alamat di memory yang nilainya dapat dimanipulasi melalui nama tersebut dan mempunyai ukuran tertentu. } jika ekspresi didalam kurung sesudah if ( ekspresi a > b) bernilai benar maka seluruh pernyataan di dalam kurung kurawal akan dieksekusi. unsigned int Ukuran (byte) 1 4 Contoh bool a = true . unsigned long 4 short. Tipe data bool int. pernyataan 1 s/d pernyataan 3 seolah-olah dianggap satu pernyataan saja oleh compiler yang kita gunakan. unsigned short float double long double 2 4 8 8 Variabel bertipe bool hanya mempunyai dua nilai yaitu true atau false. Komponen lain yang kadang-kadang disatukan oleh linker adalah dll (dynamic link library) yang disatukan secara "static" ke dalam file executable. Berikut ini adalah tipe data dan ukurannya. unsigned int b = 10 char a = -1 . unsigned char 1 long. Sintaks untuk mendeklarasikan (menyatakan pertama kali adanya sebuah variabel) adalah: tipe-data NamaVariabel Contoh: int variabel1.yang akan ditampilkan pada sebuah program. Pernyataan diakhiri dengan tanda . hal ini terutama berguna saat anda akan mengatur eksekusi sekelompok pernyataan dalam sebuah percabangan seperti contoh di bawah ini: if (a > b) { pernyataan 1.001 double h = 1. (titik-koma). Sekelompok pernyataan yang disatukan dalam sebuah kurung kurawal (kadang di sebut sebagai block of statement atau blok pernyataan ) juga diperlakukan seperti sebuah pernyataan biasa. namun dengan adanya kurung kurawal. pernyataan 2.42e10 char. unsigned char b = 1 long c = 0xFF . Pernyataan dalam bahasa C adalah sebuah baris program yang dapat diproses oleh compiler. operator maupun operand. unsigned short f = 067 float g = 0. Ukuran ini disebut tipe data. pernyataan 3. unsigned long d = 0xFFC short e = 0xFFF . selain itu linker juga menyatukan file objek (obj) diluar file objek yang kita hasilkan jika dibutuhkan oleh program kita ke dalam executable yang akan dibentuk. Sebenarnya keyword if hanya dapat mengeksekusi satu pernyataan sesudah ekspresi yang diuji olehnya ( pada contoh di atas ekspresi a > b). jadi anda hanya dapat mengisinya dengan nilai ini. Contoh: return. Setiap pernyataan dapat berisi beberapa ekspresi.02e8 long double h = 2. Tipe data yang berbeda kemungkinan mempunyai ukuran yang berbeda.

79769313486231x10308 untuk bilangan positif. ada tiga tipe variabel yang tidak termasuk ke dalam golongan yang memenuhi aturan ini. sebab menyimpan sekumpulan karakter. UINT b). Pada beberapa sistem long double dan double mempunyai ukuran berbeda. double mempunyai nilai antara -1. Variable scope adalah daerah di dalam source code tempat sebuah variabel masih dikenali/terlihat oleh compiler. Selain sifat ini. kisarannya sebagai berikut: float mempunyai nilai antara 10-308 s/d 10308. Kasus kedua adalah variabel yang dideklarasikan diluar semua fungsi. tetapi pada Microsoft Visual C++. nilai variabel ini tidak begitu penting sebab yang kita simpan bukan merupakan nilai yang akan dioperasikan. Misalnya seperti ini: anda mendeklarasikan sebuah variabel di dalam sebuah fungsi di luar fungsi main(). Anda hanya perlu mengetahui jumlah bit yang digunakan variabel tersebut dan untuk yang signed. UINT var_test. misalnya 1. Implikasi dari adanya variabel global dan lokal adalah: 1.5x1032. karena semuanya analog dengan tipe data int. Untuk memperjelas. Variabel seperti ini biasa juga disebut variabel global sebab variabel ini dikenali di dalam fungsi manapun dalam program kita. hal ini disebabkan oleh arsitektur kebanyakan microprocessor saat ini adalah "byte addessable".Tipe data floating point nilai maksimum dan minimumnya tergantung pada Software Development Tool yang kita gunakan. double dan long double. yaitu variable yang dinyatakan dalam mantissa dan eksponen. keduanya adalah identik. pada Visual C++ . Anda tidak dapat menggunakan variabel lokal di luar fungsi tempat variabel tersebut dideklarasikan. Untuk variabel yang tipenya lain tentunya anda sudah dapat menghitung sendiri nilai kisarannya. dan 0. Pada variabel floating point anda dapat memasukan data dengan nilai pecahan yang dikalikan dengan eksponesial. sebab variabel tersebut tidak akan dikenali oleh compiler. Variabel bertipe int (integer/bilangan bulat) dan unsigned int (unsigned integer/bilangan bulat positif) hanya dapat diisi dengan bilangan yang bernilai bulat (tidak ada nilai di belakang koma atau pecahan) termasuk 0. Variabel seperti ini biasa disebut variabel lokal. variabel seperti ini mempunyai scope dikeseluruhan source code yang kita miliki. Namun demikian. termasuk fungsi main(). Mantissa adalah faktor pengali. Anda tidak dapat menggunakan nama variabel yang sama untuk sebuah variabel global dan lokal sebab compiler akan menganggap variabel tersebut dideklarasikan 2 kali dan hal ini tidak dibolehkan oleh compiler C.h> #define UINT unsigned int /* deklarasi fungsi kali */ UINT kali(UINT a. pada bilangan ini mantissa adalah 1.79769313486231x10308 s/d -4. void main() { . variabel dengan tipe data char mempunyai sifat tersendiri. Misalnya 1.nilainya 0 . Pada saat menentukan tipe data sebuah variabel yang akan anda gunakan anda harus memperhatikan nilai maksimum atau minimum yang dapat ditampung oleh tipe data tersebut agar tidak terjadi kesalahan perhitungan. Variabel memiliki apa yang disebut variable scope.94065645841247x10 -324 untuk bilangan negatif. anda dapat memasukkan nilai heksa desimal (basis 16) seperti 0xFF. maksudnya nilai variabel terkecil yang dapat ditangani oleh microprocessor tersebut adalah byte. int nilainya berada pada kisaran -(216) sampai 216-1 (karena ada 0). Anda juga dapat memasukkan bilangan bukan desimal(basis 10) ke dalam variabel yang bukan floating point.045 sedangkan eksponennya adalah 10e5 (105). yaitu anda dapat memasukkan sekumpulan ke dalam variabel tersebut. 2. mengapa untuk dua alternatif saja kita menggunakan 1 byte (8 bit) padahal untuk 2 alternatif hanya dibutuhkan 1 bit. yaitu float. Ketiga tipe ini adalah tipe variabel floating point. Pada sistem operasi windows variabel dengan tipe ini memiliki nilai 32 bit (4 byte). maka variabel tersebut hanya memiliki scope pada fungsi itu saja.045x10e5 . nilai dari variabel tersebut harus kurang dari atau sama dengan nilai maksimum yang dapat ditampung oleh tipe data tersebut. misalnya pada potongan source code berikut: char message = "Ini adalah string" variabel char dengan deklarasi seperti di atas sering di sebut string. Misalnya. bilangan octal (basis 8) seperti 0223.94065645841247x10-324 s/d 1. dan benar jika nilainya >= 1. sehingga untuk unsigned int nilai maksimumnya adalah 232 -1 (karena ada 0).(2(jumlah bit tipe data tsb/2) ) dan nilai maksimum positifnya adalah 2 (jumlah bit tipe data tsb/2)-1 (karena ada 0). Mungkin anda bertanya. sebab di luar fungsi tersebut variabel tersebut tidak akan dikenali oleh compiler. Pada prakteknya variabel tipe floating point ditangani oleh bagian FPU (Floating Point Unit/Math Coprocessor) pada microprocessor kita. dan eksponen adalah bilangan berpangkat 10 yang dikalikan dengan mantissa tersebut. nilai negatif yang paling kecilnya adalah . dan 4. akan diberikan contoh sebagai berikut: #include <stdio.

Unary operator antara lain: Operator Kegunaan Unary . Operator Operator adalah karakter atau kumpulan karakter yang digunakan untuk memanipulasi variabel. Biasanya digunakan dalam operasi dengan pointer (akan dijelaskan lebih lanjut) Operator ini memberikan alamat memory operand. faktor2 dan hasil adalah variabel lokal pada fungsi main(). yaitu: unary operator. hasil = kali(faktor1. Disebut juga Negation atau complement operator Operator ini menaikkan nilai operand 1 satuan. disebut juga increment operator. UINT c = a*b. disebut juga decrement operator. operator ini bekerja pada dua operand sekaligus. printf("%d \n". ) binary operator. operator ini hanya bekerja pada satu operand. Anda perlu memperhatikan hal seperti ini saat anda membuat program. yaitu merubah nilai operand menjadi nilai yang berlawanan tanda. sebab jika anda dengan seenaknya memberi nama pada variabel yang anda gunakan tanpa memperhatikan scope dari variabel tersebut. } UINT kali(UINT a.faktor2). Dalam bahasa C ada tiga golongan besar operator. Disebut juga address of operator.~ ! ++ -Operator ini melakukan operasi negasi. Biasanya digunakan dalam operasi dengan pointer (akan dijelaskan lebih lanjut). * & sizeof Operator ini memberikan ukuran memory yang digunakan operand (operand dalam byte. Karakter atau kumpulan karakter ini dikenali secara spesifik oleh compiler sehingga variabel yang diubah-ubah nilainya(operand) akan dikenai operasi sesuai dengan definisi operasi yang dimiliki oleh operator tadi. Operator ini memberikan nilai yang tersimpan pada alamat memory yang ditunjuk oleh operand. bisa-bisa program anda tidak dapat di-compile. disebut juga indirection operator.hasil). Variabel hasil yang ada pada fungsi kali adalah variabel lokal. Operator ini menurunkan nilai operand 1 satuan. var_test adalah variabel global. operand adalah operand yang ukurannya akan dicari.UINT faktor1 = 10. yang berbeda dengan variabel hasil yang ada pada fungsi main() sebab scope kedua variabel tersebut adalah berbeda. UINT faktor2 = 20. Operator binary antara lain: Operator Kegunaan . Variabel faktor1. UINT b) { UINT hasil = 30. } Pada source code di atas. return c. UINT hasil . sebab variabel ini dideklarasikan di luar semua fungsi.

Operator ini disebut operator logical and. 1&0 = 0. 0^0 = ^ 0. 1&1 = 1. misalnya: 0xA & 0xC akan menghasilkan 0x8. Cara kerjanya adalah melakukan operasi OR (|) pada setiap bit kedua operand. perhatikan bahwa 0xA = 1010 biner dan 0xC = 1100biner. Nilai Operand di sebelah kiri akan dibagi dengan nilai operand di sebelah kanan. perhatikan bahwa 0xA = 1010biner dan 0xC = 1100biner. perhatikan bahwa 0xA = 1010biner. Sehingga 1010 & 1100 = 1000biner atau 0x8heksadesimal sebab 0&1 = 0 . Misalnya: 3%2 akan menghasilkan 1. Sehingga 1010 | 1100 = 1110biner atau 0xE heksadesimal sebab 0|1 = 1 . Cara kerjanya adalah melakukan operasi AND (&)pada setiap bit kedua operand. perhatikan bahwa 0xA = 1010biner dan 0xC = 1100biner. Operator ini disebut juga operator bitwise xor. 1^0 = 1. jika salah satunya benar maka nilai yang dihasilkan 1. 0&0 = 0. kemudian hasil operasinya adalah sisa dari pembagian tersebut. Operator ini disebut juga operator bitwise or. 0|0 = 0. 1^1 = 0. Operator Penggeseran Bit (Bit Shift Operator) Operator ini disebut operator geser kanan (right shift). jika tidak maka nilai yang dihasilkan adalah 0 (false) Operator ini disebut operator logical or. Cara kerjanya adalah melakukan penggeseran bit ke kanan pada nilai operand sejumlah bit yang ada di sebelah kanan operator ini. Cara kerjanya adalah mengetes ekspresi disebelah kanan dan kirinya. Sehingga 1010 | 1100 = 0110biner atau 0x6heksadesimal sebab 0^1 = 1 . misalnya: 0xA | 0xC akan menghasilkan 0xE. % Operator Logic (Logical Operator) && || Operator Operasi Bit (Bitwise Operator) & | 1|1 = 1. Cara kerjanya adalah mengetes ekspresi disebelah kanan dan kirinya.Binary Operator Matematis + * / Operator ini menjumlahkan nilai operand di sebelah kiri dengan nilai operand di sebeleh kanan Operator ini mengurangi nilai operand di sebelah kiri dengan nilai operand di sebeleh kanan Operator ini mengalikan nilai operand sebelah kiri dengan nilai operand di sebelah kanan Operator ini membagi nilai operand sebelah kiri dengan nilai operand di sebelah kanan Operator ini disebut juga modulo operator. sehingga dengan menggeser bitnya 1 kali ke kanan diperoleh 101biner. misalnya: 0xA ^ 0xC akan menghasilkan 0x6. jika tidak maka nilai yang dihasilkan adalah 0 Operator disebut juga operator bitwise and. dan jika digeser 3 kali akan diperoleh 1biner atau >> 0x1heksadesimal . jika keduanya benar maka nilai yang dihasilkan 1 (true). Misalnya: 0xA >> 3 akan menghasilkan 0x1. 1|0 = 1. Cara kerjanya adalah melakukan operasi XOR (^) pada setiap bit kedua operand.

code2 . Cara kerjanya adalah melakukan penggeseran bit ke kiri pada nilai operand sejumlah bit yang ada di sebelah kanan operator ini... Operator ini bekerja dengan membandingkan nilai operand di sebelah kanan dan sebelah kiri-nya.. code2 . if(A != B) ... else . Misalnya: <= A = 2. pada source code ini .. jika operand di kiri bernilai kurang dari atau sama dengan operand di sebelah kanan maka hasilnya adalah 1 (true). else . dan jika digeser 3 kali akan diperoleh 1010000biner atau 0x50heksadesimal..code1 akan di eksekusi. code1... B = 1.<< Operator ini disebut operator geser kiri (left shift). jika keduanya berbeda maka hasilnya adalah 1 (true). else . Misalnya: > A = 3. Misalnya: 0xA << 3 akan menghasilkan 0x50.. if(A > B) . B = 2. sebab A<=B bernilai 1 (true).. sebab A==B bernilai 1 (true).. pada source code ini . Misalnya: != A = 2. if(A <= B) . code2 . sehingga dengan menggeser bitnya 1 kali ke kiri diperoleh 10100 biner....... code1. perhatikan bahwa 0xA = 1010biner. sebab A!=B bernilai 0 (false).. Misalnya: Operator Perbandingan (Relational Operator) == A = 2.. >= Operator ini bekerja dengan membandingkan nilai operand di sebelah .code1 akan di eksekusi. pada source code ini . code1. else . if(A == B) . code2 . Operator ini bekerja dengan membandingkan nilai operand di sebelah kanan dan sebelah kiri-nya. sebab A > B bernilai 1 (true).. pada source code ini .. jika operand di kiri bernilai lebih dari operand di sebelah kanan maka hasilnya adalah 1 (true). Operator ini bekerja dengan membandingkan nilai operand di sebelah kanan dan sebelah kiri-nya.code1 akan di eksekusi.code2 akan di eksekusi. code1. Operator ini bekerja dengan membandingkan nilai operand di sebelah kanan dan sebelah kiri-nya.. B = 4. B = 2.. jika keduanya identik maka hasilnya adalah 1 (true).

.code1 akan di eksekusi. code1. else if (ekspresi2) . B = 4. B = 2. x = 2. Misalnya: < A = 2.. code2 .code1 akan di eksekusi. sourcecode1. else .. Pertama. pada source code ini . jika nilainya benar. sehingga yang akan dievaluasi adalah ekspresi3. akan dibahas percabangan dengan if. sebab A>=B bernilai 1 (true). sebab A < B bernilai 1 (true).. (x > y) ? x : y . dan else. jika operand di kiri bernilai kurang dari operand di sebelah kanan maka hasilnya adalah 1 (true). else . if(A >= B) . code1.. Operator ini bekerja dengan membandingkan nilai operand di sebelah kanan dan sebelah kiri-nya.. Percabangan Percabangan (Control Flow) adalah teknik yang digunakan untuk mengalihkan eksekusi program saat suatu ekspresi yang diuji bernilai benar atau salah..kanan dan sebelah kiri-nya.. pada source code ini . jika operand di kiri bernilai lebih dari atau sama dengan operand di sebelah kanan maka hasilnya adalah 1 (true). code2 . Misalnya: A = 4. maka yang akan dievaluasi adalah ekspresi2. jika salah maka yang akan dievaluasi adalah ekspresi3. Operator Kegunaan Cara kerja dari operator ini adalah mengecek nilai ekspresi1. y = 3. sebab ekspresi1 nilainya salah. Bentuk percabangan ini adalah yang paling sederhana.... Format penggunaannya adalah: if (ekspresi1) . nilai z akan sama dengan y. ternary operator. operator ini bekerja pada tiga operand sekaligus. Berikut ini contoh untuk memperjelas: Ekspresi1 ? Ekspresi2 : Ekspresi3 int int int z = z.. pada source code di atas. else if.. if(A < B) ..

Selanjutnya adalah percabangan dengan switch. sourcecode2. else if akan mengecek ekspresi2.. sebenarnya hal ini juga dapat dilakukan dengan if . jika benar maka sourcecode1.. sourcecode2.. sourcecode4. ekspresi biasanya merupakan sebuah variabel yang dapat memiliki banyak macam nilai (misalnya variabel bertipe int)... ekspresi2 dan ekspresi3. nilai ekspresi akan dicocokkan (matching) dengan nilai ekspresi1. case (ekspresi3): . default dan pernyataan sesudahnya adalah opsional (dapat digunakan. else if . break. anda harus menggunakan keyword break.. maka eksekusi program berpindah ke else if (ekspresi2). Satu hal lagi. pertama-tama.. jika anda hanya memiliki dua alternatif "jawaban" maka bagian else if tidak perlu digunakan. Misalnya: anda lupa memberikan break. sourcecode3. if akan mengecek ekspresi1 . tetapi tidak akan di bahas di sini sebab jarang digunakan dan dengan kedua teknik percabangan yang ada di atas sudah cukup untuk sebagian besar kasus yang kita hadapi seharihari. Hal ini tentunya bukan hal yang anda harapkan. setelah sourcecode2. tujuannya adalah agar eksekusi program keluar dari percabangan switch sehingga source code yang ada di bawahnya tidak dieksekusi. Jika ternyata tidak ada nilai yang sama dengan ekspresi maka yng dieksekusi adalah source code sesudah default... else . jadi teliti lah saat menggunakan switch... default: . tetapi switch lebih efisien dan lebih mudah jika kita sudah menguasainya. sourcecode3. pada sourcecode ini. misalnya: ekspresi bernilai sama dengan ekspresi1 maka source code1 akan dieksekusi... setelah setiap alternatif pernyataan source code. } pada source code diatas.. setelah keyword break (sesudah sourcecode3) barulah eksekusi keluar dari percabangan dengan switch ini. switch digunakan untuk percabangan dengan banyak alternatif pilihan. dan dapat tidak digunakan). Format penggunaannya adalah: switch (ekspresi) {case (ekspresi1): . Pada format di atas. jika ternyata ekspresi bernilai sama dengan salah satunya maka source code dibawahnya akan dieksekusi. break. case (ekspresi2): . Masih ada bentuk percabangan lain dalam C. jika salah maka eksekusi program berpindah ke sourcecode3. else if sebenarnya opsional (boleh ada boleh juga tidak). jika tidak. jika ekspresi2 benar maka sourcecode2 akan dieksekusi. sourcecode1. else . break. break. Perulangan . maka saat ekspresi bernilai sama dengan ekspresi2 eksekusi program tidak akan keluar dari percabangan switch setelah sourcecode2 tetapi akan terus melanjutkan eksekusi ke sourcecode3. akan dieksekusi.

hal ini dilakukan berulang-ulang selama ekspresi2 masih bernilai benar.ekspresi3 ) { . while . setelah itu nilai i ini dinaikkan 1 satuan menjadi 2 pada ekspresi3 (ekspresi3 adalah i++). pada dasarnya sama dengan perulangan dengan while.. } pada source code di atas ekspresi1 adalah ekspresi yang akan dievaluasi pertama kali . printf("loop masih dieksekusi").while dan mengerjakan hal yang sama dengan source code untuk perulangan menggunakan for.. maka source_code akan dieksekusi sampai test_expression bernilai salah. jalannya program kembali ke keyword for. } Perulangan dengan do. Perulangan menggunakan for mempunyai format sebagai berikut. yaitu for.. int i = 0. kemudian ekspresi2 dieksekusi. Perulangan dengan while mempunyai format sebagai berikut: while( test_expression ) { } . kemudian test_expression dievaluasi. while . sehingga eksekusi program akan keluar dari perulangan ini. Kemudian nilai i dievaluasi apakah kurang dari 4 (ekspresi2 adalah i < 4). int i = 0.. jika nilainya benar maka source_code_ulang. do . dan melanjutkan ke source code sesudah kurung kurawal penutup pada contoh di atas. Perulangan dalam C dapat diimplementasikan dengan beberapa keyword.. ekspresi2 .. pengulangan terakhir akan membuat nilai i menjadi 4 (sebab ekspresi3 di eksekusi). langkah-langkah ini diulang sampai nilai i menjadi 4. hanya saja pernyataan yang ada di antara keyword do dan while akan dieksekusi minimal satu kali. } while(i < 4) .while. kemudian jalannya program kembali lagi ke pernyataan for . Berikut ini source code yang menggunakan while dan mengerjakan hal yang sama dengan source code untuk perulangan menggunakan for.") untuk menampilkan tulisan ke layar. } pada source code di atas. Ekspresi ini hanya satu kali dieksekusi. setelah itu ekspresi3 akan dieksekusi. pertama-tama keyword while dipanggil. i < 4 : i++) { printf("loop masih dieksekusi"). jika nilainya benar... source_code. kemudian kita memanggil fungsi printf(". for( ekspresi1 . saat pertama kali dieksekusi ekspresi ini bernilai benar sebab i < 4.. while(i < 4) { i++. Jika test_expression bernilai salah maka jalannya program akan melewati perulangan ini begitu saja (melanjutkan ke source code sesudah kurung kurawal penutup pada contoh di atas). Berikut contoh potongan programnya: for(int i = 0. jika benar maka source_code_ulang. sekarang ekspresi tersebut bernilai salah sebab i = 4 . dieksekusi. Saat i = 3. ekspresi1 adalah int i = 0 . do { printf("loop masih dieksekusi"). setelah itu ekspresi3 akan dieksekusi. kemudian jalannya program kembali lagi ke pernyataan for dan ekspresi2 kembali dievaluasi (ekspresi1 tidak lagi dieksekusi). dieksekusi.Perulangan adalah teknik pemrograman yang digunakan untuk mengatasi pernyataan program yang harus dikerjakan secara berulang-ulang. source_code_ulang. Berikut ini source code yang menggunakan do.. yaitu saat keyword for pertama kali dipanggil. sebab pengetesan ekspresi dilakukan setelah peryataan tersebut dieksekusi. i++. ekspresi ini mendeklarasikan sebuah variabel bertipe int dan memberikan variabel tersebut nilai 0. kemudian ekspresi2 dievaluasi. Ketiga keyword ini lah yang paling sering digunakan. pada source code di atas.

yaitu: kernel dari sistem operasi Linux.. namun dapat juga tidak mengembalikan apa-apa. Untuk membuat sebuah program C yang menggunakan fungsi (selain fungsi main())dapat berjalan dengan baik. source_codes . kita hanya akan mempelajari fungsi dengan jumlah parameter yang pasti. function_name adalah nama dari fungsi yang kita definisikan." Fungsi dan Struktur Program C Komponen utama bahasa C adalah sebuah bentuk yang dikenal sebagai fungsi.. Format dasar "definisi" sebuah fungsi adalah: return_type function_name(param1_type parameter1. return_type adalah tipe data dari hasil_perhitungan.Obrolan bebas: "Sebelum anda bosan. fungsi ini dapat menerima 2 atau lebih parameter. Jika sebuah fungsi tidak mengembalikan nilai apa pun maka return_type harus bertipe void dan fungsi tersebut tidak boleh mengandung keyword return sebuah_nilai . Program C yang paling sederhana sekalipun harus mempunyai minimal sebuah fungsi. Anda perlu berhati-hati dengan sintaks ini. penulis ingin memberitahukan bahwa bahasa C diciptakan oleh seorang hacker bernama Dennis Ritchie yang bekerja di Bell Telephone Laboratories pada 1972. . yaitu fungsi main().. Sebuah fungsi dapat mengembalikan (menghasilkan) sebuah nilai (dalam fungsi di atas nilai yang dikembalikan adalah hasil_perhitungan). pada return_type function_name(param1_type parameter1.... Catatan: Sebenarnya ada beberapa hal yang perlu anda perhatikan pada bentuk umum di atas.)..) maksudnya adalah sebuah fungsi dapat mempunyai lebih dari dua parameter.). ... . param2_type parameter2. return hasil_perhitungan. . kemudian. Fungsi adalah sekelompok perintah (bahasa C) yang dapat dipanggil untuk mengerjakan sebuah pekerjaan tertentu.. anda dan juga penulis bisa belajar banyak dari sana. sebagai parameter terakhirnya berarti fungsi tersebut dapat memiliki jumlah parameter yang "tidak terbatas".) { . karena source code-nya free.. parameter1 dan parameter2 adalah nilai input yang akan diolah oleh fungsi.. dengan sebuah_nilai adalah nilai tertentu. tanda . anda harus menempatkan "definisi" fungsi tersebut sebelum fungsi main() atau jika anda tidak ingin menaruh definisi fungsi tersebut sebelum main() maka letakkan "deklarasi" fungsi tersebut sebelum main() seperti pada contoh yang akan di bahas. sekalipun nilai itu adalah 0. param2_type parameter2. Compiler C yang mendukung paling banyak arsitektur komputer saat ini adalah GNU C yang terdapat di banyak varian sistem operasi UNIX. dan jumlah parameter tersebut terserah anda saat memanggil fungsi tersebut. fungsi tanpa parameter adalah valid bagi compiler C. tergantung bagaimana anda mendeklarasikan dan mendefinisikan sebuah fungsi. Sebuah fungsi juga boleh tidak mempunyai parameter sama sekali.. Hal ini diperlukan sebab fungsi yang anda buat kemungkinan tidak akan dikenali jika anda tidak . dan yang terpenting adalah 'kekuatan' dari software apapun yang anda buat hanya dibatasi oleh imajinasi anda :). saat ini sudah ada beberapa cellphone yang dapat diisi dengan program aplikasi yang dibuat dengan bahasa C. asal lebih dari atau sama dengan 2. } Format dasar "deklarasi" sebuah fungsi adalah: return_type function_name(param1_type parameter1. param1_type dan param2_type adalah tipe data dari parameter1 dan parameter2. hasil_perhitungan dalam literatur biasa disebut "return value". Dalam tutorial ini kita tidak akan mempelajari fungsi seperti ini. Ada beberapa implementasi bahasa C yang mungkin akan membuat anda tertarik. termasuk Linux. sebab dalam bahasa C sebuah fungsi yang dideklarasikan atau didefinisikan dengan . param2_type parameter2. misalnya fungsi yang dideklarasikan sebagai berikut: void test(int a.. char b .

faktor2). } contoh output dari program di atas adalah: Ketikkan nilai untuk faktor1 2 Ketikkan nilai untuk faktor2 3 . } } /* definisi fungsi kali */ UINT kali(UINT a. faktor2). scanf("%d". void { UINT UINT UINT main() faktor1. #include < stdio. return. hasil = kali(faktor1. printf("Ketikkan nilai untuk faktor1 "). return c. printf("Hasil perkalian keduanya adalah %d\n".mendeklarasikannya atau mendefinisikannya sebelum fungsi main(). UINT b) { UINT c = a*b.h > #define UINT unsigned int /* deklarasi fungsi kali */ UINT kali(UINT a. &faktor2). &faktor1). } } else { printf("Anda mengetikkan karakter bukan bilangan \n"). } else { printf("Anda mengetikkan karakter bukan bilangan \n"). faktor2. if(faktor2 >= 0 && faktor2 <= 9) { printf("faktor1 = %d . Selanjutnya kita akan membedah sebuah program C yang sangat sederhana untuk memahami konsep di atas. faktor2 = %d \n". UINT b). hasil). if(faktor1 >= 0 && faktor1 <= 9 ) { printf("Ketikkan nilai untuk faktor2 "). faktor1. return. scanf("%d". hasil .

yang dibutuhkan sebenarnya hanya tipe data yang dikembalikan oleh fungsi (tipe data return value). stdio. Compile file tsb dengan menekan Control+F5 atau memilih menu Build|Execute "nama file". Setelah itu pada baris selanjutnya. pastikan check box Add to project dalam keadaan di-cek. sebab keyword void berarti tidak ada return value sama sekali. Kemudian ketikkan nama source file yang anda inginkan dengan extensi . faktor2 = 3 Hasil perkalian keduanya adalah 6 sebelum membahas source code di atas. akan dijelaskan bagaimana cara membuat program dengan source code di atas pada Microsoft Visual C++ 6. Pada baris pertama anda melihat #include <stdio. 2. 3.cpp jika anda tidak memberikan extensi pada nama file yang anda masukkan. nama fungsi tersebut dan tipe data semua parameternya. Fungsi main juga didefinisikan tidak mempunyai parameter. Jika input dari user memenuhi syarat percabangan if yang pertama maka user kembali diminta memberikan input karakter dari keyboard. sehingga program akan menampilkan pesan kesalahan dan program kemudian diakhiri. Pilih An empty project pada dialog yang muncul kemudian klik Finish. 4. kita mendefinisikan tipe data unsigned int dengan nama yang lebih singkat yaitu UINT. Buka menu File|New pada Microsoft Visual C++ 6. sebab Visual C++ akan secara otomatis memberi extensi . kemudian fungsi UINT kali(UINT . )). Fungsi main adalah fungsi yang pertama kali dipanggil oleh sistem operasi saat program kita dimulai8. Jika ternyata input kedua dari user tidak memenuhi syarat maka program akan mengeksekusi blok pernyataan sesudah keyword else yang ada di dalam blok pernyataan sesudah if (faktor1 >= 0 && faktor1 <=9) . UINT) akan dipanggil dengan parameterparameternya adalah input dari user (faktor1 dan faktor2) dan hasil yang diperoleh dari fungsi tersebut dipindahkan ke variabel yang diberi nama hasil. deklarasi sebuah fungsi digunakan untuk memberikan "tanda pengenal" bagi sebuah fungsi agar fungsi tersebut dapat dikenali saat . pada dialog baru yang muncul klik OK. baris ini maksudnya adalah preprocessor harus menempatkan isi dari file tersebut diawal file yang kita buat sebelum compiler mengolahnya. Sekarang kita akan membahas arti dari source code di atas. fungsi int kali(int a. kemudian ada sebuah ekspresi yang diuji: if (faktor1 >= 0 && faktor1 <=9) pernyataan ini mengetes input yang diberikan user (yang kita peroleh dari fungsi scanf). jika tidak maka blok pernyataan tersebut akan dilewati. jadi a dan b sebenarnya tidak dibutuhkan.9. Pada deklarasi sebuah fungsi. buka kembali menu File|New dan pilih tab Files. Sekarang anda sudah dapat melihat outputnya pada sebuah console windows (dos prompt pada windows 98). input ini kemudian diuji dengan ekspresi: if (faktor2 >= 0 && faktor2 <=9) Jika input tersebut memenuhi syarat percabangan di atas (ekspresi sesudah if bernilai benar) maka input dari user akan ditampilkan. 1. Catatan: Sebenarnya anda juga dapat menjalankan program yang dihasilkan dalam mode debug dengan menekan F5 atau memilih menu Build|Start Debug|Go. dan program kita akan mengeksekusi blok pernyataan sesudah else. kemudian klik OK. Pada contoh di atas. )) dan fungsi-fungsi untuk mengambil data yang dimasukkan user melalui keyboard (fungsi scanf ( . Pada baris selanjutnya kita mendefinisikan 3 buah variabel unsigned int. Blok pernyataan ini akan menampilkan pesan kemudian mengakhiri program dengan pernyataan return. int b) dideklarasikan. main didefinisikan sebagai fungsi yang tidak punya kembalian ( return value). dan nama project yang muncul pada kotak di bawahnya adalah nama project anda tadi.h> .h) yang mengandung definisi fungsi-fungsi yang kita butuhkan untuk menampilkan program kita (fungsi printf( . Kemudian copy source code di atas ke file yang baru anda buat.faktor1 = 2 . kemudian pilih tab Projects dan pilih Win32 Console Application. catatan: 7 Anda harus membedakan antara definisi dan deklarasi sebuah fungsi. kemudian pilih C++ Source File. Kemudian. kita memberikan simbol ini hanya untuk mempermudah saat membaca source code. untuk membuat dari source code program di atas.c pada kotak file name. jika inputnya adalah nilai numerik antara 0 dan 9 maka blok pernyataan di bawah pernyataan if tersebut akan dieksekusi.exe . Kemudian pada baris selanjutnya fungsi main didefinisikan7. 5. namun anda tidak akan sempat melihat outputnya. isi dari variabel ini kemudian ditampilkan pada baris selanjutnya.h adalah file yang disebut sebagai file header (extensi *. Pada bagian Project Name ketikkan nama project yang anda inginkan. Sekarang anda telah memiliki sebuah project yang masih kosong.

parameter [argument] dari fungsi ini adalah alamat dari variabel yang ingin kita isi. penulis akan menjelaskannya agar anda tidak bingung saat mempelajari source code yang diberikan.test). sedangkan pernyataan yang kedua mengembalikan nilai yaitu 0. anda cukup mengganti [format] dengan petik ganda dan di antara petik ganda tersebut anda tuliskan kata-kata yang ingin ditampilkan. yaitu fungsi yang digunakan untuk menampilkan hasil yang diperoleh dari program kita ke layar komputer. terlebih dahulu akan .. yang kita gunakan untuk menerima input dari user melalui keyboard. sehingga kode yang digunakan adalah %d. kita mengambil input dari user yang bertipe integer. Fungsi yang pertama adalah fungsi output. secara keseluruhan. di antara tanda petik ganda diketikkan kata-kata yang ingin ditampilkan. pada source code di atas. scanf("%d". bilangan yang ingin kita tampilkan kemudian diletakkan pada parameter [argument] dari fungsi printf. 8 Fungsi semacam ini disebut entry point.). Parameter kedua scanf adalah alamat dari variabel yang kita miliki sehingga digunakan address of operator10 untuk mengambil alamat dari variabel tersebut. Anda tidak perlu bingung menggunakan fungsi yang agak kompleks ini.). Sebenarnya anda dapat memberikan entry point yang bukan fungsi main() pada Microsoft Visual C++ dengan mengatur salah satu switch pada linker-nya dan memberikan nama fungsi yang anda inginkan pada parameter yang diminta oleh switch tersebut untuk dijadikan entry point. [argument]. pada source code di atas. Kata-kata yang dibatasi oleh karakter /* dan */ pada source code di atas adalah komentar (comment) yang berguna sebagai dokumentasi source code. Semoga hal ini tidak membuat anda merasa rendah diri. Jika anda ingin menggunakan lebih banyak angka lagi (yang berbeda posisinya dan dipisahkan karakter lain) maka anda cukup menmbah lagi [argument] dan meletakkan penanda seperti %d di atas pada posisi yang anda inginkan. Penulis sendiri yang pada awalnya adalah "hardware mania" sebelum memulai belajar programming merasakan bahwa konsep ini lebih mudah untuk dipahami. fungsi tersebut adalah int printf(const char* [format]. dibandingkan orang-orang yang tidak mengerti hardware dengan baik. Pointer pada hakikatnya adalah variabel yang menyimpan alamat variabel lain yang tipe data-nya sama dengan tipe data pointer tersebut. untuk Visual C++ gunakan MSDN) pada posisi tersebut. definisi sebuah fungsi adalah "ungkapan teknis" tentang apa yang harus dilakukan oleh sebuah fungsi saat fungsi tersebut dipanggil.. Cara penggunanya mirip dengan fungsi printf... Berikut ini contoh pengunaannya untuk menampilkan sebuah bilangan desimal: int test = 10. Tanda %d adalah sebuah kode khusus untuk memberitahukan fungsi printf bahwa kita ingin menampilkan bilangan integer (untuk tanda yang harus digunakan silahkan lihat dokumentasi compiler yang anda gunakan. dan akan lebih baik jika anda tahu bagaimana sistem operasi semacam windows mengorganisasikan memori. Jadi. Pointer dan Array Pointer adalah salah satu konsep yang paling sulit dipahami oleh programer pemula dalam bahasa C dan C++. Contoh: int nilai1. kata-kata yang ada di antara karakter ini akan diabaikan oleh compiler sehingga ada atau tidaknya kata-kata tersebut tidak berpengaruh Fungsi untuk Input dan Output Pada tutorial ini ada 2 buah fungsi input dan output yang digunakan. pernyataan yang pertama mengakhiri sebuah pemanggilan fungsi tanpa mengembalikan nilai apa-apa. [argument] adalah opsional.dipanggil. anda harus bisa membayangkan pergerakan variabel-variabel antara microprocessor dan memori utama. Untuk memahami dengan baik bagaimana pointer bekerja. Parameter pertama ([format]). biasanya adalah tanda petik ganda yang diantaranya diisi dengan kode jenis varabel yang akan kita isi pada parameter kedua ([argument]). kita mengambil input dari user dan memasukkannya ke variabel nilai1. Untuk mempermudah memahami pointer. Fungsi yang kedua adalah int scanf(const char* [format]. dan pernyataan return 0 . 10 Address of operator akan dijelaskan lebih rinci pada bagian pointer. 9 Perhatikan bahwa pernyataan return . &nilai1). printf("inilah bilangan yang ingin ditampilkan: %d". bedanya terletak pada parameter kedua. Fungsi ini adalah fungsi input.[argument]. adalah berbeda.

adalah bagian memory di luar bagian memory yang telah di sebut di atas. Memory space ini adalah bagian dari RAM namun bisa juga sebagian berada pada swap file. register ini disebut stack frame. yaitu bagian dari Microprocessor yang kita miliki yang dapat menyimpan data sementara ketika program sedang dijalankan11. Register. sehingga stack efektif saat ini tidak mengandung parameter fungsi dan variabel yang lokal terhadap fungsi. sehingga fungsi tersebut adalah perintah yang akan dieksekusi selanjutnya. yaitu: 1. yaitu: 1. Alamat stack saat ini yang ada pada register stack pointer kemudian di copy ke register stack frame pointer. 5. Isi instruction pointer yang di simpan di stak pada langkah 1 kemudian dipindahkan ke instruction pointer . Tentang register akan dijelaskan lebih lanjut pada pemrograman assembly. Wilayah memory ini dibagi ke dalam beberapa komponen lagi. hasil perhitungan dari fungsi tersebut kemudian diletakkan pada bagian stack yang telah disediakan pada langkah 2. 5. 11. sebab kita hanya dapat mengeksekusi sebuah program. Bagian ini adalah bagian yang read only. kita tidak bisa melakukan hal ini dengan fungsi seperti yang telah kita pelajari sebab fungsi tersebut hanya . 10. Sistem operasi modern umumnya menggunakan apa yang dikatakan swap file atau page file. Yang perlu kita ketahui saat ini adalah beberapa register yang bertugas menyimpan alamat kode program yang sedang dieksekusi saat ini. 9. 11 Register adalah bagian inti dari microprocessor yang kita miliki. 2. selain itu ada register yang berfungsi menunjukkan alamat stack yang digunakan saat ini. bukan merubah kode program itu sendiri saat dia dijalankan. 3. register ini disebut stack pointer dan ada pula register yang bertugas menyimpan sementara alamat yang dimiliki oleh stack pointer. Fungsi telah selesai dieksekusi. Stack. Global namespace. Kemudian. 4. Free store. Berikut ini adalah proses yang terjadi : 1. Alamat yang disimpan oleh register stack frame pointer kemudian di restore kembali ke register stack pointer. bagian ini adalah bagian memory space yang dapat diakses oleh program yang kita miliki dengan bebas. yaitu bagian dari memory yang berfungsi untuk menyimpan data sementara. Variabel lokal yang didefinisikan di dalam fungsi di simpan di stack. 7. Setelah membaca uraian di atas kita tahu bahwa ada beberapa alasan mengapa pointer diperlukan. 2. Dalam sistem operasi seperti ini setiap program mempunyai wilayah memori sendiri (memory space) yang hanya dapat digunakan oleh program itu sendiri. 3. Pada x86 32 bit ada beberapa register yang digunakan secara intensif dan ada juga yang tidak. nilai stack pointer dinaikkan untuk menyediakan ruang bagi return value dari fungsi yang akan kita eksekusi. saat sebuah fungsi sedang dipanggil dan diproses. Sebelum melangkah lebih jauh.. Return value dari fungsi di pindahkan ke variabel yang menerima hasil fungsi tersebut. 4. data apapun yang dimasukkan ke stack dianggap lokal terhadap fungsi yang kita panggil. Register-register inilah yang memelihara keadaan sistem kita agar tetap berjalan sebagaimana mestinya. register ini disebut sebagai instruction pointer. tidak dapat digunakan oleh program lain. hal ini diatur oleh bagian manajemen memori dari sistem operasi. Alamat kode instruksi pertama dari fungsi yang ingin kita eksekusi kemudian di pindahkan ke instruction pointer. disinilah aktivitas utama yang terjadi saat komputer kita jalankan. 8. mulai saat ini. akan dijelaskan apa yang terjadi ketika sebuah fungsi dipanggil. sehingga program kembali dilanjutkan. Page file adalah bagian dari media penyimpan eksternal (diluar motherboard) yang diperlakukan seperti RAM. misalnya variabel c pada fungsi kali pada source code sebelumnya. Dalam kasus tertentu kita perlu mengubah isi dari sebuah variabel yang sebenarnya.dijelaskan bagaimana pengorganisasian memori dalam sebuah komputer oleh sistem operasi yang berjalan pada komputer tersebut. Code Space. Seluruh parameter fungsi kemudian disimpan atau tepatnya di copy ke stack 6. Instruction pointer kemudian mengeksekusi kode instruksi pertama yang telah ditunjuk pada langkah 3. alamat kode instruksi yang ditunjuk oleh instruction pointer dinaikkan satu instruksi. bagian ini menyimpan kode program yang akan dieksekusi (machine code) yang kita hasilkan dari source code program yang sudah di-compile. sehingga fungsi dieksekusi. sehingga instruction pointer menunjuk ke alamat kode instruksi yang akan dieksekusi setelah fungsi yang dimaksud selesai dieksekusi. Alamat ini kemudian di simpan pada stack. Penjelasan lebih rinci tentang register-register ini dapat anda lihat pada tutorial pemrograman assembly. Pertama.

Pada baris /* operasi 2 */. pindahkan isi variabel C ke variabel yang ditunjuk oleh pointer pA. UINT Var2). operator & juga berfungsi sebagai operator bitwise AND biasa (sebab fungsi dasarnya memang seperti itu). operator & pada sintaks ini disebut sebagai adddress of operator. tergantung konteks penggunaannya. kemudian pointer ini kita buat menunjuk ke alamat variabel A. operator * disebut sebagai indirection operator sebab pada ekspresi *pA operator ini bekerja mengakses isi dari alamat memori yang ditunjukkan oleh pointer pA. Sebuah pointer harus menunjuk ke alamat memory tertentu. printf("nilai var2 saat ini : %d \n". Pada baris /* operasi 4 */. sehingga tidak akan menimbulkan bug seperti stray pointer. /* operasi 1 */ A*B. /* operasi 2 */ A & B.var2). atau dengan kata lain. Null pointer adalah pointer yang tidak berbahaya. tukar2 (var1.2. 3. /* operasi 4 */ #include < stdio. data_type adalah tipe data dari variabel yang ditunjuk oleh pointer tersebut. operator * berfungsi sebagai operator kali biasa. pointer seperti ini disebut stray pointer. jika tidak maka pointer tersebut bisa menimbulkan bug. Untuk itu contoh di atas harus diperbaiki sebagai berikut: int * pInt = 0. /* operasi 3 */ = C. void tukar2(UINT Var1. Berikut ini adalah sintaks untuk mendeklarasikan pointer: data_type * pointer_name. Jelas hal ini tidak mungkin dilakukan dengan metode yang telah kita ketahui. karena memberikan alamat variabel yang ada di sebelah kanannya yaitu alamat variabel A. Alamat variabel A ditunjukkan dengan sintaks &A. A = 9. yaitu melakukan operasi bitwise AND antara variabel di sebelah kiri dan kanannya.h > #define UINT unsigned int void tukar1(UINT* pVar1. B = 3. Operator jenis ini antara lain & dan * . printf("nilai var1 setelah tukar1: %d \n". * pA = &A . printf("nilai var1 setelah tukar2: %d \n". printf("nilai var1 saat ini : %d \n". Contoh: int * pInt. pernyataan: int * pA = &A mempunyai arti: kita mendeklarasikan pA sebagai pointer ke variabel bertipe int. C.var2). mengalikan variabel di sebelah kiri dan kanannya. tukar1(pVar1. Berikut adalah contoh untuk memperjelas: int int int int C = C = *pA Pada baris /* operasi 1 */. UINT * pVar1 = &var1.var1). Dalam kasus sebuah fungsi yang harus mengembalikan 2 atau lebih return value. Alamat ini kemudian kita pindahkan ke variabel pA yang baru dideklarasikan dengan operator = . kemudian mengkopi kembali hasil manipulasi tersebut dari stack ke variabel aslinya. pada contoh ini dideklarasikan sebuah pointer ke sebuah variabel bertipe int. Beberapa operator dalam C yang bisa punya banyak makna dan kegunaan. UINT* pVar2). printf("nilai var2 setelah tukar2: %d \n". memanipulasi "kopian" dari variabel yang sebenarnya ingin kita manipulasi (yang di simpan di stack ketika fungsi tersebut diproses ) Jika kita bisa merubah secara langsung variabel yang ingin kita manipulasi maka hal itu adalah lebih efisien dibandingkan mengkopi dan memanipulasinya. &var2). Dengan demikian jika anda belum mengisi sebuah pointer dengan alamat memori tertentu maka inisialisasi pointer tersebut dengan nilai 0 sehingga pointer tersebut menjadi null pointer . pindah isi variabel C ke varabel A (sebab pA menunjuk ke alamat memory variabel A). jadi pernyataan : *pA = C mempunyai arti. . Selanjutnya kita akan membahas sebuah contoh program yang menggunakan pointer. var2). hal ini diwakili oleh sintaks int * pA . sebab sebuah fungsi hanya mungkin mempunyai 1 return value (baca kembali bagian fungsi). var1). UINT var2 = 8. int main() { UINT var1 = 4. Pada baris /* operasi 3 */. var1). pointer_name dalah nama dari pointer yang kita inginkan.

c++) { arr_Test[c] = komponen.h > #define UINT unsigned int void main() { UINT komponen = 5. /* copy isi var2 ke var1 */ *pVar2 = temp. Anda juga telah membaca sebelumnya tentang bagaimana sebuah fungsi bekerja. Sintaks untuk mendeklarasikan array adalah: tipe_data nama_array[jumlah_komponen]. sementara fungsi tukar2 tidak demikian. akan diperoleh output sebagai berikut: nilai nilai nilai nilai nilai nilai var1 var2 var1 var2 var1 var2 saat ini : 4 saat ini : 8 setelah tukar2: setelah tukar2: setelah tukar1: setelah tukar1: 4 8 8 4 Dari output ini tampak jelas bahwa fungsi tukar1 benar-benar mempertukarkan isi dari var1 dan var2 . sehingga pada saat fungsi selesai dieksekusi parameter semula tidak berubah. UINT* pVar2) { UINT temp. Sekarang kita akan membahas mengenai Array. temp = (*pVar1). komponen++. /* copy isi var1 pada temp */ Var1 = Var2. for( c = 0 . printf("Isi dari komponen ke[%d]. temp = Var1. maka saat kita menggunakan indirection operator. return 0. UINT c. melainkan "kopian" dari parameter tersebut yang ada di stack. parameter-parameter yang digunakan adalah alamat variabel-variabel yang ingin kita rubah. c < 10 . adalah: %d \n". UINT Var2) { /* karena fungsi ini passing by value maka yang kita rubah nilainya saat ini adalah copy variabel var1 dan var2 yang ada di stack */ UINT temp. /* copy isi temp ke var2 */ } Jika anda mengeksekusi program di atas. Karena keterbatasan waktu. tipe_data adalah tipe data dari variabel yang menjadi komponen array tersebut. penjelasan tentang pointer hanya sampai di sini. Berikut ini contoh penggunaannya: #include < stdio. /* copy isi temp ke var2 */ } void tukar1(UINT* pVar1. karena yang kita jadikan paramater adalah alamat dari variabel tersebut. jumlah_komponen adalah jumlah komponen (variabel) yang dimiliki oleh array tersebut. and dapat melihat aplikasinya pada fungsi tukar1. Array adalah sekelompok variabel yang berbeda. . UINT arr_Test[10]. } void tukar2(UINT Var1. /* copy isi var2 ke var1 */ Var2 = temp. var2). dengan tipe data yang sama yang diperlakukan sebagai satu variabel dan dapat diakses dengan menggunakan nama dari array tersebut. Di sini lah kegunaan pointer mulai tampak. /* copy isi var1 pada temp*/ (*pVar1) = (*pVar2). dari uraian tsb diketahui bahwa saat kita tidak menggunakan pointer sebagai parameter fungsi (biasa disebut passing by value) maka yang diubah bukan parameter yang kita masukkan. nama_array adalah nama yang kita berikan untuk array tersebut.printf("nilai var2 setelah tukar1: %d \n". Pada fungsi tukar1. Tidak demikian hal nya jika kita menggunakan pointer sebagai parameter (biasa disebut passing by pointer).arr_Test[c]).c. variabel yang kita peroleh adalah variabel aslinya. Fungsi ini tidak penulis jelaskan lebih jauh sebab comment yang diberikan serta penjelassan sintaks pointer sebelumnya penulis anggap sudah memadai.

. Perhatikan bahwa untuk menunjuk dan memanipulasi komponen dari arr_Test kita menggunakan pointer pArr. Satu hal yang perlu anda waspadai saat menggunakan array. ke[1]. UINT* pArr = arr_Test. sebab indeks dimulai dari 0. dan seterusnya. Kemudian komponen-komponen dari array tersebut diisi dengan nilai variabel komponen dalam sebuah perulangan menggunakan for. satu satuan di sini adalah sejumlah byte dari ukuran tipe data pointer tersebut. sehingga anda dapat mengakses elemen array tesebut dengan sebuah trik yang disebut dengan pointer arithmetic. for( c = 0 . adalah: %d \n". adalah: adalah: adalah: adalah: adalah: adalah: adalah: adalah: adalah: adalah: 5 6 7 8 9 10 11 12 13 14 Pada program di atas. komponen++. . UINT arr_Test[10]. pembuat game Quake III Arena. inilah yang disebut pointer arithmetic. Mungkin anda mengenal John Carmack. Nama sebuah array sebenarnya merupakan pointer ke elemen pertama dari array tersebut. maka indeks maksimum yang dapat anda gunakan adalah nama_array[8].. Misalnya anda mendeklarasikan sebuah array mempunyai 9 komponen. printf("Isi dari komponen ke[%d]. Jadi. Sampai di sini anda telah mengerti tentang pointer dan array. Penulis ingin ngobrol sesuatu soal programming.c. ke[6]. Berikut contohnya: (program sebelumnya diubah untuk memberikan output yg sama) #include < stdio.}} output dari program di atas adalah: Isi Isi Isi Isi Isi Isi Isi Isi Isi Isi dari dari dari dari dari dari dari dari dari dari komponen komponen komponen komponen komponen komponen komponen komponen komponen komponen ke[0]. yaitu indeks yang menunjukkan komponen pertama dari array. Indeks paling kecil adalah 0. dengan jumlah komponen sebanyak 10 buah. kita mendeklarasikan array dengan tipe data unsigned int. digunakan sintaks arr_Test[0] (sebab nilai awal variabel c adalah 0).. dan seterusnya. Komponen pembentuk sebuah array diletakkan pada alamat yang berurutan di memory.. ke[4]. programer yang ada di balik ID Software.arr_Test[c]). UINT c. } } Output yang dihasilkan oleh program ini sama dengan output program sebelumnya. Menaikkan nilai pArr satu satuan sama saja artinya dengan menunjuk ke komponen selanjutnya dalam sebuah array. ke[5]. tidak terlalu sulit bukan ? Obrolan bebas: "Anda mungkin sudah lelah mengikuti tutorial ini. apalagi penulis :(. sebab hal ini akan menjadi bug pada program anda. ke[9]. ke[3]. hal inilah yangmenyebabkan kita dapat melakukan pointer arithmetic. c < 10 . ke[8]. Indeks 1 menunjukkan komponen ke-2. pArr++. yaitu pastikan bahwa anda tidak mengakses indeks array yang melebihi jumlah komponen array tersebut. Perhatikan bahwa untuk mengakses komponen pertama dari array arr_Test. karena tipe datanya integer maka alamat yang ditunjuk pointer tersebut dinaikkan sebanyak 4 byte (pada windows). c++) { *pArr = komponen. RTCW (Return to The Castle Wolfenstein) dan Doom . Trik ini memanfaatkan nama array yang diperlakukan sebagai pointer.h > #define UINT unsigned int void main() { UINT komponen = 5. Perlu anda ketahui bahwa setiap komponen array dapat diakses dengan sebuah nilai yang disebut indeks. Indeks menunjukkan letak komponen tersebut di dalam array. Sintaks pArr++ artinya naikkan nilai alamat memori yang ditunjukkan pArr satu satuan. kita break sebentar. ke[7]. ke[2].

misalnya int. Penyimpanan data menggunakan struct memberi kita fleksibilitas yang lebih baik.. Jadi . untuk membuat sebuah variabel dengan tipe-data struct nama_struct. Pada bagian sebelumnya kita telah mengenal bentuk penyimpanan data dalam C yaitu dengan menggunakan variabel dan dengan menggunakan array. Sintaksnya sbb: typedef struct nama_struct{ tipe_data nama_elemen_1. Struct pada dasarnya merupakan sebuah tipe data baru yang didefinisikan oleh programer yang membuatnya. tipe_data elemen_n.. yang telah dikenali secara internal oleh compiler. Sekarang kita akan mempelajari metode penyimpanan data yang lebih umum yaitu struct dan union. sebab biaya pengembangannya akan sangat mahal. Untuk mengakses isi dari elemen sebuah struct anda dapat menggunakan member of operator . bahasa dan tool seperti apa yang digunakan John Carmack untuk membuat game-nya ? sebab sebagian besar atau malah semua game buatan ID software tersedia untuk hampir semua platform komputer. yaitu: . jika anda lebih suka membuat variabel dengan tipe data struct ini di tempat lain.}nama_alias.... pada sintaks di atas. . Kadang penulis berpikir. . tipe_data nama_elemen_n. Sintaks seperti ini banyak digunakan dalam pemrograman C pada windows. dengan teknik ini anda tinggal menggunakan sintaks: nama_alias variabel_struct. karena kita dapat menyimpan data dengan tipe data yang berbeda ke dalam 1 struct. anda tidak dapat langsung menggunakan sebuah struct . Anda harus menggunakan sintaks: struct nama_struct variabel_struct. keyword ini dapat anda gunakan jika anda ingin membuat variabel bertipe pointer ke struct nama_struct.elemen_1 jika variabel yang anda miliki ternyata adalah sebuah pointer. mulai dari Apple sampai PC. tipe_data adalah tipe data dari elemen struct. Untuk melakukannya.. variabel_struct1 dan variabel_struct2 adalah variabel dengan tipe data struct nama_struct. pastilah 'code base' dari semua game itu sama.. Kalau kita pikir. anda tidak perlu lagi memberikan kata struct di depan nama struct tersebut. *nama_alias_pointer. dan sebagian lagi memanfaatkan union. Anda dapat menggunakan sintaks yang mempersingkat pembuatan variabel bertipe struct tertentu dengan menggunakan keyword typedef12. Pada sintaks di atas.. . anda harus menggunakan member of operator dalam bentuk lain. Pada penyimpanan data dengan array yang kita pelajari sebelumnya. variabel ini tidak wajib. sebab sebagian besar komponen windows mulai dari user interface sampai driver menggunakan bentuk ini. kita hanya dapat menyimpan data dengan menggunakan 1 macam tipe data yaitu tipe data dari array tersebut. Pada sintaks di atas *nama_alias_pointer adalah opsional. apa jawabannya ? " Struct dan Union Struct adalah bentuk yang sangat penting anda pahami jika anda ingin memprogram menggunakan C pada sistem operasi windows. tidak mungkin dia membuat game dengan 'code base' yang berbeda-beda. Dengan keyword ini. Misalnya untuk mengakses elemen_1 pada variabel variabel_struct1 anda akan menggunakan sintaks: variabel_struct1. Sebagai contoh. Sintaks yang digunakan untuk mendeklarasikan sebuah struct adalah: struct nama_struct{ tipe_data elemen_1. tipe_data nama_elemen_2. untuk mengakses elemen_2 pada variabel pointer_struct anda akan menggunakan sintaks: pointer_struct->elemen_2 Hal yang lain yang perlu anda perhatikan adalah. yaitu ->. anda tinggal menggunakan sintaks: nama_alias_pointer pointer_struct.variabel_struct2.III. anda dapat membuatnya pada baris program sesudah deklarasi struct ini. tipe_data elemen_2. misalnya: pointer_struc maka untuk mengakses elemennya. (titik).}variabel_struct1.

/* deklarasi fungsi */ void main() { puP Duron = malloc(sizeof(uP)). /* deklarasi struktur */ void harga_per_MHz(puP pProc). jadi seperti pada int. Selanjutnya kita akan membahas sebuah program yang memanfaatkan struct./* bebaskan memori yang dialokasikan */ } void harga_per_MHz(puP pProc) /* definisi fungsi */ { UINT harga_MHz = (pProc->harga)/(pProc->kecepatan) ./* alokasikan memori */ uP Celeron. sintaks yang ekivalen dengan 12 #define untuk mempersingkat penulisan tipe data. harga_MHz). "Duron").h dan string. *puP. Duron->harga = 350000. printf("harga per MHz dari %s adalah %d \n". strcpy(Duron->nama. UINT harga.} uP.h. harga_per_MHz(&Celeron). Berikut ini source code program tersebut: #include < stdio. File . bukan merupakan variabel. pProc->nama. } Output dari program di atas adalah: harga per MHz dari Duron adalah 318 harga per MHz dari Celeron adalah 350 Pada source code di atas ada dua file header yang baru kita gunakan.h > #include < malloc. sebab struct nama_struct juga adalah tipe data seperti halnya int. free(Duron). typedef dapat digunakan untuk mengganti makro misalnya. char nama[20]. "Celeron"). anda harus membuat variabel dulu sebelum menggunakannya.h > typedef unsigned int UINT. Celeron.tanpa membuat objek dari struct tersebut. yaitu malloc.harga = 700000. Duron->kecepatan = 1100. #define UINT unsigned int adalah: typedef unsigned int UINT . strcpy(Celeron. harga_per_MHz(Duron).nama. Celeron.kecepatan = 2000.h > #include < string. typedef struct Microprocessor{ UINT kecepatan.

tipe_data elemen_2. hal ini sama saja artinya dengan memberikan pointer ke variabel yang kita inginkan. 1 secara langsung. pastikan bahwa setiap fungsi malloc(size_t size) diimbangi oleh fungsi free()... Setelah itu dideklarasikan sebuah fungsi tanpa return value yang mempunyai satu parameter dengan tipe pointer ke struct Microprocessor (fungsi harga_per_MHz). Catatan: nama_union maupun nama_struct pada deklarasi sebuah struct atau union adalah opsional. dan satu secara tidak langsung. Union mempunyai cara kerja yang mirip "variabel template". File string. Pada bagian awal program. pada satu saat hanya ada ada 1 elemen yang dapat digunakan. Jadi berhati. sedangkan dalam sebuah union. anda dapat .variabel_union2.) dipanggil untuk menampilkan harga per MHz dari setiap variabel ini. hal ini lah yang disebut memory leak. Dalam sebuah struct.. Memory leak adalah salah satu bug yang paling berbahaya. untuk mengetahui lebih lanjut anda dapat membaca referensi yang ada pada akhir tulisan ini. Alokasi memori dinamis ini diperlukan karena puP Duron adalah sebuah pointer. atau dengan menggunakan keyword typedef: typedef union nama_union{ tipe_data elemen_1. Hal ini dilakukan dengan fungsi strcpy(). Union pada dasarnya mirip dengan struct. tipe_data elemen_n. dan puP yang merupakan pointer ke struct dengan tipe Microprocessor. . Pada sourcecode di atas kita memindahkan string ke elemen nama dari variabel bertipe struct Microprocessor yang kita buat.. Sekarang kita akan membahas source code di atas dengan lebih detail.. kita mendeklarasikan 2 buah variabel bertipe struct Microprocessor.. harga dan nama. karena kita dapat memasukkan variabel dengan tipe data yang telah kita definisikan sebagai elemen union tersebut ke dalam union tersebut pada saat run time (saat program sedang berjalan) dan pada satu saat hanya satu elemen saja yang dapat digunakan. tipe_data elemen_n. seluruh elemen struct tersebut berisi sesuatu pada suatu saat. dan seperti yang dijelaskan sebelumya.malloc. harus digunakan & (address of operator) agar kita memberikan masukan yang tepat ke fungsi tersebut. Pada definisi fungsi ini tampak bahwa fungsi ini akan menghitung harga per-MHz untuk setiap variabel (bertipe struct Microprocessor) melalui pointer ke variabel tersebut yang menjadi parameter inputnya. . tipe_data elemen_2. apalagi jika bug ini terjadi pada blok pernyataan yang mengalami perulangan. *nama_alias_ponter. Dalam sebuah union biasanya elemennya mempunyai tipe data yang berbeda-beda. Sekarang kita akan membahas sebuah bentuk yang dinamakan union. Fungsi malloc(size_t size) adalah fungsi untuk mengalokasikan memori sebesar size byte.hatilah saat menggunakan alokasi memori dinamis. Yang membedakan struct dan union adalah cara kerjanya. yang dapat menimbulkan bug.h digunakan untuk menyediakan kemampuan bagi program kita untuk mengalokasikan memori secara dinamis menggunakan fungsi malloc() dan free. Memori yang dialokasikan secara dinamis harus "dibebaskan" setelah digunakan dan tidak diperlukan lagi dengan fungsi free(). Hasil perhitungan ini kemudian di tampilkan ke user. karena akan membuat sistem kita kehilangan "free memory" (memory yang dapat dipakai oleh aplikasi lain) dalam jumlah besar.. yaitu Duron. yaitu Celeron. Di bawah ini adalah sintaks untuk mendeklarasikan union : union nama_union{ tipe_data elemen_1. jika tidak maka memori tersebut tidak akan dapat dipakai lagi selama program kita masih berjalan. itulah sebabnya saat kita memanggil fungsi ini pada variabel Celeron. setiap pointer harus diinisialisasi untuk menunjuk alamat memori tertentu atau diinisialisasi dengan 0 (dideklarasikan dengan nilai nol) agar pointer tersebut tidak menjadi stray pointer. dan bisa menimbulkan hang.. bahkan sintaks untuk deklarasinya sama saja.h digunakan untuk menyediakan kemampuan memindahkan string (kelompok karakter) dari satu variabel ke variabel lain atau dari sebuah string ke variabel yang dapat menyimpan string. kita mendeklarasikan sebuah struct dengan nama Microprocessor.}nama_alias. fungsi ini menggunakan passing by pointer seperti yang sudah kita bahas sebelumnya. yaitu uP yang merupakan nama alias "biasa". union akan tampak analog dengan variant. struct ini mengandung 3 elemen. Pada fungsi main(). . Fungsi harga_per_MHz menggunakan parameter bertipe pointer ke struct. Bagi anda yang pernah menggunakan bahasa pemrograman Visual Basic. setelah itu fungsi harga_per_MHz(. yaitu kecepatan. Kemudian kedua variabel ini diisi seluruh elemennya dengan nilai yang kita inginkan dengan menggunakan operator yang sesuai. Pada deklarasi struct itu juga kita memberi 2 nama alias untuk struct ini. Pembahasan mengenai struct hanya sampai di sini saja.}variabel_union1. Address of operator akan memberikan alamat dari suatu variabel. yaitu pointer ke struct yang kita miliki.

f = (float) 12345. } shared. } void print_function( generic_tag generic ) { printf("\n\nThe generic value is.shared.f)."). #include < stdio.type). case FLOAT: printf("%f". void print_function( generic_tag generic ). print_function( var ). generic. Selanjutnya kita akan membahas sebuah penggunaan union.67890. var. break. var.i = 111. Berikut ini adalah sebuah contoh implementasinya. }generic_tag. tergantung dari kemauan anda.shared. case INTEGER: printf("%d".. var.type ) { case CHARACTER: printf("%c". var. } } . var.shared.type = 'x'. generic.shared. generic. break.type = FLOAT. switch( generic. break.shared. float f. break.h > #define CHARACTER 'C' #define INTEGER 'I' #define FLOAT 'F' typedef struct data_holder{ char type. print_function( var ).shared. print_function( var ). int i..type = CHARACTER. var.c = '$'. union shared_tag { char c. void main() { generic_tag var. default: printf("an unknown type: %c\n".c).i). generic.menggunakan sebuah nama untuk sebuah struktur dan dapat mengabaikannya.

hal itu tidak terlalu mengganggu. printf("Ketikkan fungsi yang anda pilih (1-3) "). void main() { int keluar = FALSE. Pengecekan ini dilakukan melalui sebuah peryataan menggunakan switch. Didefinisikan beberapa konstanta yang digunakan sebagai "pengenal" untuk data yang dimasukkan ke union ini. int pilihan. scanf("%d".. switch(pilihan) { .. &var2). Elemen type dari struct ini kemudian isinya diubah-ubah pada saat yang bersamaan. int inrange = TRUE. Untuk mempermudah pemahaman konsep ini. Lebih Lanjut Tentang Fungsi Pada bagian ini kita akan membahas penggunaan fungsi dengan memanfaatkan pointer. marilah kita coba implementasi berikut: #include < stdio. printf("variabel pertama : ").Output dari program di atas adalah: The generic value is. Pada fungsi main(). void kuadrat(int * pX. float atau integer (int).12345. scanf("%d". &pilihan).. isi dari union yang ada pada var ditampilkan kepada user dengan menggunakan fungsi print_function. Setelah itu. &var1). union ini dapat menyimpan data dengan tipe char. yaitu sebagai variabel template. int var1. tergantung data yang dimasukkan ke elemen shared yang merupakan sebuah variabel union. Nama sebuah fungsi pada dasarnya adalah pointer ke alamat fungsi tersebut. Fungsi ini bekerja dengan cara mengecek tipe data yang telah dimasukkan ke var melalui elemen type yang dimiliki var saat ini.678711 The generic value is. int * pY). scanf("%d". Jika anda masih kesulitan memahami penggunaan union.$ The generic value is. dideklarasikan sebuah struct dengan nama data_holder dan nama alias generic_tag yang salah satu komponennya adalah union dengan nama shared_tag. void reset(int * pX. sebab feature ini jarang digunakan.. int *). yaitu CHARACTER. printf("variabel pertama : "). didefinisikan sebuah variabel struct data_holder dengan nama var. FLOAT.h > #define FALSE 0 #define TRUE 1 void tukar(int * pX. int * pY).. int var2. void (*ptr_func) (int * .an unknown type: x Contoh di atas adalah contoh penggunaan union yang umum. while (keluar != TRUE) { if (keluar == TRUE) break. tujuan penulis hanya ingin memperkenalkan union kepada anda :). INTEGER. int * pY).. Pada contoh di atas.

} printf("Apakah anda ingin mengakhiri program (1 = ya. *pY = (*pY)*(*pY). printf("tukar function called \n"). break. break. scanf("%d". int * pY) { int temp. } if(inrange) { printf("Variabel 1 dan 2 sebelum fungsi di panggil: \n"). printf("Variabel 1: %d . case 2: ptr_func = kuadrat. variabel 2: %d \n\n". } } void tukar(int * pX. inrange = TRUE. *pY = 0. break. printf("Variabel 1 dan 2 setelah fungsi di panggil: \n"). *pX = (*pX)*(*pX). case 3: ptr_func = reset. break. variabel 2: %d \n\n". &var2). var2). var2). *pY = temp. } void reset(int * pX. printf("Menukar variabel 1 dan variabel 2\n").case 1: ptr_func = tukar .&keluar). default: printf("Fungsi yang anda pilih tidak didefinisikan\n"). } void kuadrat(int * pX. var1. ptr_func(&var1. *pX = 0. } Contoh output program di atas adalah: . var1. inrange = FALSE. *pX = *pY. 0 = tidak) "). temp = *pX. int * pY) { printf("reset function called \n"). inrange = TRUE. inrange = TRUE. printf("Variabel 1: %d . int * pY) { printf("kuadrat function called \n").

sampai user memilih untuk keluar (keluar == TRUE) . penulis sendiri butuh waktu 1 bulan untuk benar-benar memahami apa yang dilakukan setiap baris dari pemrograman dengan bahasa C pada windows dengan menggunakan windows API :( . sebab jika anda menuliskannya seperti ini return_type * pointer_fungsi (tipe_data1 . Tapi anda tidak perlu merasa tertekan . pada saat itu. pemahaman anda tentang bahasa C akan menjadi setingkat lebih tinggi sebab banyak hal. program di atas mula-mula mengeset variabel keluar menjadi FALSE sehingga saat perulangan while(keluar != TRUE) mulai dieksekusi. Anda bisa saj melakukan. sehingga program keluar dari looping tersebut. Obrolan bebas: "Sampai saat ini kita telah mempelajari banyak konsep yang sangat penting. variabel 2: 4 tukar function called Menukar variabel 1 dan variabel 2 Variabel 1 dan 2 setelah fungsi di panggil: Variabel 1: 4 . tetapi alamat yang ditunjuk oleh pointer tersebut bukan alamat variabel. mengapa kita tidak perlu menggunakan indirection operator (*) untuk memanggil fungsi yang kita inginkan dari pointer-nya. return_type adalah tipe data dari return value (nilai yang dikembalikan/ dihasilkan sebuah fungsi. seperti pointer fungsi yang baru saja di bahas sebenarnya datang dari penggunaannya dalam pemrograman assembly. mulai dari variabel 'biasa' sampai pointer fungsi. bukan pointer fungsi seperti yang kita inginkan. Setelah membaca tutorial assembly nanti. Sintaks *pX = (*pX)*(*pX). hal ini dibutuhkan. karena konsep itu semua digunakan jika anda berniat menjadi programer yang hebat. mengapa tutorial ini belum juga masuk ke pemrograman windows. So keep fighting till the end" Selanjutnya kita akan membahas sebuah program yang menggunakan pointer ke fungsi yang mirip dengan yang banyak digunakan dalam pemrograman windows. pointer ke fungsi yang diberi nama ptr_func menunjuk ke tiga macam fungsi yang berbeda.variabel pertama : 3 variabel pertama : 4 Ketikkan fungsi yang anda pilih (1-3) 1 Variabel 1 dan 2 sebelum fungsi di panggil: Variabel 1: 3 . mudah-mudahan anda tidak bermasalah lagi dengan apa yang disebut pemrograman C. anda perlu melihat kembali bagian pointer jika masih bingung dengan sintaks yang digunakan. adalah pointer juga. Di dalam looping inilah terdapat penggunaan pointer fungsi. sebab program ini tidak bug free. asalkan fungsi-fungsi tersebut mempunyai return type dan tipe data parameter yang sama persis. pointer_fungsi adalah nama dari pointer fungsi yang diinginkan. Pointer fungsi dapat menunjuk ke berbagai macam fungsi. Pointer fungsi seperti yang telah dijelaskan diatas. sebab keduanya diperlakukan sama saja oleh bagi compiler C. 0 = tidak) 1 Peringatan ! Berhati-hatilah saat menjalankan program di atas. tipe_data2 adalah tipe data parameter kedua dari fungsi yang ditunjuk oleh pointer fungsi yang kita deklarasikan. Anda juga mungkin bertanya. Mungkin anda juga penasaran. program akan berulang-ulang menampilkan tampilan yang ada di dalam while. tergantung pilihan yang diketikkan user. Setelah memahami tutorial ini. yaitu fungsi tukar. maksudnya adalah kalikan nilai yang ditunjuk oleh pointer pX dengan nilainya sendiri.nya jika anda menginginkannya. tipe_data2 ). tipe_data1 adalah tipe data dari parameter pertama fungsi yang ditunjuk oleh pointer fungsi yang kita deklarasikan. Anda perlu bersabar sebelum sampai ke sana. Mungkin anda bertanya-tanya mengapa begitu banyak tanda kurung. sebab hal itu adalah salah satu hal yang penulis sendiri rasakan sangat sulit dipahami jika konsep-konsep seperti yang dijelaskan di sini tidak dikuasai dengan baik. Secara garis besar. variabel 2: 3 Apakah anda ingin mengakhiri program (1 = ya. maka and mendeklarasikan sebuah fungsi dengan return value bertipe pointer ke return_type. tetapi alamat sebuah fungsi. . Jika anda menyalahi aturan ini maka bisa saja muncul bug yang akan membuat komputer anda hang. masukkan input sesuai dengan rentang nilai yang diminta. namun hal ini tidak ada bedanya. anda masih ingat kan ?). Contoh di atas mengeksploitasi kemampuan bahasa C menggunakan pointer fungsi. Jumlah tipe data parameter yang digunakan bisa saja 0 atau bukan 2.&var2). tergantung dari format fungsi yang ditunjuk oleh pointer fungsi yang kita buat. Contoh di atas mungkin cukup sulit dipahami. Format deklarasi sebuah pointer fungsi adalah: return_type (*pointer_fungsi) (tipe_data1 . seperti yang diperlihatkan pada contoh di atas. kuadrat dan reset. seperti ini: (*ptr_func)(&var1. tipe_data2 ). dan penulis yakin pasti cukup melelahkan dan membingungkan :( . perintah break yang ada di dalam looping while (di bawah if (keluar == TRUE)) akan dieksekusi. kemudian kopi nilai tersebut ke variabel itu sendiri (variabel yang ditunjuk oleh pX).

2. printf("Hasil perhitungan adalah: %d \n". FPTR adalah sebuah sintaks untuk menyatakan pointer fungsi yang return value-nya bertipe UINT dan memiliki dua parameter bertipe UINT.h > typedef unsigned int UINT. tetapi akibat keterbatasan waktu maka bagian tersebut belum sempat disertakan.#include < stdio.param2).param1 = 10. UINT var2). kemudian objek tersebut dijadikan parameter untuk memanggil fungsi Hitung. Arsitektur Driver Windows 2000/XP Penulis mohon maaf karena semestinya ada bagian pendahuluan yang menerangkan tentang Windows API (Application Programming Interface) sebelum masuk kepada bagian ini.param2 = 20. UINT param2. Berikut . in. Selanjutnya dideklarasikan sebuah struct dengan nama Input dengan elemen-elemen: 1.} INPUT . Anda tidak perlu khawatir sebab hal tersebut tidak akan mengurangi pemahaman anda terhadap source code driver yang dibahas. in. typedef struct Input { FPTR pFunc. Fungsi Kali bekerja dengan mengalikan kedua parameter inputnya. sintaks ini maksudnya adalah. mengalikan kedua elemen struct tersebut yang bertipe UINT dan kemudian menampilkan hasilnya. in. UINT faktor2) { return (faktor1 * faktor2). UINT var2). Sampai di sini anda sudah memiliki sebagian besar skill yang dibutuhkan untuk melakukan pemrograman C pada Windows dengan menggunakan Windows API (Windows Application Programming Interface). } void main() { INPUT in. yaitu: typedef UINT (*FPTR) (UINT var1. input. dibuat sebuah objek bertipe struct Input.pFunc(input. Fungsi Hitung adalah sebuah fungsi yang menerima input berupa objek bertipe struct Input.param1. Hitung(in). Dalam beberapa saat ke depan mudah-mudahan bagian tersebut dapat disertakan dalam tulisan ini setelah tulisan ini diupdate :).pFunc = kali. typedef UINT (*FPTR) (UINT var1. Sebuah variabel bertipe pointer ke fungsi (FPTR) Dua buah variabel bertipe UINT (unsigned int) Kemudian dideklarasikan dua buah fungsi yaitu fungsi Kali dan Hitung. hasil). } Output dari program di atas adalah: Hasil perhitungan adalah: 200 Program di atas menggunakan beberapa sintaks yang "baru" misalnya sintaks untuk mempersingkat penulisan pointer fungsi. UINT kali(UINT faktor1. Pada fungsi main(). } void Hitung(INPUT input) { int hasil = input. UINT param1.

// Point uszDriverString at the driver name RtlInitUnicodeString(&uszDriverString. L"\\Device\\Patch").h" #define #define #define #define #define FILE_DEVICE_UNKNOWN 0x00000022 PCI_ADDR_PORT 0xCF8 PCI_DATA_PORT 0xCFC REG_ADDR 0x80000050 MASK 0x00000040 void tUnloadDriver(PDRIVER_OBJECT DriverObject).c -. IN PUNICODE_STRING RegistryPath) /*++ Routine Description: This routine is called when the driver is loaded by NT.Pointer to the name of the services node for this driver. . /* patch.prototipe Patch project started 9 Feb 2003 by . ULONG mask). UNICODE_STRING uszDriverString. Arguments: DriverObject .ini kita akan membahas source code driver pada artikel Tutorial Membuat Patch dalam bentuk Driver Pada Windows 2000/XP. IN PIRP Irp). UNICODE_STRING uszDeviceString. NTSTATUS tDispatchCreate(IN PDEVICE_OBJECT DeviceObject. void PatchPCI(ULONG reg_addr. IN PIRP Irp). Return Value: The function value is the final status from the initialization operation.Pointer to driver object created by system.Pinczakko */ #include "ntddk. RegistryPath . --*/ { NTSTATUS ntStatus. NTSTATUS tDispatchClose(IN PDEVICE_OBJECT DeviceObject. PDEVICE_OBJECT pDeviceObject. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject.

0. DriverObject->MajorFunction[IRP_MJ_CREATE] = tDispatchCreate. &uszDriverString). IO_NO_INCREMENT). // Load structure to point to IRP handlers. &uszDriverString. return ntStatus. // Create symbolic link to the user-visible name ntStatus = IoCreateSymbolicLink(&uszDeviceString... if(ntStatus != STATUS_SUCCESS) { // Delete device object if not successful IoDeleteDevice(pDeviceObject). IoCompleteRequest(Irp. IN PIRP Irp) { Irp->IoStatus. Irp->IoStatus. } NTSTATUS tDispatchClose(IN PDEVICE_OBJECT DeviceObject.MASK). 0. L"\\DosDevices\\Patch"). FALSE. // Point uszDeviceString at the device name RtlInitUnicodeString(&uszDeviceString.Information=0. return(STATUS_SUCCESS). FILE_DEVICE_UNKNOWN. DriverObject->DriverUnload = tUnloadDriver. // Return success return ntStatus.Status = STATUS_SUCCESS. if(ntStatus != STATUS_SUCCESS) return ntStatus. } //Patch the chipset on driver loading stage PatchPCI(REG_ADDR . } NTSTATUS tDispatchCreate(IN PDEVICE_OBJECT DeviceObject. &pDeviceObject).// Create and initialize device object ntStatus = IoCreateDevice(DriverObject. IN PIRP Irp) { . DriverObject->MajorFunction[IRP_MJ_CLOSE] = tDispatchClose.

IoDeleteSymbolicLink(&uszDeviceString). Keyword IN sebenarnya diabaikan oleh compiler saat source code ini di-compile. Konstanta ini digunakan sebagai pengenal bagi driver yang kita buat.//fetch the input port addr of PCI cfg space out dx. fungsi ini dipanggil oleh Windows saat driver yang dihasilkan dari source code ini di-load oleh windows saat start-up.eax popad . bits) out dx. return(STATUS_SUCCESS). IO_NO_INCREMENT). misalnya Hard drive atau mouse. ULONG mask) { //Patch the chipset __asm { pushfd . IoCompleteRequest(Irp.Information=0. Pada program di atas.//mask the regs value (activate certn.mask . yaitu: sebuah struct dengan tipe PDRIVER_OBJECT dan sebuah struct dengan tipe PUNICODE_STRING. karena dapat membuat sistem anda rusak. Selanjutnya 3 buah fungsi . L"\\DosDevices\\Patch"). kita menggunakan FILE_DEVICE_UNKNOWN karena driver kita bukan merupakan driver spesifik untuk device tertentu yang telah dikenali secara internal oleh Windows.eax mov dx.PCI_ADDR_PORT . Irp->IoStatus. } void PatchPCI(ULONG reg_addr.//save all flags and regs pushad mov eax. Kita akan membahas Source code ini mulai dari bagian awal.//restore all flags popfd } } Warning ! Jangan mencoba menginstalasi driver yang dihasilkan oleh source code di atas pada sistem anda.PCI_DATA_PORT in eax.//fetch the address of the regs to be patched mov dx. Namun. Pada awal source code terdapat beberapa definisi konstanta.Status = STATUS_SUCCESS. konstanta: FILE_DEVICE_UNKNOWN perlu dijelaskan di sini. tentang arti definisi ini telah dijelaskan pada artikel Tutorial Membuat Patch dalam bentuk Driver Pada Windows 2000/XP. IoDeleteDevice(DriverObject->DeviceObject). RtlInitUnicodeString(&uszDeviceString. } void tUnloadDriver(PDRIVER_OBJECT DriverObject) { UNICODE_STRING uszDeviceString.Irp->IoStatus. entry point program ada pada fungsi DriverEntry . Windows memanggil fungsi ini dengan menyertakan beberapa parameter.dx or eax. Keyword tersebut hanya digunakan untuk memperjelas saat kita membaca source code.reg_addr .

Selanjutnya kita melangkah ke inti dari program ini yaitu fungsi DriverEntry. anda hanya perlu merubah nama pointer fungsi yang ada pada fungsi DriverEntry. 3. Fungsi tDispatchClose dipanggil pada saat ada software pada user mode yang menutup akses ke driver kita. 7. jika berhasil maka variabel ini akan bernilai STATUS_SUCCESS setelah fungsi IoCreateDevice dipanggil. Fungsi tDispatchCreate dipanggil pada saat ada software pada user mode yang membuka akses ke driver kita. nama dari fungsi-fungsi ini tidak harus seperti yang diperlihatkan pada source code di atas. jadi tidak akan dibahas di sini. kita ingin mempatch beberapa register. namun kita tidak membutuhkan memory apapun untuk driver ini sehingga parameter tersebut 0. tipe data ini adalah tipe data 32 bit. sebab ketiga fungsi ini ditunjuk oleh pointer yang ada dalam fungsi DriverEntry . karena kita tidak beururusan dengan software di user mode maka dalam driver ini. Sebenarnya dalam kasus seperti ini. Parameter terakhir adalah pointer ke driver yang dihasilkan oleh fungsi ini. Variabel pDeviceObject adalah variabel yang digunakan untuk menyimpan pointer ke struct bertipe DEVICE_OBJECT yang dihasilkan setelah kita berhasil me-load driver kita (ntStatus bernilai STATUS_SUCCESS). fungsi ini hanya mengembalikan nilai STATUS_SUCCESS. Parameter ke-3 adalah nama dari driver kita yang akan tampak oleh user mode application. 5. atau dengan kata lain pointer ke driver kita. Sedangkan kedua variabel bertipe UNICODE_STRING digunakan untuk mengatur nama driver ini yang akan muncul di registry saat driver ini telah berhasil di-load. 2. Variabel ntStatus adalah variabel yang digunakan untuk mengecek apakah proses loading (inisialisasi) driver ini berhasil. DriverObject->MajorFunction[IRP_MJ_CREATE] = tDispatchCreate. yaitu: NTSTATUS ntStatus. DriverObject->MajorFunction[IRP_MJ_CLOSE] = tDispatchClose. Parameter ke-4 adalah tipe device dari driver kita. sehingga harus diberi nilai 0. Fungsi tUnloadDriver dipanggil saat driver kita akan diunload. misalnya hard drive maka nilai variabel ini akan berbeda. Pada awal fungsi ini didefinisikan beberapa variabel. saat membuat patch. Pointer ini adalah pointer ke struct DEVICE_OBJECT yang dihasilkan oleh fungsi ini. Struct ini adalah struct yang menyimpan karakteristik driver kita. Parameter ke-5 adalah karakteristi device yang secara internal dikenali oleh windows. PDEVICE_OBJECT pDeviceObject. 6. NTSTATUS adalah sebuah tipe data yang digunakan secara internal oleh Windows untuk menangani fungsi-fungsi yang berkaitan dengan driver. tetapi device kita tidak dikenali. dan hal itulah yang kita lakukan pada source code ini dengan memanggil fungsi PatchPCI. Fungsi ini sebenarnya adalah fungsi inisialisasi driver. Fungsi RtlInitUnicodeString digunakan untuk menyalin string. kita membuat "template driver" yang diberikan oleh windows menunjuk ke fungsi-fungsi yang kita inginkan. Untuk penjelasan lebih lanjut silahkan membaca file help Windows 2000 Driver Development Kit. Fungsi ini digunakan untuk "membuat driver".minimum yang harus dimiliki oleh sebuah driver. "template driver" ini disediakan windows dalam bentuk parameter pertama bagi fungsi DriverEntry yang kita buat (yang akan dipanggil oleh windows saat loading driver). jika dapat diakses oleh beberapa aplikasi pada saat bersamaan maka nilainya FALSE. Parameter pertama dari fungsi ini adalah "template driver" yang disediakan oleh windows bagi driver yang akan "dibuat". nilai parameter ini tidak punya pengaruh sebab kita tidak berurusan dengan software di user mode. 4. Parameter ke-6 adalah parameter yang berkaitan dengan kemampuan driver kita diakses dari usermode. cara kerjanya adalah sebagai berikut: 1. Fungsi PatchPCI akan anda pahami setelah membaca bagian Tutorial Bahasa Assembly. saat windows akan shutdown. Dalam kasus ini kita tidak perlu membahasnya karena tidak ada user mode application yang menggunakan driver kita. UNICODE_STRING uszDeviceString. karena driver ini tidak memiliki device maka digunakan FILE_DEVICE_UNKNOWN. UNICODE_STRING uszDriverString. Inisialisasi tersebut kita lakukan dengan cara melakukan apa yang kita inginkan pada fungsi ini. mirip fungsi . jadi jika anda merubah namanya. Jika device yang kita buat adalah device yang dikenali windows. "template driver" inilah yang kita modifikasi pada baris : DriverObject->DriverUnload = tUnloadDriver. dengan source code ini. Fungsi IoCreateDevice adalah fungsi inti yang menginisialisasi driver ini. karena kita tidak beururusan dengan software di user mode maka dalam driver ini. fungsi ini hanya mengembalikan nilai STATUS_SUCCESS Parameter kedua adalah jumlah memory yang dibutuhkan oleh driver. pada fungsi ini yang kita lakukan hanyalah cleanup memory dan resources yang digunakan oleh driver ini. "template driver" ini sebenarnya sebuah struct yang isinya pointer ke fungsi yang kita definisikan sendiri pada baris-baris program selanjutnya.

Pada VNA. mengapa northbridge 'hilang' dari skema di atas. northbridge sebenarnya ada pada pertemuan garis merah tebal dari memory dan I/O devices . sebab sintaks yang harus kita pelajari lebih sedikit. bus untuk data dan program adalah berbeda. misalnya dalam hal menentukan apakah kita menggunakan bus yang sama untuk data dan kode program atau keduanya terpisah. Ada mitos yang mengatakan bahwa programming menggunakan asssembly sangat susah. Di bawah ini adalah yang skema yang lebih jelas tentang hubungan antara system bus dan microprocessor. Jadi. sistem bus ini terbagi menjadi tiga komponen. bus untuk data dan program adalah sama. Secara umum saat ini arsitektur komputer yang ada menggunakan salah satu dari dua "aliran" arsitektur komputer. oleh karena itu tutorial ini diawali dengan penjelasan tentang arsitektur x86. Arsitektur Dasar Dalam sebuah arsitektur komputer ada filosofi tertentu yang digunakan. dan I/O (Input/Output)devices adalah periferal lainnya. Satu-satunya hal yang akan menjadi tantangan adalah anda harus berusaha memahami arsitektur microprocessornya. dan lain-lain. yaitu Von Neumann Architecture (VNA) dan Harvard Architecture. yang anda butuhkan adalah berlatih membuat beberapa program agar anda semakin memahami bagaimana bahasa ini digunakan :). Chipset dan lain-lain. Kita tidak akan mempelajari pemrograman assembly yang rumit. Keluarga x86 menggunakan menggunakan VNA yang secara skematik digambarkan sbb: CPU pada gambar di atas adalah microprocessor yang kita gunakan. yaitu data bus . Dari gambar di atas dapat anda lihat bahwa periferal I/O termasuk chipset yang ada di motherboard kita menggunakan bus yang sama dengan bus memory untuk berhubungan dengan microprocessor (system bus). Sekarang anda telah memiliki sebagian besar kemampuan dasar yang dibutuhkan untuk menjadi seorang programer bahasa C yang profesional. address bus dan control bus. Arsitektur Microprocessor x86 Pada bagian ini kita akan membedah bagian-bagian Microprocessor x86 secara fungsional dan mempelajari bagaimana bagian-bagian tersebut bekerja. Teknik seperti ini biasa disebut memory mapped I/O. selamat berjuang and always have fun :)" Pemrograman Bahasa Assembly Pemrograman bahasa assembly sangat erat kaitannya dengan hardware yang digunakan. Dengan penjelasan ini semoga anda sudah memahami arsitektur driver windows 2000/XP secara umum.. maka belajar assembly akan lebih mudah dibandingkan belajar bahasa C. Menurut penulis. Maksudnya. Jika anda mau berusaha dan membuang jauh-jauh mitos itu. sebab periferal I/O diakses seperti hal-nya kita mengakses memory. memory adalah RAM . Bagian selanjutnya akan mengajari anda cara memprogram dengan bahasa assembly. chip tersebut tidak akan "mengubah" data apapun yang kita lewatkan melaluinya. Garis merah tebal pada gambar di atas menunjukkan system bus dari x86. mitos tersebut adalah keliru.com atau yang biasa disebut file flat binary. Obrolan bebas: "Selamat. sedangkan pada Harvard Architecture.. chip ini tidak digambarkan sebab chip tersebut "transparan" terhadap program yang kita buat. yaitu data bus. Pada skema di atas anda dapat melihat bahwa system bus terbagi menjadi tiga bagian. misalnya Video Card.strcpy pada pemrograman C yang telah kita pelajari. yang akan kita pelajari hanya bagaimana cara membuat file *. Barangkali anda bertanya-tanya.

berfungsi sebagai pointer ke data di memory yang berada pada segmen yang sedang ditunjuk oleh register DS. 1. sedangkan memori utama yang ada di sebelah kanan tidak terlalu berperan. berfungsi sebagai "akumulator" yaitu register utama yang digunakan untuk menyimpan data sementara yang akan diolah pada ALU atau FPU. maka register-register yang ada di bagian kiri gambar di atas di tampilkan lebih rinci : Dalam pemrograman assembly tingkat awal. dan lain-lain. Berikut ini ringkasannya. BIU dan register-register yang ada di dalam microprocessor. apakah kita sedang membaca data dari RAM atau dari I/O devices. Di bawah ini adalah register-register yang termasuk GPR: Register-register di atas mempunyai fungsi khusus yang agak berbeda. register ini juga digunakan sebagai tempat penyimpanan hasil pengolahan data tersebut. Pentium III. Agar lebih jelas. Register sebenarnya merupakan tempat penyimpanan dan pengolahan data yang ukurannya sangat kecil. 2. Jika data yang diolah bertipe "floating point". tetapi kecepatan akses-nya sangat tinggi. Celeron.. Control Unit adalah komponen yang bertugas mengatur lalu lintas data antara ALU. yang terjadi sebenarnya adalah pemindahan data dari memori utama (RAM) ke microprocessor x86. 3. jadi sebisa mungkin kita meletakkan data pada register ini. misalnya ke ram dari video card atau memori utama. address bus yang digunakan untuk menunjukkan alamat memory atau alamat I/O yang dituju/asal data yang dikirimkan/diterima tersebut tersebut. kita hanya akan berurusan dengan register-register yang ada di sebelah kiri. yang mengatur komunikasi microprocessor dengan system bus. alamat memori atau alamat I/O. Ketika mengeksekusi sebuah program. EAX dapat mengakses semua register lainnya dan merupakan register dengan akses tercepat. tergantung instruksi yang kita berikan. Registers adalah register-register dari x86. Pengolahan data ini melibatkan bagian microprocessor yang disebut register. BIU pada skema di atas adalah Bus Interface Unit. misalnya apakah saat ini kita sedang menulis data ke RAM atau ke I/O devices. dan control bus yang digunakan untuk mengatur "status" dari data bus dan address bus.. register adalah isi dari microprosesor itu sendiri dan yang di sebelah kanan. Namun demikian akan tetap ada sedikit penjelasan tentang segment register. kita akan lebih banyak berurusan dengan pengolahan data di dalam microprocessor. Tutorial ini hanya akan berurusan dengan General Purpose Register (GPR). bagian kiri yang diberi nama . Data di dalam sebuah x86 dapat direpresentasikan dalam bentuk byte (8 bit). berfungsi sebagai register untuk melakukan komunikasi data dengan alamat I/O. Berikut ini adalah skema dari "isi" sebuah microprocessor x86 generasi ke 6 (i686 yaitu PentiumPro. Operasi-operasi yang terjadi terhadap data yang ada pada register-register ini terjadi pada ALU kemudian hasilnya di tempatkan ke register. Gambar di atas menampilkan arsitektur dari x86 secara fungsional. sebab hal tersebut telah diatur oleh Software Development Tool yang kita gunakan (Visual C++. word (16 bit) atau dword/double word (32 bit). Pentium II. kemudian data ini diolah pada microprocessor dan kemudian di pindahkan ke bagian output yang kita inginkan. yaitu tempat penyimpanan data sementara (semacam memori) dengan kecepatan sangat tinggi. . berfungsi sebagai "counter" (bilangan yang nilainya berubah saat sebuah operasi telah dilakukan) dalam operasi menggunakan string atau dalam perulangan. Register inilah yang akan digunakan dalam pengolahan data di dalam microprocessor. maksudnya. Register EBX. jadi kita tidak perlu mengubah-ubah setting dari kedua komponen itu. Register EAX . Register ECX. yang diberi label address space adalah memori utama (RAM). namun kedua komponen tersebut "transparan" terhadap program assembly yang kita buat. Antara microprocessor dan memory utama (RAM) sebenarnya ada yang disebut Bus Interface Unit yang menghubungkan microprocessor dengan bus memory pada Northbridge dan ada pula Northbridge dari motherboard. maka pengolahannya dapat menggunakan FPU (Floating Point Unit).yang digunakan untuk mengirim data dari/ke memory maupun I/O devices. Masm atau Nasm). tidak akan berurusan dengan Segment Register. Celeron II): Pada gambar di atas. 4. Register EDX. dan lain-lain. Dalam bahasa assembly. ALU adalah Arithmetic and Logic Unit yang berfungsi sebagai komponen untuk melakukan operasi aritmetika dan logika. instruksi yang kita buat akan dieksekusi sesuai dengan alamat-alamat yang kita "minta". namun hal ini juga tergantung instruksi bahasa assembly yang kita gunakan.

Namun kita tidak perlu menjalankan komputer kita dengan sistem operasi real mode seperti DOS untuk mencoba program yang seharusnya berjalan pada real mode. sehingga sistem dapat dengan mudah crash. Selain fungsi khusus di atas. Pada mode ini. Arsitektur x86 Modern . Mode ini adalah mode yang digunakan saat komputer kita berada dalam sistem operasi protected mode. Register EDI. Protected Mode. Mode operasi adalah kondisi operasi Microprocessor tersebut yang menentukan fasilitas apa saja dari Microprocessor yang dapat diakses. yaitu anda tinggal membuat source code assembly kemudian buat executable dan jalankan pada console windows. berfungsi menyimpan alamat segmen tempat kode program yang akan dieksekusi di simpan. program itu akan otomatis berjalan pada mode ini jika memang program tersebut memanfaatkan instruksi-instruksi real mode. Stack adalah bagian memori utama tempat penyimpanan data sementara jika sebuah fungsi dieksekusi atau sebuah interupsi sedang berlangsung atau pada saat sebuah prosedur dipanggil atau pada keadaan lain saat sebuah program dengan sengaja menyimpan datanya di stack. BX . 2. 10. 7. 6. Mode ini pada dasarnya adalah emulasi sehingga tidak dijamin semua instruksi dapat dijalankan sesuai dengan yang kita inginkan. Pada mode ini seluruh feature x86 (>=i386) dapat digunakan. Biasanya stack berada pada bagian akhir memory (alamat terbesar) dan pointer ke stack (SP) dikurangi setiap kali ada data baru yang di simpan di stack. Juga berfungsi sebagai pointer ke alamat tujuan dalam operasi string. berfungsi sebagai pointer ke data yang ada pada stack(pada segmen yang sedang ditunjuk oleh register SS). misalnya EAX. Juga berfungsi sebagai pointer alamat sumber string dalam operasi string. 8. Mode Kerja Microprocessor x86 Microprocessor x86 sejak i386 mempunyai 3 macam mode operasi. EBX . misalnya instruksi apa saja yang dapat digunakan. tidak semua feature yang dimiliki Microprocessor x86 (>=i386) dapat digunakan. ECX dan EDX. Virtual-8086 mode dapat digunakan dengan mudah. berfungsi menyimpan alamat segmen tempat data program yang akan dieksekusi di simpan. dan alamat memory yang menyimpan kode sistem operasi juga dapat ditulisi. Register DS (Data Segment). sebab pada protected mode (misalnya saat anda sedang menjalankan windows 2000) ada yang disebut virtual-8086 mode. Pada mode. misalnya windows atau Linux. ukuran register yang digunakan secara default adalah 32 bit. berfungsi sebagai pointer ke data pada segmen yang sedang ditunjuk oleh register ES. selain itu akses langsung ke hardware tidak diperbolehkan kecuali program kita mendapat ijin dari sistem operasi. 9. Pada mode ini akses ke hardware secara langsung bebas dilakukan. EBX. 3. yaitu EAX. Register EBP. Pada tutorial ini. CX. berfungsi sebagai register yang menyimpan alamat segment stack saat ini. ukuran register yang digunakan secara default adalah 16 bit. Mode ini adalah mode power management untuk penghematan daya. Register SS (Stack Segment). misalnya sistem operasi tidak dapat diakses. misalnya AX. misalnya untuk program yang menggunakan device driver. Mode ini hanya digunakan pada saat komputer sedang boot atau saat tidak ada sistem operasi pada komputer yang kita miliki dan hanya bios yang dapat bekerja atau kita sedang menjalankan sistem operasi yang hanya dapat berjalan pada real mode misalnya DOS. Register ESI. Register ESP. dan lain-lain System Management Mode. dan lain-lain. Programer assembly konvensional biasanya menjalankan programnya pada real mode. Real Address Mode atau Real Mode. dan alamat kode program yang "berbahaya". ECX. Pada mode ini. berfungsi sebagai pointer ke data pada segmen yang sedang ditunjuk oleh register DS. jumlah memory yang dapat diakses dan lain-lain.5. GPR juga dapat digunakan dalam operasi pengolahan data biasa yang terjadi antara GPR tersebut dengan ALU. berfungsi sebagai pointer ke stack (pada segmen yang sedang ditunjuk oleh register SS). sesuai dengan ukuran data yang disimpan Register CS (Code Segment). yang akan digunakan secara intensif hanya 4 GPR yang pertama. Mode operasi tersebut adalah (>= i386) : 1. sehingga program yang anda buat "seakan-akan" berjalan pada real mode.

Sama seperti pada deklarasi konstanta. tipe data ini dapat menyimpan data dengan ukuran 2 byte (16 bit). maka berikan awalan (prefix) 0 jika variabel tersebut nilai varaibel tersebut diawali huruf. hanya saja sistem operasi yang benar-benar memberikan dukungan pada kemampuan ini hanya Linux dan Windows 2000 edisi tertentu. Tool yang anda butuhkan untuk mencoba contoh-contoh yang ada adalah Nasm atau Microsoft Macro Assembler 6. Sintaks yang digunakan untuk mendeklarasikan variabel dengan tipe ini adalah db word. cara menggunakan kedua tool ini akan dijelaskan. Namun kita tidak perlu khawatir bahwa program yang kita buat tidak akan berjalan pada "mesin-mesin" tersebut. formatnya adalah: nama_variabel tipe_data nilai_variabel pada sintaks ini. jika tidak diberi akhiran maka nilai tersebut akan dianggap desimal (basis 10). kemampuan mengalamatkan memori yang ada sebenarnya sudah mencapai 64 GB dengan menggunakan apa yang disebut Physical Address Extension (PAE). sebab semuanya kompatibel ke belakang dengan instruksi yang dibuat untuk "mesin-mesin" generasi sebelumnya. Di luar itu semua masih banyak lagi fasilitas yang sebenarnya ada di dalam microprocessor tersebut namun sangat jarang atau bahkan tidak dimanfaatkan. Athlon juga mempunyai 3 execution unit seperti ini. Selain itu. Setiap instruksi yang dapat diubah menjadi machine code oleh assembler disebut sebagai instruction set. pada salah satu gambar di atas anda melihat ada yang di sebut execution unit. pada Microprocessor modern terdapat floating point unit yang mempunyai sangat banyak register. tipe data ini dapat menyimpan data dengan ukuran 1 byte (8 bit). nama_variabel adalah nama dari variabel yang diinginkan. jadi hasilnya : bank_mask equ 0CFCh Sintaks di atas berlaku baik pada masm maupun nasm. tetapi semuanya memiliki instruction set yang bersifat umum yang dapat dieksekusi pada seluruh microprocessor tersebut. Sebelum mempelajari instruction set. Anda perlu berhati-hati jika menyatakan konstanta yang nilainya diawali dengan huruf dalam hexadecimal.11. Sintaks Bahasa Assembly x86 Sekarang kita akan mempelajari sintaks yang digunakan dalam bahasa assembly untuk x86. Pentium III mempunyai 3 execution unit semacam ini. maka ketiga instruksi tersebut dapat dieksekusi hanya dalam 1 cycle (cycle adalah clock yang dibutuhkan untuk menyelesaikan eksekusi 1 instruksi). jika ada 3 instruksi yang tidak saling berhubungan. Sintaks yang digunakan untuk mendeklarasikan variabel dengan tipe ini adalah dw dword. jika anda mendeklarasikan variabel dengan nilai hexadecimal. Kita akan menggunakan instruction set yang dapat dieksekusi oleh microprocessor i386 ke atas. maka anda harus memberi awalan 0 saat mendeklarasikannya. Setiap generasi microprocessor mempunyai instruction set yang jumlahnya berbeda-beda. dalam bahasa asssembly x86 dikenal beberapa tipe data yaitu: byte. tipe_data adalah tipe data dari variabel tersebut. Contoh: test db 0FEh . bukan 4 GB seperti yang saat ini sedang banyak diributkan orang. Pentium III atau Pentium 4 memiliki arsitektur internal yang sedikit berbeda dengan apa yang dideskripsikan di sini sebab microprocessor tersebut sudah begitu kompleks dengan jumlah register yang jauh lebih banyak dan memanfaatkan apa yang disebut superscalar operation. Selanjutnya kita akan mempelajari sintaks untuk membuat variabel. tipe data ini dapat menyimpan data dengan ukuran 4 byte (32 bit). jadai anda dapat membayangkan. terlebih dahulu kita akan mempelajari cara membuat variabel dan konstanta dalam bahasa assembly. misalnya untuk SSE (Streaming SIMD) terdapat 8 register floating point. misalnya: sejak microprocessor generasi i686 (PentiumPro).Modern Microprocessor x86 modern seperti Athlon. Sintaks untuk membuat konstanta adalah: nama_konstanta equ nilai_konstanta sintaks ini analog dengan sintaks berikut dalam bahasa C: #define nama_konstanta nilai_konstanta contoh: bank_mask equ 20000840h akhiran h pada sintaks di atas adalah akhiran yang menunjukkan bahwa nilai tersebut adalah nilai hexadecimal. misalnya: sebuah konstanta bernilai CFCh. Sintaks yang digunakan untuk mendeklarasikan variabel dengan tipe ini adalah dd contoh: test db 78h akhiran h pada sintaks di atas adalah akhiran yang menunjukkan bahwa nilai tersebut adalah nilai hexadecimal.

instruksi ini untuk memanggil interupsi bios atau sistem operasi dos. Perlu anda perhatikan bahwa jika kita berada pada mode virtual-8086 maka instruksi seperti ini akan tetap menghasilkan keluaran.src hasilnya disimpan pada dest.src instruksi ini melakukan bitwise and terhadap src dan dest dan . Hal ini perlu anda perhatikan saat memberi nama variabel atau konstanta pada program yang anda buat. instruksi ini digunakan untuk berpindah (tanpa syarat) ke instruksi yang "sejajar" dengan label pada source code yang kita buat. kadang disebut juga subrutin . sebab tidak ada instruksi yang dapat langsung memindahkan isi sebuah alamat memory ke alamat memory lainnya. menyimpan isi seluruh register GPR yang pada stack. 16 atau 32 bit. je label jmp label inc var call proc int num xor dest. me-restore isi seluruh register GPR yang tadinya disimpan di stack dengan instruksi pushad. num adalah nomor dari interupsi yang akan dipanggil instruksi ini melakukan bitwise xor terhadap src dan dest dan merupakan GPR. proc adalah label (nama) dari prosedur yang akan kita panggil. tetapi mov dest. comment adalah komentar. var adalah sebuah GPR instruksi ini digunakan untuk memanggil sebuah prosedur.) akan dianggap sebagai komentar sampai baris tersebut berakhir.Perlu anda ketahui bahwa kebanyakan assembler adalah tidak case sensitive. dest biasanya adalah register si.src salah satunya harus merupakan register. Label biasanya digunakan pada awal instruksi yang akan mengalami perulangan atau pada instruksi yang akan dipanggil dalam sebuah jump. Jika bit ZF (Zero Flag) pada flag register bernilai 1. instruction adalah instruksi yang akan dieksekusi. Prosedur adalah sekumpulan instruksi dengan fungsi tertentu. instruksi ini digunakan untuk me-restore isi register flag yang tadinya di simpan di stack dengan instruksi pushfd.src src dan hasilnya di simpan pada dest. Instruksi ini biasanya digunakan pada operasi string. ada juga instruksi yang tidak mempunyai operand sama sekali. and dest. instruksi ini digunakan untuk berpindah (dengan syarat) ke instruksi yang "sejajar" dengan label pada source code yang kita buat. Berikut ini beberapa instruction set yang akan kita pelajari: Instruction Set Kegunaan instruksi ini memindahkan isi dari src ke dest. tetapi keluaran tersebut sebenarnya adalah hasil emulasi.Instruksi ini juga dapat menggunakan operand 8. Sintaks dasar sebuah pernyataan dalam bahasa assembly adalah : label: instruction operands . jumlah operand tergantung instruksi yang kita gunakan. comment label pada sintaks di atas adalah opsional. src maupun dest dapat merupakan register atau alamat memory. src dan dest biasanya instruksi ini menghitung alamat efektif (effective address) dari lea dest. operands adalah variabel yang akan dimanipulasi. instruksi ini digunakan untuk menaikkan nilai yang ada pada register var satu satuan. karakter yang ada di belakang tanda titik koma (. pushfd popfd pushad popad instruksi ini digunakan untuk menyimpan isi register flag di stack. maka program akan dilanjutkan ke label jika tidak maka eksekusi dilanjutkan ke instruksi selanjutnya setelah je. dan src adalah variabel yang akan dicari alamat efektifnya.

tidak selamanya apa yang kita inginkan dapat kita peroleh dengan HLL. set (diubah menjadi 1). instruksi ini digunakan untuk membandingkan dest dan src. saat kecepatan menjadi hal yang sangat krusial maka tak ada yang dapat mengalahkan programming menggunakan bahasa assembly. src biasanya register dx yang isinya adalah alamat I/O yang datanya akan diambil. Java atau Visual Basic 'berkuasa'. src dan dest biasanya merupakan GPR. in dest. Menghentikan eksekusi program dan mengembalikan kontrol program ke instruksi sesudah instruksi pemanggilan rutin ini (sesudah instruksi yang call atau jump yang memanggil rutin ini). anda dapat lihat pada Intel Software Developer's Manual volume 1: Basic Architecture dan Intel Software Developer's Manual volume 3: System Programming Guide.src retn cmp dest. dest biasanya adalah register dx yang menunjukkan alamat yang akan dikirimi data. kalau HLL sudah ada? Jawaban penulis adalah.src isinya adalah data yang akan dikirim. Penulis sendiri sudah beberapa kali menemukan kasus dimana kemampuan mengutak-atik hardware dalam software yang penulis buat tidak dapat disediakan oleh bahasa C atau bahasa lain dalam bentuk API (Application Programming Interface) pada sistem operasi. sehingga pemrograman assembly harus dilakukan. tergantung ukuran operandnya (data yang akan diterima).hasilnya disimpan pada dest. Berikut ini adalah source codenya: . dan satu lagi. instruksi ini adalah instruksi I/O yang mengirim data ke alamat I/O(device). src dan dest biasanya merupakan GPR. dest biasanya adalah register al. saat HLL(High Level Language) seperti C++.MODEL TINY CSEG SEGMENT PARA PUBLIC USE16 'CODE' ASSUME CS:CSEG org 100h start: . Program ini akan menampilkan sebuah string pada console jika dijalankan.src instruksi ini melakukan bitwise or terhadap src dan dest dan hasilnya disimpan pada dest. pemrograman dengan bahasa assembly 'sudah mati'. Banyak juga orang berpikir untuk apa kita bersusah-susah belajar assembly. sekarang saatnya menggunakan sintaks tersebut untuk membuat sebuah program sederhana. Obrolan bebas: "Banyak orang berpikir bahwa di jaman seperti ini.ax atau eax yang out dest. instruksi ini adalah instruksi I/O yang memasukkan data dari alamat I/O (device). or dest. Jika bagian sebelum retn ini tidak dipanggil oleh rutin lain maka program diakhiri (sistem operasi mengambil alih kembali kontrol atas komputer).src jika hasilnya sama maka Zero Flag pada flag register akan di Untuk instruction set yang lain.ax atau eax. Jadi kita harus ingat bahwa 'Assembly Programming never die'" Program Assembly Sederhana Pada bagian sebelumnya kita telah mempelajari beberapa sintaks assembly. src biasanya register al.386 .

.0. Sekarang kita akan membahas apa saja yang dilakukan oleh source code ini. karakter yang akan ditampilkan diberikan .386 .'$' CSEG ENDS end start Source code di atas adalah source code dalam masm (Microsoft Assembler). kemudian membukanya dengan Notepad. service 0Eh .save isi semua GPR .07h . anda harus meletakkan source code di atas satu direktori dengan ML.0Eh ..0..cs:0+[si] .restore semua GPR popfd .exe . kemudian menyimpannya dengan ekstensi *.asm..warna foreground xor bh..13 DB 0. akan muncul bug tanpa ini MORE_DIS:mov al..karakter yang akan ditulis ada pada al cmp al.0.com dari source code di atas. tetapi editor tersebut harus "netral"..0.panggil int 10h (serice dari video bios) jmp MORE_DIS NO_MORE_DIS: popad .exe dan Link. maksudnya tidak menambahkan formatting character ke dalam source code tersebut.10.asm adalah source code tersebut.0. Anda dapat menggunakan editor lain.'$' .10. misalnya MS Word tak dapat digunakan sebab menyalahi aturan ini (menambahkan formatting character).13. Untuk membuat file *.Routine utama pushfd ..0.0.msg mov ah. Program di atas akan menghasilkan output: Your wish is my command Tweaking your chipset. jika anda belum ada pada direktori source code tsb maka cd ke direktori itu: ml /AT sourcecode. Menampilkan karakter dilakukan melalui interrupt 10h.restore semua flags retn .11) kemudian mengunakan perintah berikut di dalam console windows pada direktori source code tersebut.gunakan page 0.asm /link /TINY dengan sourcecode.0.bh . melalui register si lea si. Jadi program yang sangat sederhana ini hanya menampilkan sebuah string di layar (console) saat dieksekusi.13 DB 10.. dari bios video card.Definisi Variabel msg: DB 10.return / akhiri program .'$' menandakan akhir string je NO_MORE_DIS inc si int 10h .13.save flag pushad .'Tweaking your chipset..'Your wish is my command'. Pada bagian awal source code ini anda melihat: .'.0.0.10.0.0.13 DB 0.exe dari Masm (penulis menggunakan Masm 6. Anda dapat meng-copy source code di atas.gunakan service 0Eh mov bl.

warna foreground bh. Pernyataan: adalah sebuah label untuk menandai awal program.0.0.0.0.gunakan service 0Eh bl.13.0. PARA artinya machine code yang dihasilkan harus diurutkan dalam format 16 bit. String ini ditampilkan dengan perintah: lea .10.bh . Sebelum memberikan kendali ke sistem operasi.karakter yang akan ditulis ada pada al cmp al. ukuran register secara default adalah 16 bit). sintaks: CSEG SEGMENT PARA PUBLIC USE16 'CODE' ASSUME CS:CSEG artinya adalah kita menginginkan agar assembler membuat penyataan-pernyataan selanjutnya berada dalam satu segmen saat dibuat machine code yaitu pada CSEG. itulah sebabnya pada bagian awal program penulis mengatakan bahwa kita tidak perlu pusing dengan segment register sebab kita hanya menggunakan satu segmen saja.hitung dan pindahkan alamat label msg register si ah.0.10. Selanjutnya. Kedua penanda (marker) ini harus ada agar masm dapat bekerja. Variabel terakhir dari kumpulan byte (kumpulan byte seperti ini biasa disebut string sebab isinya adalah karakter) ini berisi karakter '$'. Dalam masm. File *. yaitu machine code yang dihasilkan langsung dapat dijalankan. akan muncul bug tanpa ini mov al.'$' menandakan akhir string MORE_DIS: .13 DB 0. anda harus memberikan sebuah label untuk menandai bagian awal instruksi yang dapat diubah menjadi machine code. Kemudian pernyataan: org 100h start: artinya adalah machine code ini akan ditempatkan pada memory dengan alamat 100h+alamat segmen yang ditunjuk oleh CS. dan segmen sesudah pernyataan ini adalah segmen kode program (lihat kembali penjelasan segment register yaitu CS dan DS).0.10..Sintaks ini maksudnya adalah machine code yang dihasilkan oleh program ini hanya kompatibel (dapat dieksekusi) pada processor i386 atau yang lebih baik. Nilai 0 artinya karakter kosong.0Eh .0.13 DB 0.gunakan page 0. )hanya sampai pada bagian ini saja..13.com. Instruksi-instruksi selanjutnya adalah instruksi untuk menampilkan string.'$' .ke mov mov xor si. Kemudian sintaks: ..'. dan seterusnya dengan variabel-variabel selanjutnya.msg .com sebenarnya adalah file flat binary.0. kita menyatakan sejumlah variabel bertipe byte dengan msg digunakan sebagai label untuk menandai alamat awal dari kumpulan variabel bertipe byte ini. Pernyataan DB 10. program ini merestore kembali nilai GPR dan flag yang lama dengan instruksi: popad popfd sehingga bug diharapkan tidak akan muncul.13 adalah sebuah pernyataan definisi dua buah variabel bertipe byte yang nilainya diinisialisasi menjadi 10 dan 13.'Your wish is my command'.13 berarti karakter CR(Carriage return/Enter) dan LF (Line Feed / baris yang baru). PUBLIC USE16 'CODE' artinya adalah machine code yang dihasilkan akan berjalan secara default dalam processor x86 pada real mode (sebab pada mode ini. String ini disimpan pada sebuah variabel bertipe db (byte).'Tweaking your chipset.'$' baris-baris program ini artinya. Pada bagian akhir program anda melihat sintaks: end start sintaks ini untuk menandai bagian akhir dari program yang kita buat.MODEL TINY maksudnya adalah kita akan membuat sebuah file *.0. Nilai 10. Sintaks: pushfd pushad sintaks ini artinya: menyimpan isi dari GPR dan Flag Register ke stack. Hal ini dilakukan pada baris: msg: DB 10.0. Tujuannya adalah untuk menghindari kesalahan (bug) saat pernyataan-pernyataan dibawahnya selesai dieksekusi dan kendali komputer kembali ke sistem operasi. Pada bagian akhir program anda melihat sintaks: CSEG ENDS sintaks ini memberitahu kepada masm bahwa kode program untuk code segment (yang berawal pada CSEG .13 DB 10.. File *.0.com hanya menggunakan satu segment pada real mode atau mode virtual-8086.07h .cs:0+[si] .

baca kembali deskripsi tentang istruction set yang ada pada bagian sebelumnya untuk memahami apa saja yang dilakukan oleh setiap instruksi. Pada saat interupsi terjadi. Untuk memulai pembahasan. dengan keyword ini kemungkinan besar anda akan sampai ke situs yang menyimpan interrrupt list dari Ralph Brown. dan ditampilkan dengan memanggil interupsi 10h. Jika anda masih bingung. jika anda ingin mencari di web maka gunakan search engine dengan keyword "Ralph Brown interrupt list" atau "interrupt list". tampilan pada layar dilakukan dengan menggunakan bantuan bios VGA card. silahkan mencari daftar interupsi di buku pemrograman atau di web. dan lain-lain." Penggunaan Assembly dan C dalam satu Program Pada bagian ini kita akan membahas bagaimana menggunakan sintaks bahasa assembly di dalam sebuah program yang menggunakan bahasa C. Hal ini terus diulang sampai karakter yang ada pada al adalah '$'.panggil int 10h (serice dari video bios) jmp MORE_DIS NO_MORE_DIS: Pada potongan source code di atas.je NO_MORE_DIS inc si int 10h . "state" processor. merupakan daftar interupsi paling lengkap untuk x86. yaitu data-data yang ada pada register-register semuanya di simpan pada stack dan sistem mengeksekusi interrupt handler. Hal ini dilakukan dengan cara memanggil interupsi13 nomor 10h dengan register ah bernilai 0Eh. Interrupt handler menyediakan "service" kepada software yang kita buat untuk hal-hal tertentu yang sering dilakukan. hal ini dapat dilihat pada instruksi cmp al. digunakan jika kita menggunakan banyak halaman BL = warna foreground (hanya pada mode grafik) Jadi baris program int 10h maksudnya adalah tampilkan karakter dan setting yang sudah kita siapkan (pada register-register yang dicek oleh interupsi ini) ke layar. Hal ini disebabkan oleh waktu yang terbatas untuk membuat tutorial ini. kode program ini biasa disebut Interrupt Handler. karakter yang alamatnya ditunjukkan oleh gabungan register cs dan si dipindahkan terus menerus ke al. kita akan membedah potongan source code driver yang telah kita bahas sebagian sebelumnya. saat karakter ini diperoleh (yaitu pada saat register si menunjuk ke variabel terakhir setelah label msg). di dalam loop ini.misalnya tampilan ke layar atau membaca sesuatu dari hard drive. ULONG mask) { //Patch the chipset __asm { . interupsi ini akan memanggil kode program pada bios vga card untuk menampilkan karakter yang berada pada register al. Register yang dicek oleh interupsi ini (int 10h) selengkapnya sbb: AH = 0Eh AL = karakter yang akan ditampilkan BH = nomor page (halaman). Daftar inilah yang. Untuk mengetahui tentang nomor interupsi dan apa yang dilakukan. Untuk menampilkan seluruh karakter digunakan loop pada label MORE_DIS s/d NO_MORE_DIS. program akan keluar ke label NO_MORE_DIS. void PatchPCI(ULONG reg_addr. Obrolan bebas: "Penulis mohon maaf karena pada tulisan kali ini belum dapat membahas penggunaan Nasm untuk program di atas. Catatan: 13 Interupsi adalah sebuah mekanisme untuk mengalihkan eksekusi program untuk menjalankan kode program yang sudah disediakan oleh bios atau sistem operasi atau hardware (microprocessor). sebab baris je (jump if equal) akan membuat eksekusi program berpinda ke label NO_MORE_DIS.'$' .

scanf("%d".pushfd . UINT hasil_operasi. Dua instruksi pertama dan dua instruksi terakhir sudah dibahas sebelumnya. ECX. Untuk memperjelas konsep yang sudah anda pelajari.//fetch the input port addr of PCI cfg space out dx.dx or eax.//save all flags and regs pushad mov eax. Instruksi selanjutnya. UINT tambah(UINT suku1. dst.mask . void main() { UINT suku1.reg_addr . Selanjutnya aspek teknis yang harus anda perhatikan adalah.//restore all flags popfd } } Pada source code di atas ada keyword baru. UINT suku2).//fetch the address of the regs to be patched mov dx. Jadi microprocessor kita telah berada pada protected mode.h > typedef unsigned int UINT.PCI_DATA_PORT in eax.//mask the regs value (activate certn.eax mov dx. #include < stdio. yaitu __asm.eax mengirimkan data yang ada pada register eax ke alamat yang ditunjuk oleh register dx (pada baris sebelumnya alamat ini telah dimasukkan). jadi GPR yang tersedia adalah EAX. yaitu: mov dx. Instruksi selanjutnya adalah: mov eax. EBX.EDX.eax popad . reg_addr adalah variabel input yang diberikan oleh fungsi yang memanggil fungsi PatchPCI.PCI_ADDR_PORT . dan hasilnya disimpan pada register eax. Sekarang pembahasan source code di atas.&suku1). Instruksi berikutnya: or eax. bits) out dx. hanya keyword (ditambah {} jika anda ingin mengeksekusi blok pernyataan assembly) ini saja yang anda butuhkan untuk menambahkan instruksi assembly ke source code anda. Keyword ini digunakan untuk memberi tahu compiler Visual C++ bahwa instruksi pada pernyataan atau blok pernyataan selanjutnya adalah instruksi assembly (ingat kembali bahwa blok pernyataan dibatasi oleh kurung kurawal / {}). Kemudian instruksi: in eax.dx mengambil data dari alamat yang ditunjukkan oleh register dx.PCI_ADDR_PORT mengisi register dx dengan konstanta PCI_ADDR_PORT. printf("ketikkan suku pertama : "). Instruksi berikutnya: out dx. Jadi. source code di atas akan berjalan pada device driver dalam windows. berikut ini diberikan sebuah contoh program sederhana. UINT suku2. Instruksi selanjutnya telah kita bahas sebelumnya.mask melakukan operasi bitwise or dengan variabel mask yang diperoleh dari parameter kedua fungsi PatchPCI. . dengan demikian ukuran default register-register yang tersedia bagi programer assembly adalah 32 bit. Baris-baris selanjutnya dapat anda pahami dari pembahasan sebelumnya.reg_addr instruksi ini memindahkan isi variabel reg_addr ke register EAX.

/* simpan isi GPR*/ mov eax. hasil_operasi= tambah(suku1.suku1 ." Beberapa Sumber Informasi Berikut ini adalah beberapa sumber informasi yang berkaitan dengan tutorial ini. Penulis menyadari bahwa pada tutorial ini masih banyak yang kurang jadi tutorial ini akan diupdate jika penulis sudah punya waktu lagi agar semakin bermanfaat dan mudah dipahami. Obrolan bebas: "Selamat! Sekarang anda sudah dapat membuat program dengan bahasa C dan assembly. Source code tersebut tidak akan dijelaskan lagi oleh penulis sebab cukup mudah dipahami dan komentar yang ada pada source code nya cukup jelas. ./* restore kembali isi GPR */ popfd .suku2 . dan anda dapat memperoleh penjelasan tambahan pada sumber-sumber tersebut. } UINT tambah(UINT suku1. untuk Software Development tool yang berbeda./* kopi hasil penjumlahan ke variabel hasil*/ popad . hasil_operasi). anda tinggal berlatih untuk membuat diri anda semakin terampil :)./* kopi suku1 ke eax 8 */ add eax. UINT suku2) { UINT hasil.&suku2)./* simpan isi register flag */ pushad . __asm { pushfd . anda harus membaca lagi dukumentasinya. scanf("%d". } Contoh keluaran dari program ini adalah: ketikkan suku pertama : 5 ketikkan suku kedua : 9 Hasil penjumlahan kedua suku itu adalah : 14 Program di atas dapat anda coba. printf("Hasil penjumlahan kedua suku itu adalah : %d \n"./* jumlahkan suku2 ke suku1. simpan hasil di eax */ mov hasil./* restore kembali isi register flag */ } return hasil. Untuk memperdalam ilmu anda.eax .printf("ketikkan suku kedua : "). anda dapat membaca referensi yang penulis cantumkan. Sampai di sini anda sudah dapat membuat sebuah program yang memanfaatkan bahasa assembly dan C sekaligus. tetapi perhatikan bahwa sintaks di atas hanya berlaku untuk Visual C++.suku2).

1997.. Pada buku ini Chapter 5 dan 10 ada beberapa uraian yang akan sangat membantu anda memahami konsep pointer.org.k. Situswww.k.Addison Wesley 1986. Situs ini menyimpan beberapa data teknis microprocessor x86. 9. programnya sendiri sangat bagus.k.arstechnica. . Buku ini adalah eBook yang juga di hosting oleh beberapa situs programming lain selain link di atas. 4. Sebagian isi dari situs ini dapat anda peroleh pada CD MSDN.microsoft. Inc. Situs ini adalah situs rujukan para developer software untuk produk microsoft. Buku ini adalah buku standar bagi para pemrogram Assembly x86. Merupakan referensi yang sangat baik bagi para programmer yang ingin tahu cara kerja compiler dan mungkin ingin membuat compiler sendiri. pada kedua versi tersebut terdapat tutorial yang cukup komprehensif pada file help yang di sediakan. memang sampul bukunya bergambar naga. Situs ini menyimpan beberapa data teknis microprocessor x86.x86. 2. SAMS Publishing 1997. bahkan dalam beberapa segi masih lebih baik di banding Tasm (Turbo Assembler) buatan Borland.a Aco.com. Credits Penulis mengucapkan terima kasih kepada: • • • • • Donovan Dennis. Situs nasm.sandpile. 3.. untuk sistem operasi Linux dan Windows.. Ravi Sethi. thanks atas feedback anda semua :) copyright © 2003. Nasm tersedia dalam dua versi. anda dapat mencari pada search engine dengan keyword "The Art of Assembly". Techniques..a Pinczakko Kembali ke halaman utama . Penulis kadang-kadang menggunakan assembler ini. Aho.sourceforge. Situs www.2005. Situs www. Jika link ini ternyata sudah tidak ada lagi. Fritz Edison a. Buku C For Scientist and Engineers International Edition. yaitu Netwide Assembler (Nasm). Jeffrey D. atas early feedback-nya terhadap artikel Tutorial Membuat Driver .a Mitz. 8. Buku Teach Yourself C++ in 21 Days Second Edition. Vavan a. Buku ini kadang disebut sebagai "The Dragon Book" oleh para software developer.net. juga atas early feedback-nya terhadap artikel Tutorial Membuat Driver . and Tools. Pada situs ini anda dapat mendownload sebuah assembler free.1. Richard Johnsonbaugh and Martin Kalin.Prentice Hall. Situs ini memiliki beberapa tulisan teknis yang sangat bagus tentang arsitektur microprocessor pada bagian CPU Theory and Praxis. yang memberi feedback terhadap tutorial ini selama masa pembuatan yang cukup melelahkan Kru OCindo.2006 Darmawan M S a.2004. Buku The Art of Assembly Language Programming.org.com. 7. Buku Compilers Principles. 6. Ullman . Alfred V. thanks a lot for hosting my articles :) Peserta polling pada forum OCindo. Situs msdn. 5.

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->