Anda di halaman 1dari 9

[Type here]

Percobaan I
COMPILER BAHASA C DAN BAHASA ASSEMBLY
INTEL®X86
Josua Marihot Panjaitan (14S17048)
Tanggal Percobaan : 2/10/2019

[14S3102] [Praktikum Arsitektur Sistem Komputer]

[Laboratorium Sistem Digital] – Teknik Elektro

Institut Teknologi Del

Abstrak— In this practicum, we can nantinya kami akan menganalisis apa yang terjadi
understand step by step how to compile with pada komputer.
Pada proses pembuatan program di beberapa
C as the difficult and the easy can be
platform electronic device, umumnya menggunakan
understood by the machine. Next, we can bahasa tingkat tinggi karena bahasa tersebut lebih
compile the program with C by using the mudah dimengerti dan dipahami oleh manusia seperti
compiler GCC with makefile and batch file. halnya Bahasa C. Di satu sisi bahasa tingkat tinggi
We also can understand assembly language mudah dipahami dan dimengerti oleh manusia,
and do analysis for assembly language namun hal sebaliknya terjadi pada mesin
(mikroprosesor) yang tidak dapat mengerti bahasa
Intel®x86. In this practicum we also use tingkat tinggi. Oleh karena itu, diperlukan suatu
Notepad++ for making a code, minGW for bahasa yang dapat menjadi penghubung antara kedua
the compiler, and CodeBlocks. After finishing bahasa tersebut (dari bahasa tingkat tinggi ke bahasa
this practicum we hope, we can make a code tingkat rendah).
from source code without the error after we Kemudian dibuatlah Bahasa Assembly yang
menjadi solusi sebagai penerjemah pemrograman
compile the code. We can tran translate the dengan bahasa tingkat tinggi menjadi bahasa tingkat
code in C become executable file with 4 steps rendah yang berisi urutan instruksi yang dimengerti
like preprocessor, compiler, assemble, and oleh mesin. Selanjutnya, urutan instruksi tersebut
linker. And the last, we know that the akan dikemas ke dalam suatu bentuk executable
function of preprocessor, compiler, object program yang disimpan dalam bentuk file
biner.
assembler, and linker.
Proses penerjemahan dari bahasa tingkat tinggi
Keywords : Preprocessor, compiler, menjadi Bahasa Assembly (bahasa tingkat rendah)
yang dimengerti oleh mesin disebut compilation. Dari
assembler, Intel®X86. sisi instruction set (kumpulan instruksi dalam bahasa
mesin), terdapat dua penggolan mesin
(mikroprosesor) yaitu Complex Instruction Set
I. PENDAHULUAN Computer (CISC). Contohnya mikroprosesor Intel®,
Reduce Instruction Set Computer (RISC), contohnya

P ada praktikum ini kita harus memahami


bagaimana penggunaan Bahasa C serta cara
meng-compile dengan compiler GCC.
Kami juga dapat mengetahui dimana letak error
pada membuat suatu code serta menganalisis proses
MIPS32®.

kompilasi menjadi bahasa mesin. Saat proses tersebut


[Type here]

empat langkah yaitu Preprocessor, compiler, dan


Linker yang seluruhnya disebut sistem kompilasi.
Adapun beberapa tujuan pada modul ini:
a. Kami praktikan dapat memahami tahap-tahap
kompilasi program dalam bahasa C sebagai
bahasa tingkat tinggi hingga diperoleh bahasa
tingkat rendah yang dapat dieksekusi oleh mesin.
b. Kami praktikan mampu melakukan kompilasi
program bahasa C menggunakan compiler GCC o Preprocessor.
beserta penggunaan makefile dan batch file.
c. Kami sebagai praktikan dapat memahami bahasa Semua perintah preprocessor yang ditulis dalam
assembly dan mampu melakukan analisis bahasa tingkat tinggi akan diproses terlebih dahulu
terhadap bahasa assembly Intel®x86 yang oleh preprocessor sebelum compiler melaksanakan
dihasilkan oleh compiler GCC. tugasnya. Beberapa tugas dari preprocessor ini
d. Kami praktikan dapat memahami penggunaan adalah sebagai berikut:
stack memory pada setiap procedur call.
a. Semua komentar dalam file program diganti
Dalam praktikum ini, beberapa perangkat dengan spasi satu buah.
yang digunakan: b. Semua \n (Backslash-newline) yang
1. Komputer Desktop / Laptop dengan sistem menandakan baris baru akan dihapus tidak
operasi Microsoft®Windows™7/8/8.1. peduli dimanapun dia berada. Fitur ini
2. Compiler GCC dalam paket program
memungkinkan kita akan membagi baris
CodeBlocks untuk melakukan kompilasi
program yang panjang ke dalam beberapa
program.
3. Notepad++ sebagai teks editor dan HexEdit baris tanpa mengubah arti.
sebagai heksadesimal editor. c. Macro yang telah didefinisikan diganti
dengan definisinya.

