Chapter 7
1. Pendahuluan[kembali]
Saat ini, jarang sekali mengembangkan sistem secara lengkap hanya menggunakan bahasa assembly. Kita sering menggunakan C/C++ bersama dengan bahasa assembly untuk mengembangkan suatu sistem. Bagian bahasa assembly biasanya menyelesaikan tugas-tugas yang sulit atau tidak efisien dilakukan dalam C/C++, yang sering kali mencakup kontrol perangkat keras untuk antarmuka periferal dan program driver yang menggunakan interupsi. Aplikasi lain dari bahasa assembly dalam program C/C++ adalah instruksi MMX dan SEC yang merupakan bagian dari prosesor kelas Pentium dan tidak didukung dalam C/C++. Meskipun C++ memiliki makro untuk perintah ini, penggunaannya lebih rumit dibandingkan dengan menggunakan bahasa assembly. Bab ini mengembangkan ide mencampurkan C/C++ dan bahasa assembly. Banyak aplikasi pada bab-bab berikutnya juga menunjukkan penggunaan kedua bahasa ini untuk menyelesaikan tugas-tugas pada mikroprosesor.
2. Tujuan [kembali]
1. Menggunakan bahasa assembly dalam blok asm dalam C/C++.
2. Menyebutkan aturan yang berlaku untuk pengembangan perangkat lunak campuran.
3. Menggunakan struktur data umum C/C++ dan strukturnya dengan bahasa assembly.
4. Menggunakan antarmuka 16-bit (DOS) dan antarmuka 32-bit (Microsoft Windows) dengan kode bahasa assembly.
5. Menggunakan objek bahasa assembly yang ditulis dengan C/C++.
3. Dasar Teori [kembali]
- void main(void) : Fungsi utama program dalam bahasa C++. Semua eksekusi program dimulai dari sini.
- { _asm : Blok
_asm
(atau_asm
) digunakan untuk menyisipkan kode assembly langsung (inline assembly) di dalam program C++. - mov ah,8 ;read key no echo: Mengatur nilai register
AH
ke8
, yang merupakan fungsi BIOS interrupt 21h untuk membaca satu karakter dari keyboard tanpa menampilkannya (no echo). - int 21h: Memanggil interrupt 21h, dengan
AH = 08h
, untuk Membaca satu karakter dari keyboard dan menyimpannya di registerAL
. - cmp al,'0' ;filter key code: Membandingkan isi
AL
(karakter yang diketik) dengan karakter'0'
(kode ASCII 48). Ini digunakan untuk memastikan karakter yang ditekan adalah angka. - jb big: "Jump if Below":Jika karakter yang diketik kurang dari '0' (misalnya huruf, simbol), lompat ke label
big
(yang di akhir kode), mengabaikan karakter. - cmp al,'9' : Membandingkan kembali isi
AL
dengan karakter'9'
(kode ASCII 57). - ja big: "Jump if Above":Jika karakter lebih dari '9', maka itu bukan angka 0–9 → lompat ke
big
dan abaikan. - mov dl,al ;echo 0 – 9 : Jika lolos dari dua pemeriksaan di atas, artinya karakter berada di antara
'0'
dan'9'
.Karakter valid disalin dariAL
keDL
, karena:Interrupt 21h, fungsi 02h mencetak karakter yang ada diDL
. - mov ah,2: Mengatur nilai
AH
ke2
, yang merupakan fungsi DOSint 21h
untuk: Menampilkan satu karakter ke layar (echo). - int 21h: Memanggil kembali interrupt 21h:Sekarang dengan
AH = 2
, akan mencetak karakter yang ada diDL
. - big:Label bernama
big:
Tempat untuk melompat jika input bukan angka'0'
hingga'9'
.Dalam kasus seperti itu, program akan melewati proses pencetakan karakter. - }}: Menutup blok
asm
dan fungsimain
.
'0'
sampai '9'
1.
Inline assembler digunakan untuk menyisipkan instruksi bahasa assembly terbatas langsung ke dalam program C++. Kelemahan dari inline assembler adalah tidak dapat menyisipkan urutan instruksi makro atau pernyataan percabangan (seperti if
, loop
).
2.
Tersedia dua versi compiler C++:
-
Satu dirancang untuk aplikasi DOS 16-bit, dan
-
Satunya lagi untuk aplikasi Windows 32-bit.
Jenis compiler yang digunakan tergantung pada lingkungan pengembangan. Namun, di sebagian besar pemrograman modern (terutama di Windows), compiler 32-bit dan Visual C++ lebih umum digunakan.
3.
-
Aplikasi bahasa assembly 16-bit menggunakan interrupt DOS INT 21H untuk mengakses perangkat.
-
Aplikasi assembly 32-bit dapat mengakses perangkat keras dengan lebih efisien menggunakan instruksi DOS INT 21H juga, meskipun banyak metode lain tersedia.
4.
Cara paling fleksibel dan efisien untuk mengintegrasikan bahasa assembly ke dalam program C++ adalah dengan menggunakan modul bahasa assembly terpisah.
Perbedaannya dengan program C++ biasa adalah:
-
Harus dideklarasikan menggunakan direktif
C
setelah deklarasi.model
-
Modul harus ditautkan bersama dengan program C++ menggunakan compiler/linker
5.
Pernyataan PUBLIC
digunakan dalam modul bahasa assembly untuk menunjukkan bahwa prosedur (fungsi) tersebut bersifat publik dan bisa digunakan dari modul lain.
Parameter eksternal diterima dengan:
-
Nama prosedur yang ditentukan di pernyataan
PROC
-
Nilai hasil dikembalikan melalui register
EAX
saat prosedur dipanggil oleh program C/C++
6.
Prosedur bahasa assembly dideklarasikan secara eksternal ke program C++ dengan menggunakan direktif extern
.
Jika direktif extern diikuti dengan huruf C
, berarti itu digunakan dalam program berbahasa C/C++.
7.
Jika menggunakan Visual Studio, kamu bisa menyisipkan modul bahasa assembly dengan cara:
-
Klik kanan pada properti file
-
Tambahkan file sumber bahasa assembly sebagai langkah kustom (misalnya dengan mengetik
ml /c /Cx /coff Filename.asm
) -
Hasilnya akan berupa file objek (
Filename.obj
) yang bisa dilink ke proyek C++
8.
Modul bahasa assembly dapat berisi banyak prosedur, tetapi tidak bisa berisi program utama (main program).
Program utama harus didefinisikan di luar, misalnya di file C/C++ atau modul lain, dan kemudian prosedur assembly dipanggil dari sana menggunakan perintah seperti extern
.
4. Dasar Teori [kembali]
4.1 Bahasa Assembly
Assembly adalah bahasa pemrograman tingkat rendah yang memiliki hubungan langsung dengan instruksi mesin. Instruksi ditulis dalam bentuk mnemonic (misalnya MOV
, ADD
, SUB
) yang kemudian diterjemahkan oleh assembler menjadi kode biner agar dapat dijalankan oleh prosesor.
4.2 Bahasa C/C++
C dan C++ adalah bahasa pemrograman tingkat menengah yang mendukung pemrograman prosedural, modular, maupun berorientasi objek. Compiler akan menerjemahkan kode C/C++ menjadi assembly sebelum dikompilasi ke dalam bentuk executable.
4.3 Integrasi Assembly dengan C/C++
Ada dua metode umum:
-
Inline Assembly
Menyisipkan kode assembly langsung di dalam kode C/C++ menggunakan keywordasm
atau_asm_
. Contoh (GNU GCC):Contoh (MSVC):
-
File Assembly Eksternal
Bagian program ditulis dalam file.asm
, lalu dipanggil/dihubungkan dalam kode C/C++. Teknik ini lebih fleksibel dan memisahkan logika C dari optimasi Assembly.4.4 Kelebihan dan Kekurangan
-
Kelebihan: efisiensi tinggi, kontrol penuh terhadap hardware.
-
Kekurangan: sulit dipahami, tidak portabel antar arsitektur, rawan error.
-
5. Percobaan [kembali]
5.2 Percobaan 2: Penjumlahan dengan Inline Assembly (MSVC)
Baris | Penjelasan |
---|---|
#include <stdio.h> |
Mengimpor pustaka standard untuk fungsi input/output (seperti printf ). |
int main() |
Fungsi utama program. |
int a = 5, b = 3, c; |
Mendeklarasikan tiga variabel integer: a , b , dan c . a = 5 , b = 3 , dan c belum diberi nilai. |
__asm { ... } |
Blok inline assembly — menyisipkan kode bahasa assembly di dalam C++. |
mov eax, a |
Memindahkan nilai variabel a (yaitu 5) ke dalam register EAX. |
add eax, b |
Menambahkan nilai variabel b (yaitu 3) ke register EAX. Sekarang EAX = 5 + 3 = 8 . |
mov c, eax |
Memindahkan nilai EAX (8) ke variabel c . |
printf(...) |
Menampilkan hasil c ke layar. |
return 0; |
Mengembalikan 0, menandakan program selesai tanpa error. |
Komentar
Posting Komentar