Chapter 7
Saat ini, jarang sekali sebuah sistem dikembangkan hanya dengan bahasa assembly. Umumnya, sistem dibuat dengan C/C++ yang dikombinasikan dengan assembly language.
Assembly biasanya dipakai untuk:
-
Tugas yang sulit atau tidak efisien dilakukan di C/C++ (misalnya kontrol software untuk peripheral interface, driver dengan interrupts).
-
Instruksi khusus prosesor (contoh MMX dan SSE) yang tidak sepenuhnya didukung oleh C/C++.
C++ memang menyediakan makro untuk instruksi khusus tersebut, tetapi penggunaan langsung dengan assembly lebih sederhana. Oleh karena itu, penggabungan C/C++ dengan assembly banyak dipakai dalam aplikasi nyata.
Buku/teks ini menggunakan Microsoft Visual C/C++ Express sebagai compiler utama, namun kode bisa diadaptasi ke compiler lain selama mengikuti standar ANSI C/C++.
-
Aplikasi 16-bit ditulis menggunakan Visual C/C++ v1.52 (tersedia gratis di Microsoft Windows Driver Development Kit).
-
Aplikasi 32-bit ditulis menggunakan Visual C/C++ v6 ke atas, lebih disarankan menggunakan Visual C++ .NET 2003 atau Visual C++ Express (gratis diunduh dari msdn.com).
Chapter Objectives
Setelah mempelajari bab ini, mahasiswa/pembaca diharapkan dapat:
-
Menggunakan assembly language di dalam blok
_asmpada program C/C++. -
Memahami aturan penggunaan mixed language programming (C/C++ + assembly).
-
Mengakses dan memanipulasi data dan struktur C/C++ dengan assembly.
-
Menggunakan assembly untuk antarmuka 16-bit (DOS) dan 32-bit (Windows).
-
Mengintegrasikan object file assembly dengan program C/C++.
Menggunakan Assembly Language dengan C++ untuk Aplikasi DOS 16-Bit
Bagian ini menjelaskan bagaimana cara menggabungkan perintah assembly language ke dalam program C/C++. Hal ini penting karena kinerja suatu program sering kali bergantung pada penyisipan rangkaian perintah assembly untuk mempercepat eksekusi. Seperti yang disebutkan pada bagian pendahuluan bab ini, assembly language juga digunakan untuk operasi I/O pada sistem tertanam (embedded systems).
Teks ini mengasumsikan bahwa Anda menggunakan salah satu versi program Microsoft C/C++, tetapi program C/C++ lain seharusnya tetap dapat berfungsi seperti yang ditunjukkan, selama mendukung perintah inline assembly. Satu-satunya perbedaan mungkin adalah pada pengaturan paket C/C++ agar dapat berjalan dengan assembly language. Bagian ini mengasumsikan bahwa Anda membangun aplikasi 16-bit untuk DOS. Pastikan perangkat lunak Anda dapat membangun aplikasi 16-bit sebelum mencoba program dalam bagian ini.
Jika Anda membangun aplikasi 32-bit dan mencoba menggunakan fungsi DOS INT 21H, maka program akan mengalami crash karena pemanggilan DOS tidak diizinkan secara langsung. Bahkan, pemanggilan tersebut tidak efisien untuk digunakan dalam aplikasi 32-bit.
Untuk membangun aplikasi DOS 16-bit, Anda memerlukan compiler 16-bit lama (legacy) yang biasanya dapat ditemukan pada direktori:
dari Windows DDK (Driver Development Kit). Paket DDK ini bisa diperoleh dari Microsoft Corporation dengan biaya pengiriman yang kecil. Compiler yang digunakan adalah CL.EXE dan program linker 16-bit adalah LINK.EXE, keduanya terletak di direktori yang disebutkan.
Karena path (jalur) pada komputer Anda mungkin menunjuk ke program linker 32-bit, sebaiknya Anda bekerja langsung dari direktori ini agar linker yang tepat digunakan saat melakukan linking pada file objek yang dihasilkan oleh compiler. Proses kompilasi dan linking harus dilakukan melalui command line, karena tidak ada antarmuka visual atau editor yang disediakan dengan compiler dan linker ini. Program ditulis menggunakan Notepad atau DOS Edit.
Aturan Dasar dan Program Sederhana
Sebelum kode assembly dapat dimasukkan ke dalam program C/C++, beberapa aturan harus dipahami terlebih dahulu. Contoh 7–1 menunjukkan bagaimana menempatkan kode assembly di dalam sebuah blok assembly language pada program C/C++ sederhana.
Perhatikan bahwa seluruh kode assembly dalam contoh ini ditempatkan di dalam blok _asm. Label juga digunakan, seperti yang ditunjukkan dengan label big: dalam contoh tersebut. Sangat penting untuk menggunakan huruf kecil untuk setiap kode inline assembly. Jika menggunakan huruf besar, beberapa instruksi assembly dan register akan berbenturan karena sudah didefinisikan sebagai kata kunci di dalam bahasa C/C++.
Contoh 7–1 ini tidak menggunakan perintah C/C++ selain prosedur main. Program ini (Contoh 7–1) membaca satu karakter dari keyboard console, kemudian menyaringnya melalui assembly language sehingga hanya angka 0 hingga 9 yang dikirim kembali ke tampilan layar (video display).
Meskipun contoh program ini tidak melakukan banyak hal, namun menunjukkan bagaimana cara menyiapkan dan menggunakan pemrograman sederhana dengan assembly language.
Register AX tidak disimpan dalam Contoh 7–1, tetapi digunakan oleh program. Sangat penting untuk dicatat bahwa register AX, BX, CX, DX, dan ES tidak pernah digunakan oleh Microsoft C/C++. (Fungsi register AX saat mengembalikan nilai dari sebuah prosedur akan dijelaskan lebih lanjut pada bab ini.) Register-register tersebut dapat dianggap sebagai scratchpad registers (tempat penyimpanan sementara) yang bisa digunakan bebas dengan assembly language.
Jika Anda ingin menggunakan register lain, pastikan untuk menyimpannya terlebih dahulu dengan perintah PUSH sebelum digunakan, dan mengembalikannya dengan POP setelah selesai. Jika Anda tidak menyimpan register yang digunakan oleh program, maka program mungkin tidak berjalan dengan benar dan bahkan bisa menyebabkan komputer crash.
Jika prosesor 80386 atau yang lebih baru digunakan sebagai dasar program, maka register EAX, EBX, ECX, EDX, dan ES tidak perlu disimpan. Tetapi jika ada register lain yang digunakan, maka register tersebut harus disimpan atau program akan crash.
Untuk melakukan kompilasi program:
-
Jalankan Command Prompt dari menu Start → Accessories.
-
Ubah path ke:
jika memang di situlah lokasi Windows DDK Anda.
3. Anda juga perlu masuk ke direktori:
dan menyalin file slibce.lib ke direktori:
-
Pastikan Anda menyimpan program di path yang sama, dengan ekstensi .c pada nama file. Jika menggunakan Notepad, pilih All Files pada bagian File Type saat menyimpan.
-
Untuk mengompilasi program, ketik:
Perintah ini akan menghasilkan file .exe (opsi /G3 menunjukkan target prosesor 80386). (Lihat Tabel 7–1 untuk daftar switch compiler /G).
Jika muncul error, tekan Enter saja untuk mengabaikannya. Error tersebut hanya berupa warning yang tidak akan menyebabkan masalah saat program dijalankan. Ketika dijalankan, Anda hanya akan melihat angka yang ditampilkan kembali (echo) di layar DOS.
Contoh 7–2 menunjukkan bagaimana cara menggunakan variabel dari C dalam program assembly sederhana. Pada contoh ini, tipe variabel char (1 byte dalam C) digunakan untuk menyimpan beberapa data 8-bit. Program tersebut melakukan operasi:
di mana X dan Y adalah angka satu digit, dan Z adalah hasilnya.
Seperti yang bisa Anda bayangkan, inline assembly dalam C dapat digunakan untuk belajar assembly language dan menulis banyak program dalam buku teks ini. Tanda semicolon ( ; ) digunakan untuk menambahkan komentar pada listing di dalam blok _asm, sama seperti pada assembler normal.
Apa yang Tidak Dapat Digunakan dari MASM di Dalam Blok _asm
Meskipun MASM memiliki beberapa fitur menarik, seperti perintah kondisional (.IF, .WHILE, .REPEAT, dan sebagainya), inline assembler tidak mendukung perintah kondisional dari MASM, juga tidak mendukung fitur MACRO yang ada di assembler.
Alokasi data dalam inline assembler ditangani oleh bahasa C, bukan dengan menggunakan direktif DB, DW, DD, dan sejenisnya. Hampir semua fitur lain masih didukung oleh inline assembler. Kekurangan fitur-fitur ini dapat menimbulkan sedikit masalah, yang akan dibahas pada bagian-bagian selanjutnya di bab ini.
Menggunakan String Karakter
Contoh 7–3 menunjukkan program sederhana yang menggunakan string karakter yang didefinisikan dengan bahasa C, lalu menampilkannya sehingga setiap kata ditulis pada baris terpisah.
Perhatikan perpaduan antara pernyataan C dan perintah assembly. Pernyataan WHILE mengulangi instruksi assembly sampai ditemukan null (00H) di akhir string karakter.
Jika null tidak ditemukan, instruksi assembly akan menampilkan satu karakter dari string tersebut, kecuali jika yang ditemukan adalah spasi. Untuk setiap spasi, program menampilkan kombinasi carriage return/line feed. Hal ini menyebabkan setiap kata dalam string ditampilkan pada baris yang terpisah.
Menggunakan Struktur Data
Struktur data adalah bagian penting dari sebagian besar program. Bagian ini menunjukkan bagaimana cara menghubungkan (interface) sebuah struktur data yang dibuat dalam bahasa C dengan bagian assembly language yang memanipulasi data di dalam struktur tersebut.
Contoh 7–5 menggambarkan sebuah program singkat yang menggunakan struktur data untuk menyimpan nama, umur, dan gaji. Program kemudian menampilkan setiap entri dengan menggunakan beberapa prosedur dalam assembly language.
Meskipun prosedur string menampilkan sebuah string karakter (seperti yang ditunjukkan pada Contoh 7–4), prosedur ini tidak menampilkan kombinasi carriage return/line feed—sebagai gantinya, program menampilkan sebuah spasi.
Prosedur Crlf menampilkan kombinasi carriage return/line feed, sedangkan prosedur Numb menampilkan bilangan integer.
Contoh Program Campuran Bahasa (Mixed-Language Program)
Untuk melihat bagaimana teknik ini dapat diterapkan pada program apa pun, Contoh 7–6 menunjukkan bagaimana sebuah program dapat melakukan beberapa operasi dalam assembly language dan sebagian lainnya dalam bahasa C.
Dalam contoh ini, bagian assembly language hanya terdapat pada prosedur Dispn, yang menampilkan sebuah bilangan integer, dan prosedur Readnum, yang membaca sebuah bilangan integer.
Program pada Contoh 7–6 tidak berusaha mendeteksi atau memperbaiki error. Selain itu, program hanya berfungsi dengan benar jika hasil operasi bernilai positif dan kurang dari 64K.
Perhatikan bahwa pada contoh ini, assembly language digunakan untuk melakukan I/O, sedangkan bagian C menangani semua operasi lainnya untuk membentuk kerangka utama (shell) dari program.
Menggunakan Assembly Language dengan Visual C/C++ untuk Aplikasi 32-Bit
Terdapat perbedaan besar antara aplikasi 16-bit dan 32-bit.
-
Aplikasi 32-bit ditulis menggunakan Microsoft Visual C/C++ Express untuk Windows,
-
sedangkan aplikasi 16-bit ditulis menggunakan Microsoft C++ untuk DOS.
Perbedaan utamanya adalah: Visual C/C++ Express untuk Windows lebih umum digunakan saat ini, tetapi Visual C/C++ Express tidak dapat dengan mudah memanggil fungsi DOS seperti INT 21H.
Disarankan bahwa:
-
Aplikasi embedded yang tidak membutuhkan antarmuka visual sebaiknya ditulis dalam C atau C++ 16-bit.
-
Aplikasi yang melibatkan Microsoft Windows atau Windows CE (tersedia pada ROM atau Flash untuk aplikasi embedded) sebaiknya menggunakan Visual C/C++ Express 32-bit untuk Windows.
Sebuah aplikasi 32-bit ditulis dengan menggunakan register 32-bit apa pun, dan ruang memori pada Windows pada dasarnya dibatasi hingga 2 GB. Versi gratis Visual C++ Express tidak mendukung aplikasi 64-bit yang ditulis dengan assembly language saat ini.
Perbedaan utamanya adalah Anda tidak dapat menggunakan pemanggilan fungsi DOS; sebagai gantinya gunakan fungsi bahasa C/C++ seperti getch(), getche(), dan putch dari console untuk aplikasi DOS console.
Aplikasi embedded menggunakan instruksi langsung assembly language untuk mengakses perangkat I/O dalam sistem embedded. Sedangkan dalam antarmuka Visual, semua I/O ditangani oleh kerangka kerja Windows operating system.
Aplikasi console dalam WIN32 berjalan dalam native mode, yang memungkinkan assembly language dimasukkan ke dalam program hanya dengan menambahkan kata kunci _asm.
Sebaliknya, Windows forms applications lebih menantang karena berjalan dalam managed mode, bukan dalam native mode mikroprosesor. Aplikasi managed berjalan dalam pseudo mode yang tidak menghasilkan kode native.
Contoh yang Menggunakan Console I/O untuk Mengakses Keyboard dan Display
Contoh 7–7 menunjukkan sebuah aplikasi console sederhana yang menggunakan perintah console I/O untuk membaca dan menulis data dari console.
Untuk memasukkan aplikasi ini (dengan asumsi Visual Studio .NET 2003 atau Visual C++ Express tersedia), pilih WIN32 console application pada opsi new project (lihat Gambar 7–1).
Perhatikan bahwa alih-alih menggunakan pustaka stdio.h seperti biasanya, pada aplikasi ini digunakan pustaka conio.h.
Program contoh ini menampilkan sembarang angka antara 0 hingga 1000 dalam semua basis bilangan, mulai dari basis 2 hingga basis 16.
Perhatikan bahwa program utama tidak lagi disebut main seperti pada versi C/C++ sebelumnya, tetapi disebut _tmain pada versi Visual C/C++ Express saat ini jika digunakan dengan aplikasi console.
Parameter argc adalah jumlah argumen yang dilewatkan ke prosedur tmain dari command line, sedangkan argv[] adalah array yang berisi string argumen dari command line.
Contoh ini menyajikan kombinasi perintah assembly language dan C/C++.
Prosedur disps(base, data) melakukan sebagian besar pekerjaan dalam program ini. Prosedur ini memungkinkan bilangan bulat (unsigned integer) ditampilkan dalam basis bilangan apa pun, yang dapat berupa nilai antara basis 2 hingga basis 36.
Batas atas (36) terjadi karena huruf alfabet hanya sampai huruf Z. Jika Anda ingin mengonversi ke basis bilangan yang lebih besar, maka harus dikembangkan skema baru untuk basis di atas 36—misalnya, huruf kecil a hingga z bisa digunakan untuk basis 37 hingga 52.
Namun, Contoh 7–7 hanya menampilkan bilangan yang dimasukkan dalam basis 2 hingga basis 16.
Mengakses Port I/O Secara Langsung
Jika sebuah program ditulis dan harus mengakses nomor port tertentu, kita dapat menggunakan perintah console I/O seperti:
-
_inp(port) → untuk mengambil data byte dari sebuah port (input),
-
_outp(port, byte_data) → untuk mengirim data byte ke sebuah port (output).
Saat menulis perangkat lunak untuk personal computer, sangat jarang dilakukan pengaksesan port I/O secara langsung. Namun, ketika menulis perangkat lunak untuk embedded system, kita sering kali harus mengakses port I/O secara langsung.
Alternatif lain selain menggunakan perintah _inp dan _outp adalah menggunakan assembly language, yang lebih efisien.
Dalam banyak kasus, I/O port tidak dapat diakses di lingkungan Windows jika Anda menggunakan Windows NT, Windows 2000, Windows XP, atau Windows Vista. Satu-satunya cara untuk mengakses I/O port di sistem operasi modern tersebut adalah dengan mengembangkan kernel driver. Pada tahap ini, tidaklah praktis untuk membuat driver semacam itu.
Jika Anda menggunakan Windows 98 atau bahkan Windows 95, Anda masih dapat menggunakan instruksi inp dan outp dalam C/C++ untuk mengakses I/O port secara langsung.
Mengembangkan Aplikasi Visual C++ untuk Windows
Bagian ini menjelaskan cara menggunakan Visual C++ Express untuk mengembangkan aplikasi berbasis dialog dengan pustaka Microsoft Foundation Classes (MFC).
Microsoft Foundation Classes (MFC) adalah kumpulan class yang memungkinkan kita menggunakan antarmuka Windows tanpa terlalu banyak kesulitan. Dalam Visual C++ Express, MFC telah diganti namanya menjadi Common Language Runtime (CLR).
Jenis aplikasi yang paling mudah dipelajari dan dikembangkan adalah program yang menggunakan forms application, seperti yang ditunjukkan di sini. Aplikasi dasar ini digunakan untuk memprogram dan menguji semua contoh perangkat lunak dalam buku teks ini yang ditulis di lingkungan Visual C++ Express.
Untuk membuat aplikasi berbasis form Visual C++, jalankan Visual C++ Express dan klik Create Project di dekat pojok kiri atas layar awal. (Jika Anda belum memiliki program Visual C++ Express, program ini tersedia gratis dari Microsoft di http://msdn.com). Unduh dan instal versi terbaru, meskipun itu masih versi beta.
Gambar 7–2 mengilustrasikan tampilan yang muncul.
Ketika CLR Windows Forms application type dipilih di bawah Visual C++ Express Projects, masukkan nama untuk project dan pilih jalur (path) yang sesuai untuk project, lalu klik OK.
Setelah beberapa saat, layar desain akan muncul seperti yang ditunjukkan pada Gambar 7–3. Pada bagian tengah terdapat form yang dibuat oleh aplikasi ini. Untuk menguji aplikasi sebagaimana adanya, cari tanda panah hijau yang terletak di atas form dan di bawah Windows menu bar di bagian atas layar, lalu klik tanda tersebut untuk meng-compile, meng-link, dan mengeksekusi aplikasi dialog. (Jawab Yes pada pertanyaan “Would you like to build the application?”). Klik tombol X di bilah judul untuk menutup aplikasi. Dengan begitu, Anda baru saja membuat dan menguji aplikasi Visual C++ Express pertama Anda.
Ketika melihat tangkapan layar (screenshot) pada Gambar 7–3, terdapat beberapa item yang penting untuk pembuatan dan pengembangan program. Pada margin kanan layar terdapat Properties window, yang berisi properti dari form. Pada margin kiri terdapat Solution Explorer. Tab-tab yang terletak di bagian bawah jendela Solution Explorer memungkinkan tampilan lain seperti class view dan seterusnya ditampilkan di area ini. Tab-tab di bagian bawah Properties window memungkinkan tampilan class, properties, dynamic help, atau output pada jendela ini.
Tampilan layar Anda mungkin tidak persis sama dengan ilustrasi di Gambar 7–3, karena bisa dimodifikasi dan kemungkinan besar akan berubah seiring penggunaan program.
Untuk membuat sebuah aplikasi sederhana, pilih toolbox dengan mengklik Tools di bagian atas layar atau dengan membuka menu dropdown View dan memilih Toolbox dari daftar.
Sistem ini berbasis event-driven, sehingga sebuah objek atau kontrol diperlukan pada form untuk memicu suatu event. Kontrol tersebut bisa berupa tombol (button) atau hampir semua objek kontrol yang dipilih dari toolbox. Klik kontrol button yang berada dekat bagian atas toolbox untuk memilih tombol tersebut. Setelah itu, pindahkan penunjuk mouse (jangan menyeret tombol) ke aplikasi dialog di bagian tengah layar, lalu gambar tombol dengan klik kiri dan ubah ukurannya di dekat bagian tengah (lihat Gambar 7–4).
Setelah tombol ditempatkan di layar, sebuah event handler harus ditambahkan ke aplikasi sehingga tindakan menekan atau mengklik tombol dapat ditangani. Event handler dipilih melalui Properties window dengan mengklik ikon petir kuning (lightning bolt). Pastikan bahwa item yang dipilih untuk event adalah objek button1. Untuk kembali dari event window ke Properties window, klik ikon yang berada tepat di sebelah kiri ikon petir tersebut. Cari event Click (biasanya menjadi event pertama), lalu double-click pada kotak teks di sebelah kanan untuk memasang event handler bagi Click. Tampilan kemudian akan beralih ke code view dan memperlihatkan lokasi kode program untuk penanganan klik tombol.
Kode yang saat ini terlihat adalah fungsi button1_Click, yang dipanggil saat pengguna menekan tombol. Prosedur ini digambarkan dalam Contoh 7–8. Untuk menguji tombol, ubah kode dalam Contoh 7–8 menjadi kode dalam Contoh 7–9(a). Klik panah hijau untuk compile, link, dan menjalankan aplikasi dialog, lalu klik button1 saat program berjalan. Label pada button1 akan berubah menjadi “Wow, Hello” jika t
Komentar
Posting Komentar