II. LANDASAN TEORETIS Contohnya, pada perintah #define


A. Kompilasi menggunakan GCC. MAX_ROWS 10, preprocessor akan mengganti
semua kata MAX_ROWS dengan 10. Pada perintah
Untuk membuat suatu program bahasa tingkat #include <stdio.h>, preprocessor akan mengganti
tinggi cenderung banyak digunakan karena bahasa baris tersebut dengan isi file stdio.h.
tingkat tinggi ini mudah dimengerti oleh manusia
seperti halnya Bahasa C. Sayangnya, bahasa tingkat
tinggi tersebut tidak dapat dimengerti oleh mesin
o Compiler.
(mikroprosesor) sehingga tidak dapat dieksekusi.
Oleh karena itu, diperlukan sebuah penerjemah Compiler akan menerjemahkan bahasa tingkat
bahasa pemrograman tingkat tinggi menjadi tingkat tinggi C menjadi kode assembly. Kode assembly ini
rendah yang berisi urutan instruksi yang dimengerti berisi instruksi-instruksi yang sesuai dengan
oleh mesin. instruction set yang dimiliki oleh mesin. File yang
dihasilkan pada tahap ini masih berupa file teks (.s).
Kumpulan instruksi yang dimengerti oleh mesin
dapat instruction set. Dari sisi instruction set,
terdapat dua penggolongan mesin (mikroprosesor)
yaitu Complex Instruction Set Computer (CISC), o Assembler.
contohnya mikroprosesor Intel®, dan Reduced Assembler akan menerjemahkan bahasa assembly
Instruction Set Computer (RISC), contohnya menjadi file objek. File objek ini merupakan file
MIPS32®. Beberapa mikroprosesor Intel® bahkan biner (.o).
memiliki tambahan set instruksi seperti MMX, SSE,
dan sebagainya.

Proses menerjemahkan bari kode program dalam o Linker.


bahasa C menjadi file executable dilakukan dalam
[Type here]

Linker akan menggabungkan file biner yang dapat dibuka dengan teks editor contohnya
diperoleh pada tahap sebelumnya dengan file biner Notepad++.

lain yang merupakan dependency dari program yang o Hanya melakukan proses preprocessing,
dibuat, contohnya library untuk menjalankan fungsi compiling, dan assembly.
printf. Hasil dari linker berupa file biner executable
(dalam platform Microsoft® Windows™, file ini
memiliki akhiran .exe).

Untuk melakukan proses kompilasi Eksekusi perintah tersebut akan menghasilkan


menggunakan GCC, kita dapat menggunakan file Program.o yang merupakan file biner. File ini
Command Prompt pada Microsoft® Windows™. dapat dibuka dengan program hex editor contohnya
Perhatikan bahwa GCC harus terpasang dan HexEdit.
terkonfigurasi dengan benar (lihat pada lembar
lampiran petunjuk instalasi dan konfigurasi GCC).
Beberapa perintah untuk melakukan kompilasi antara
lain sebagai berikut. o Melakukan seluruh proses kompilasi
(preprocessing, compiling, assembly, dan
linking).

o Hanya melakukan proses preprocessing.

Eksekusi perintah tersebut akan menghasilkan


Program.exe yang dapat langsung dieksekusi
Eksekusi perintah tersebut akan menampilkan di (dijalankan). Kita juga dapat melakukan kompilasi
layar Command Prompt kode Program.c setelah dua file bahasa C sekaligus.
melalui proses preprocessing. Agar memperoleh
output berupa file, dapat menggunakan tambahan
perintah sebagai berikut.

B. Disassembly menggunakan GCC.


Eksekusi perintah tersebut akan menghasilkan
Selain dapat melakukan kompilasi, paket
file Program.i berisi kode Program.c yang telah
compiler GCC juga menyertakan sebuah
melalui preprocessing pada folder yang sama dengan
disassembler yang mampu melakukan disassembly
file Program.c. File ini dapat dibuka dengan teks
file biner (.o atau .exe) menjadi file assembly (.s)
editor contohnya Notepad++.
bernama Object Dump. Untuk melakukan
disassembly, kita dapat menggunakan perintah
berikut.
o Hanya melakukan proses preprocessing dan
compiling.
o

