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 ke 8, 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 register AL.
  •         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 dari AL ke DL, karena:Interrupt 21h, fungsi 02h mencetak karakter yang ada di DL.
  •         mov ah,2: Mengatur nilai AH ke 2, yang merupakan fungsi DOS int 21h untuk: Menampilkan satu karakter ke layar (echo).
  •         int 21h: Memanggil kembali interrupt 21h:Sekarang dengan AH = 2, akan mencetak karakter yang ada di DL.
  •     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 fungsi main.
Rangkuman Alur Logika:
1. Baca satu karakter dari keyboard
2. Periksa apakah karakter antara '0' sampai '9'
jika tidak, lompat ke akhir dan abaikan.
3. Jika valid, tampilkan karakter ke layar.

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:

  1. Inline Assembly
    Menyisipkan kode assembly langsung di dalam kode C/C++ menggunakan keyword asm atau _asm_. Contoh (GNU GCC):

    int a = 5, b = 3, c; asm("addl %%ebx, %%eax;" : "=a"(c) : "a"(a), "b"(b));

    Contoh (MSVC):

    int a = 5, b = 3, c; __asm { mov eax, a add eax, b mov c, eax }
  2. 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)

#include <stdio.h> int main() { int a = 5, b = 3, c; __asm { mov eax, a add eax, b mov c, eax } printf("Hasil: %d\n", c); return 0; }

   

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

Postingan populer dari blog ini

Tugas Besar