Hasil dari proses disassembly ditampilkan pada


jendela Command Prompt. Agar hasil dari proses
disassembly dapat disimpan ke dalam suatu file, kita
Eksekusi perintah tersebut akan menghasilkan dapat menggunakan perintah berikut.
file Program.s yang berisi baris instruksi assembly
pada folder yang sama dengan Program.c. File ini
[Type here]

praktikum ini. Praktikan dapat mempelajari lebih


jauh mengenai instruksi-instruksi ini pada bab 3 di
buku “Computer System – A Programmer’s
Perspective” yang ditulis oleh Bryant dan
O’Hallaron.
Dengan demikian, hasil proses disassembly akan
disimpan dalam file Program.s. F. Stack dan Procedure Call.

C. Optimisasi Program melalui Proses Stack pada umumnya disusun atas beberapa
Kompilasi. activation frame. Setiap frame memiliki sebuah base
D. Makefile dan Batch File. pointer yang menunjukkan alamat tertinggi (highest
E. Intsruksi dan Bahasa Assembly Intel®x86. address) pada frame tersebut. Karena stack tumbuh
dari high address menuju low address, base pointer
Arsitektur mikroprosesor Intel® x86 merupakan akan menunjukkan alamat tertinggi frame tersebut.
salah satu arsitektur mikroprosesor yang banyak
digunakan. Dengan mempelajari bahasa assembly Ketika suatu program (caller) memanggil sebuah
dan instruksi Intel® x86, kita akan sangat terbantu prosedur (callee), caller akan memasukkan argumen-
dalam melakukan proses debugging dan optimisasi argumen untuk memanggil callee dari argumen
program yang kita buat. Dalam mikroprosesor Intel® terakhir hingga argumen paling awal secara berurutan
x86, terdapat banyak register yang dapat digunakan. ke dalam stack. Selanjutnya, caller akan
memasukkan return address ke dalam stack.
Namun, pada praktikum kali ini, kita cukup
mempelajari beberapa register berikut. Kemudian, callee memasukkan alamat old base
pointer milik caller ke dalam stack dan memperbarui
 EAX, EBX, ECX, dan EDX adalah register nilai base pointer yang sesuai dengan frame callee
32-bit yang bersifat general storage. (nilai base pointer yang baru sama dengan nilai stack
 ESI dan EDI adalah register 32-bit yang pointer setelah old base pointer disimpan ke dalam
digunakan sebagai indexing register. stack). Kemudian callee melakukan alokasi terhadap
Register ini juga dapat digunakan sebagai variabel local dan melakukan komputasi sesuai
general storage. dengan fungsi callee tersebut.
 ESP adalah register 32-bit yang digunakan
Ketika callee selesai dieksekuasi, callee akan
sebagai stack pointer. Dengan demikian,
menyimpan return value pada register EAX.
ESP akan berisi nilai alamat (address)
Kemudian, callee akan membersihkan framenya
elemen puncak (top element) dari stack.
sendiri dengan mengganti alamat base pointer dengan
Perlu diingat bahwa stack membesar dari
old base pointer yang telah disimpan pada stack.
alamat tinggi (high address) ke arah alamat
Kemudian, return address digunakan untuk
rendah (low address). Dengan demikian,
melanjutkan eksekusi instruksi pada caller.
memasukkan elemen baru ke dalam stack
akan mengurangi nilai alamat yang III. HASIL DAN ANALISIS
tersimpan pada ESP sedangkan 3.1. Tugas 1: Proses Kompilasi Bahasa C
mengeluarkan elemen dari dalam stack akan Menggunakan GCC.
menambah ESP.
 EBP adalah register 32-bit yang digunakan Pada tugas 1 ini, saya melakukan untuk
sebagai base pointer. Dengan demikian, kompilasi terhadap GCC. Sedangkan Linker,
EBP akan berisi alamat dari current berfungsi dalam mengubah code.exe. File executable
activation frame pada stack. ini juga merupakan type file biner sehingga dibuka
 EIP adalah register 32-bit yang digunakan dengan teks editor akan menampilkan karakter yang
sebagai instruction pointer. Dengan tidak dapat dipahami.
demikian, EIP akan berisi alamat dari
instruksi selanjutnya yang akan dieksekusi.

Instruksi-instruksi yang digunakan pada Intel®


x86 tidak akan dijelaskan di dalam modul
[Type here]

ke tahap melainkan melakukan data .s, .o, .exe akan


muncul seketika.

3.3. Tugas 3: Disassembly File Objek.

3.2. Tugas 2: Proses Kompilasi bahasa C


menggunakan GCC dengan Bantuan Batch
File.

Pada tugas 2 ini, saya melakukan kompilasi


program code.c yang sama seperti pada tugas 1. Pada
proses kompilasi yang saya lakukan akan lebih kecil
atau minim daripada tugas-tugas sebelumnya dengan
bantuan batchfile.

Pada tugas 3 ini, akan ada proses disassembly


pada dua file yaitu .o, dan .exe dimana akan
dibuktikan bahwa file tersebut berbasis biner dapat
diubah menjadi bentuk assembly

3.4. Tugas 4: Optimisasi Kompilasi Program pada


GCC.

Pada tugas 4 ini, saya akan melakukan 5 jenis


optimasi yaitu: -O1, -O2, -O3, -OS, -Ofast.

Pada batchfile tersebut berisi code yang berinstruksi


yang diterjemahkan oleh cmd. Oleh batchfile ini,
proses kompilasi tersebut akan semakin lama
semakin singkat karena tidak akan melakukan tahap
[Type here]

3.5. Tugas 5: Kompilasi Beberapa File Kode


degan GCC.

Proses kompilasi pada tugas ini dilakukan


terlebih dahulu pada file main_text.c (Lamppiran 5A)
dan text.c (Lampiran 5B) hingga didapatkan file
executebale (main_text.exe). perintah eksekusi pada
command prompt adalah :

3.6. Tugas 6: Penggunaan Makefile pada GCC.

Setelah melakukan eksekusi dengan cmd,


diperoleh hasil yang sama dengan tugas sebelumnya
seperti tugas 5, sehingga disimpulkan bahwa makefile
merupakan alternatif lain untuk melakukan kompilasi
selain batchfile.

3.7. Tugas 7: Header File.

Pada tugas 7 akan dilakukan penambahan pada


header dalam kode yang saya buat. Dan pada tugas 7
ada penamaan berupa add.c, add.h, main.c.
[Type here]

3.8. Tugas 8: Pemanggilan Prosedur dan Stack // Nama (NIM) 2 : Praktikan 2 (NIM_2)
Memory. // Nama File : code.c
// Deskripsi : Demonstrasi proses kompilasi C
// Menjumlahkan deret bilangan sebanyak N_LOOP
Pada tugas 8 ini, saya tidak sempat melakukan
praktikum tersebut dikarenakan adanya kekurangan
waktu pada melakukan praktikum sehingga saya
tidak mendapatkan hasil data pada praktikum #define N_LOOP 500
int main(void)
tersebut. {
int indeks;
int accumulator;
indeks = 0;
3.9. Tugas 9: Program Fibonacci. accumulator = 0;
while(indeks<N_LOOP)
Pada praktikum tugas ke 9 ini, saya tidak sempat {
melakukan praktikum tersebut sama seperti pada accumulator = accumulator + indeks;
indeks = indeks + 1;
tugas ke 8 dikarenakan adanya kekurangan waktu
}
pada melakukan praktikum sehingga saya tidak return accumulator;
mendapatkan hasil data pada praktikum tersebut. }

IV. KESIMPULAN
6.2. Tugas 2.
Pada praktikum ini terdapat beberapa
kesimpulan: / Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Percobaan : 2
 Pada saat kompilasi bahasa pemograman Bahasa
// Tanggal : 2 Oktober 2019
C terdapat 4 tahapan. // Kelompok : NA
 Dapat mempermudah pemanggilan text file // Rombongan : NA
dalam command promnt dengan menggunakan // Nama (NIM) 1 : Josua Marihot Panjaitan
(14S17048)
makefile ataupun batchfile. // Nama File : code.c
 Bahasa Assembly sangat bergantung terhadap // Deskripsi : Demonstrasi proses kompilasi C
penulisan Bahasa C atau logaritma C nya. // Menjumlahkan deret bilangan sebanyak N_LOOP
 Setiap procedure call akan dialokasikan dalam
stack memory.
#define N_LOOP 500
V. REFERENSI int main(void)
{
[1] Hanindhito, Bagus, Modul Praktikum EL3111 int indeks;
int accumulator;
Arsitektur Sistem Komputer, Sekolah Teknik Elektro
indeks = 0;
dan Informatika, Bandung, 2014. accumulator = 0;
while(indeks<N_LOOP)
[2] Bryant, Randal, dan David O’Hallaron. Computer {
System : A Programmer’s Perspective 2nd Edition. accumulator = accumulator + indeks;
2011. Massachusetts : Pearson Education Inc. indeks = indeks + 1;
}
return accumulator;
}
VI. LAMPIRAN 6.3. Tugas 3.
6.1. Tugas 1. // Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Praktikum NWS3103 Arsitektur Sistem Komputer // Percobaan : 3
// Modul : 1 // Tanggal : 2 Oktober 2019
// Percobaan : 1 // Kelompok : NA
// Tanggal : 2 Oktober 2019 // Rombongan : NA
// Kelompok : NA // Nama (NIM) : Josua Marihot Panjaitan
// Rombongan : NA (14S17048)
// Nama (NIM) 1 : Josua Marihot Panjaitan // Nama File : code.c
(14S17048) // Deskripsi : Demonstrasi proses kompilasi C
[Type here]

// Menjumlahkan deret bilangan sebanyak N_LOOP // Percobaan : 5


// Tanggal : 2 Oktober 2019
// Kelompok : NA
// Rombongan : NA
#define N_LOOP 500 // Nama (NIM) 1 : Josua Marihot Panjaitan
int main(void) (14S17048)
{ // Nama (NIM) 2 : Praktikan 2 (NIM_2)
int indeks; // Nama File : text.c
int accumulator; // Deskripsi : Demonstrasi MakeFile, Mencetak string
indeks = 0; ke layar
accumulator = 0; #include <stdio.h>
while(indeks<N_LOOP) #include "text.h"
{ void test(void)
accumulator = accumulator + indeks; {
indeks = indeks + 1; printf("Arsitektur Sistem Komputer sangat
system("pause"); menyenangkan!\n");
} }
return accumulator;
} // Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Percobaan : 5
6.4. Tugas 4. // Tanggal : 2 Oktober 2019
// Kelompok : NA
// Rombongan : NA
// Nama (NIM) 1 : Josua Marihot Panjaitan
(14S17048)
// Nama (NIM) 2 : Praktikan 2 (NIM_2)
// Nama File : text.h
// Deskripsi : Demonstrasi MakeFile, Mencetak string
ke layar

#ifndef TES_H
#define TES_H 100
void test(void);
#endif

6.6 Tugas 6.
6.5 Tugas 5. // Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Praktikum NWS3103 Arsitektur Sistem Komputer // Percobaan : 5
// Modul : 1 // Tanggal : 2 Oktober 2019
// Percobaan : 5 // Kelompok : NA
// Tanggal : 2 Oktober 2019 // Rombongan : NA
// Kelompok : NA // Nama (NIM) 1 : Josua Marihhot Panjaitan
// Rombongan : NA (14S17048)
// Nama (NIM) 1 : Josua Marihhot Panjaitan // Nama (NIM) 2 : Praktikan 2 (NIM_2)
(14S17048) // Nama File : main_text.c
// Nama (NIM) 2 : Praktikan 2 (NIM_2) // Deskripsi : Demonstrasi MakeFile
// Nama File : main_text.c // Memanggil prosedur test pada text.c
// Deskripsi : Demonstrasi MakeFile #include "text.h"
// Memanggil prosedur test pada text.c void main(void)
#include "text.h" {
void main(void) test();
{ system("pause");
test(); }
system("pause");
}
// Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Praktikum NWS3103 Arsitektur Sistem Komputer // Percobaan : 5
// Modul : 1 // Tanggal : 2 Oktober 2019
[Type here]

// Kelompok : NA
// Rombongan : NA
// Nama (NIM) 1 : Josua Marihot Panjaitan
(14S17048)
// Nama (NIM) 2 : Praktikan 2 (NIM_2)
// Nama File : text.c
// Deskripsi : Demonstrasi MakeFile, Mencetak string
ke layar
#include <stdio.h>
#include "text.h"
void test(void)
{
printf("Arsitektur Sistem Komputer sangat
menyenangkan!\n");
}

// Praktikum NWS3103 Arsitektur Sistem Komputer


// Modul : 1
// Percobaan : 6
// Tanggal : 2 Oktober 2019
// Kelompok : NA
// Rombongan : NA
// Nama (NIM) 1 : Josua Marihot Panjaitan
(14S17048)
// Nama (NIM) 2 : Praktikan 2 (NIM_2)
// Nama File : text.h
// Deskripsi : Demonstrasi MakeFile, Mencetak string
ke layar

#ifndef TES_H
#define TES_H 100
void test(void);
#endif