Anda di halaman 1dari 9

Percobaan I

Compiler Bahasa C dan Bahasa Assembly


Intel X86
Yosafat Putra Purba (14S14016)
Tanggal Percobaan : 26/09/2016
NWS3103 Praktikum Arsitektur Sistem Komputer
Laboratorium Sistem Digital Teknik Elektro
Institut Teknologi Del

Abstrak- In this module we will conduct nine


experiments. Starting from the process of
compiling the C language using GCC, the process
of compiling the C language using GCC with the
help of a batch file, the disassembly of object
files, optimization compilation program at GCC,
compiling some code file with the GCC, using the
makefile in the GCC, header files, call the
procedure with a stack memory and run the
program fibbonachi. There are several programs /
software that must be installed in advance
Notepad ++, CodeBlocks, and HexEdit. And the
lab is expected that we can understand the process
of compiling C and assembly language.
Keywords: assembly, batch file, compiler GCC,
makefile, procedure call, stack memory.
I. PENDAHULUAN

Terlebih dahulu kita mengetahui apa


tujuan dari praktikum ini. Yang menjadi tujuan
adalah :

Memahami
tahap-tahap
kompilasi
Bahasa C mengginakan GCC.
Mampu melakukan optimasi kompilasi
program pada GCC.
mampu melakukan kompilasi program
pada GCC beserta penggunaan makefile
dan batchfile.
Memahami bahasa assembly.
Memahami pengunaan stack memory
pada setiap procedure call.
II. LANDASAN TEORETIS

Untuk membuat suatu program, bahasa


tingkat tinggi cenderung banyak digunakan
karena bahasa tingkat tinggi ini mudah
dimengerti oleh manusia seperti halnya bahasa C.
Sayangnya, bahasa tingkat tinggi tidak dapat

dimengerti oleh mesin (mikroprosesor) sehingga


tidak dapat dieksekusi. Oleh karena itu,
diperlukan
sebuah
penerjemah
bahasa
pemrograman tingkat tinggi menjadi bahasa
tingkat rendah yang berisi urutan instruksi yang
dimengerti oleh mesin.
Proses menerjemahkan baris kode
program dalam bahasa C menjadi file executable
dilakukan dalam empat langkah yaitu
preprocessor, compiler, assembler, dan linker
yang seluruhnya disebut sistem kompilasi.

Preprocessor
Semua perintah preprocessor yang
ditulis dalam bahasa tingkat tinggi akan diproses
terlebih dahulu oleh preprocessor sebelum
compiler melaksanakan tugasnya.
Beberapa tugas dari preprocessor ini adalah
sebagai berikut :
o Semua komentar dalam file program diganti
dengan spasi satu buah.
o Semua \n (backslash-newline) yang
menandakan baris baru akan dihapus tidak
peduli dimanapun dia berada. Fitur ini
memungkinkan kita untuk membagi baris
program yang panjang ke dalam beberapa
baris tanpa mengubah arti.
o Macro yang telah didefinisikan diganti dengan
definisinya.
Contohnya, pada perintah #define MAX_ROWS
10, preprocessor akan mengganti semua kata
MAX_ROWS dengan 10. Pada perintah #include
<stdio.h>, preprocessor akan mengganti baris
tersebut dengan isi file stdio.h.
Compiler
Compiler akan menerjemahkan bahasa tingkat
tinggi C menjadi kode assembly. Kode assembly

ini berisi instruksi-instruksi yang sesuai dengan


instruction set yang dimiliki oleh mesin. File
yang dihasilkan pada tahap ini masihberupa file
teks (.s).
Assembler
Assembler akan menerjemahkan bahasa assembly
menjadi file objek. File objek ini merupakan file
biner (.o).
Linker
Linker akan menggabungkan file biner yang
diperoleh pada tahap sebelumnya dengan file
biner lain yang merupakan dependency dari
program yang dibuat, contohnya library untuk
menjalankan
fungsi
printf. Hasil dari linker berupa file biner
executable (dalam platform Microsoft
Windows, file ini memiliki akhiran .exe).
Untuk melakukan proses kompilasi
menggunakan GCC, kita menggunakan (cmd)
Command Prompt pada Microsoft Windows.
Disassembly menggunakan GCC
Selain dapat melakukan kompilasi, paket
compiler GCC juga menyertakan sebuah
disassembler
yang
mampu
melakukan
disassembly file biner (.o atau .exe) menjadi file
assembly (.s) bernama Object Dump.
Optimasi Program melalui Proses Kompilasi
GCC mendukung beberapa tingkat
optimisasi program yang dapat dilakukan saat
proses kompilasi dilakukan. Terdapat beberapa
tingkat optimisasi program yang dapat dipilih
dengan menambahkan flag optimisasi saat
melakukan kompilasi program. Umumnya
optimisasi program merupakan trade-off antara
execution speed, program size, compilation time,
dan kemudahan dalam melakukan debugging.
Beberapa flag optimasi yang dikenali
oleh GCC adalah O0, -O1, -O2, -O3, -Os, dan
Ofast. perbedaan antara masing-masing optimasi :

-O0 : tidak melakukan optimasi waktu


kompilasi lama dan menggunakan memori
yang sangat besar selama proses kompilasi
dan binari, namun binarinya akan sangat
stabil.

-O1 : optimasi yang dilakukan sedikit dan


waktu kompilasinya lama, ukuran binarinya
besar dan memakan banyak memori.
-O2 : optimasi lebih ditingkatkan, waktu
kompilasi lebih cepat, menghasilkan binari
yang tidak terlalu besar dan sedikit
menggunakan memori.
-O3 : optimasi dengan
memanfaatkan
multithreading, waktu kompilasi yang cepat,
binari berukuran kecil dan menggunakan
memori yang sedikit, namun potensi crash
sangat besar.
-Os
:
optimasi
dilakukan
dengan
mengoptimalkan ukuran yang kecil pada
binari saja.
-Ofast : mengaktifkan semua optimasi pada
O3 dan pilihan ffast-math dan fortrand
spesifik.

Makefile dan Batch file


Pada GCC terdapat fitur makefile yang
berfungsi untuk menulis daftar nama file kode
didalam suatu project. Kita hanya perlu
memberikan GCC nama makefile lalu GCC akan
melakukan proses kompilasi untuk semua file
tersebut yang kemudian akan digabungkan pada
file executable. Makefile dapat bersifat sederhana
hingga kompleks, bergantung pada sejauh mana
makefile digunakan untuk mengorganisasikan
project. Contoh isi dari makefile adalah sebagai
berikut :

Kemudian untuk melakukan kompilasi makefile


digunakan perintah sebagai berikut :
mingw32-make -f makefile
Perintah tersebut akan melakukan kompilasi
terhadap makefile yang diberikan menjadi sebuah
program bernama contoh.exe. Program ini
dihasilkan oleh hasil linker terhadap dua file
objek bernama main.o dan text.o (tentunya
termasuk dengan library yang lain yang
dibutuhkan). Untuk memperoleh main. o, GCC

harus melakukan kompilasi source code main.c


menjadi file objek. Begitupula untuk memperoleh
text.o, GCC harus melakukan kompilasi source
code text.c.
Pada platform Microsoft Windows,
terdapat sebuah file shell script bernama Windows
Batch File. Kita dapat menuliskan perintahperintah yang biasa kita tuliskan secara terpisah
pada command prompt dalam suatu file yang disimpan
dengan ekstensi .bat. Untuk mengeksekusi
perintah-perintah tersebut, kita cukup menjalankan
file .bat tersebut sehingga command prompt terbuka
dan perintahperintah yang kita tuliskan dieksekusi
secara otomatis. Contoh Windows Batch File
adalah sebagai berikut:

Windows Batch File tersebut berisi


perintah sebagai berikut. Perintah %~d0
memerintahkan command prompt untuk
berpindah drive letter ke drive letter yang sesuai
dengan lokasi Windows Batch File berada.
Selanjutnya,
perintah
cd
"%~dp0"
memerintahkan command prompt untuk
berpindah folder ke lokasi Windows Batch File
berada.
Selanjutnya,
command
prompt
mengeksekusi perintah yang memanggil GCC
secara berurutan hingga berhenti akibat adanya
perintah pause. Untuk melanjutkan eksekusi, kita
cukup menekan sebarang tombol pada keyboard
sehingga command prompt mengeksekusi
perintah selanjutnya yaitu Object Dump.
Instruksi dan Bahasa Assembly Intel x86
Arsitektur mikroprosesor Intel x86
merupakan salah satu arsitektur mikroprosesor
yang banyak digunakan. Dengan mempelajari
bahasa assembly dan instruksi Intel x86, kita
akan sangat terbantu dalam melakukan proses
debugging dan optimisasi program yang kita
buat. Dalam mikroprosesor Intel x86, terdapat
banyak register yang dapat digunakan.
Namun, pada praktikum kali ini, kita cukup
mempelajari beberapa register berikut :
EAX, EBX, ECX, dan EDX adalah
register32-bit yang bersifat general
storage.

ESI dan EDI adalah register32-bit yang


digunakan sebagai indexing register.
Register
ini
juga
dapat
digunakan sebagai general storage.

ESP adalah register32-bit yang


digunakan sebagai stack pointer.
Dengan demikian, ESP akan berisi nilai
alamat (address) elemen puncak (top
element) dari stack. Perlu diingat bahwa
stack membesar dari alamat tinggi (high
address) ke arah alamat rendah (low
address).
Dengan
demikian,
memasukkan elemen baru ke dalam
stack akan mengurangi nilai alamat yang
tersimpan pada ESP sedangkan
mengeluarkan elemen dari dalam stack
akan menambah ESP.
EBP adalah register32-bit yang
digunakan sebagai base pointer. Dengan
demikian,
EBP
akan
berisi
alamat dari current activation frame
pada stack.
EIP adalah register 32-bit yang
digunakan sebagai instruction pointer.
Dengan demikian, EIP akan berisi
alamat dari instruksi selanjutnya yang
akan dieksekusi.
Stack dan Procedure Call
Stack pada umumnya disusun atas
beberapa activation frame. Setiap frame memiliki
sebuah base pointer yang menunjukkan alamant
tertinggi (highest address) pada frame tersebut.
Karena stack tumbuh dari high address menuju
low address, base pointer akan menunjukkan
alamat tertinggi frame tersebut.
Ketika
suatu
program
(caller)
memanggil sebuah prosedur (callee), caller akan
memasukkan
argumen-argumen
untuk
memanggil callee dari argument terakhir hingga
argument paling awal secara berurutan ke dalam
stack. Selanjutnya, caller akan memasukkan
return address ke dalam stack. Kemudian, callee
memasukkan alamat old base pointer milik
caller ke dalam stack dan memperbaharui nilai
base pointer yang sesuai dengan frame callee

(nilai base pointer yang baru sama dengan nilai


stack pointer setelah old base pointer disimpan ke
dalam stack). Kemudian callee melakukan
alokasi terhadap variable local dan melakukan
komputasi sesuai dengan fungsi callee tersebut.
Ketika callee selesai dieksekusi, callee
akan menyimpan return value pada register EAX.
Kemudian, callee akan membersihkan framenya
sendiri dengan mengganti alamat base pointer
dengan old base pointer yang telah disimpan pada
stack. Kemudain, return address digunakan
untuk melanjutkan eksekusi instruksi pada caller.

III. HASIL DAN ANALISIS


A. Tugas I : Proses Kompilasi Bahasa C
Menggunakan GCC

banyak dikarenakan file merupakan gabungan dari


semua file yang terkait, misalnya library.
B. Tugas 2 : Proses Kompilasi Bahasa C
Menggunakan GCC dengan Bantuan Batch File
Proses kompilasi yang dilakukan dengan
bantuan batch file hanya membutuhkan waktu yang
singkat karena kompilasi dilakukan hanya dengan
melakukan enter pada file batch.bat. Command
prompt dapat terbuka dan perintah-perintah yang
dituliskan dieksekusi secara otomatis. Kita dapat
menuliskan perintah-perintah yang biasa kita tuliskan
secara terpisah pada cmd dalam suatu file yang
disimpan dengan ekstensi .bat. Untuk mengeksekusi
perintah-perintah tersebut, kita cukup menjalankan file
.bat tersebut sehingga command prompt terbuka dan
perintah-perintah yang kita tuliskan dieksekusi secara
otomatis.
C. Tugas 3 : Disassembly File Objek
Tampilan disassembly_code_o.asm

Hasil yang tampak pada text editor, code.o


dan code.exe sama-sama menghasilkan kode. Namun
code.o menghasilkan kode yang lebih singkat
dibandingkan dengan code.exe.
Potongan code.o

Potongan code.exe

Ketika membuka dengan text editor, maka


akan muncul kode yang sulit dimengerti. Tetapi saat
kita membukanya dengan HexEdit maka akan
muncul kode biner.

Tampilan disassembly_code_exe.asm

Tampilan pada HexEdit

Perbedaan antara file code.o dan code.exe


adalah ukuran code.exe lebih besar dan isinya lebih

Proses disassembly diatas membuktikan


bahwa suatu file binary dapat diubah kembali menjadi
bentuk assembly-nya. pada file assembly code.o hanya

terdapat bagian main dari program, sedangkan pada


file assembly code.exe tidak hanya main program
tetapi juga library dan file-file lain pendukung
program.
D. Tugas 4: Optimisasi Kompilasi Program pada
GCC.
Kita akan melakukan optimasi menggunakan
file code O1, -O2, -O3, -Os, -Ofast serta
membandingkan file assembly hasil dari masingmasing optimasi kompilasi. Berikut adalah hasil
optimasi yang dilakukan :

sedikit dari pada file code-O0.c. Jumlah baris pada


O0 adalah 35, sedangkan O1 adalah 23 baris.
Sedangkan pada O2 dan O3 kode dan jumlah
barisnya sama, dikarenakan flag-flag tambahan tidak
terlalu berpengaruh pada optimasi panjang file.
-O2.s

-O0.s

-O3.s

Ini merupakan default program sebelum dilakukan


optimasi.
-O1.s

Pada optimasi Os dan Ofast terjadi


perbedaan jumlah baris, hal ini disebabkan karena
pengakltifan flag tambahan yang berbeda-beda, di
mana flag tambahan tersebut berpengaruh untuk
optimasi panjang file, berbeda dengan optimasi O2
dan -O3.
Disini dapat kita lihat bahwa pada optimasi O1,
terlihat bahwa jumlah baris yang dihasilkan lebih

-Os.s

G. Tugas 7 : Header File


Header file adalah file library yang
digunakan untuk menyimpan fungsi-fungsi yang akan
digunakan di dalam program. Berarti header berfungsi
sebagai penghubung antara dua file atau lebih
sehingga fungsi atau prosedur pada suatu fungsi juga
dapat digunakan pada fungsi lain (yang dihubungkan).
H. Tugas 8 : Pemanggilan Prosedur dan Stack
Memory
Proses pembaharuan nilai pointer dapat
dinyatakan sebagai berikut :

E. Tugas 5: Kompilasi Beberapa File Kode dengan


GCC
Pada percobaan ini, program dapat berjalan
walaupun terdiri atas file yang terpisah. Hal ini
dikarenakan penggunaan file header. Header adalah
file library yang digunakan untuk menyimpan fungsifungsi yang akan digunakan di dalam program. yang
berfungsi sebagai penghubung antara dua file atau
lebih sehingga fungsi atau prosedur pada suatu fungsi
juga dapat digunakan pada fungsi lain (yang
dihubungkan).
F. Tugas 6 : Penggunaan Makefile pada GCC
Makefile

Seperti yang dilampirkan pada landasan


teoritis, untuk suatu project yang terdiri atas beberapa
file kode, akan sangat merepotkan untuk melakukan
kompilasi satu per satu untuk setiap file. Makefile
berfungsi untuk menulis daftar nama file kode di
dalam project tersebut. Kita cukup memberikan GCC
nama makefile lalu GCC akan melakukan proses
kompilasi untuk semua file tersebut untuk kemudian
menggabungkannya pada file executable. Makefile
dapat bersifat sederhana hingga kompleks, bergantung
pada sejauh mana kita menggunakan makefile untuk
mengorganisasikan project kita. makefile merupakan
cara lain melakukan kompilasi yang praktis selain
batch file.

Proses 1 : stack %ebp dan %esp berselisih 28 bit (0x28).


Fungsi main akan pertama-tama akan memanggil fungsi
squaresum. Setelah proses pemanggilan, main (sebagai
caller) akan menyimpan return address ke dalam stack.
Selanjutnya, squaresum (sebagai callee) akan
memperbaharui nilai %ebp dan %esp.
Proses 2 : Squaresum yang berikutnya bertindak sebagai
caller akan melakukan push nilai y kedalam stack yang
menyebabkan nilai %ebp berubah. Kemudian square
(sebagai callee) melakukan pembaharuian nilai %ebp dan
%esp.
Proses 3 : Hasil dari return value (x*x) selanjutnya akan
dimasukan kedalam register %eax. Untuk nilai %ebp dan
%esp akan tetap sama seperti sebelumnya karena stack
belum berpindah.
Proses 4 dan 5 : Karena dilakukan perintah return, maka
callee akan membersihkan framenya dengan mengganti
%ebp dan %esp pada proses 2 sebagai return address untuk
melanjutkan proses eksekusi pada caller. Kemudian proses
2 dilakukan kembali untuk mempush nilai variable z.
Proses 6 : Di akhir fungsi squaresum, dilakukan perhitungan
temp1 + temp dan selanjutnya nilai hasil perhitungan
tersebut akan di return dan disimpan pada %eax. Karena
masih berada pada fungsi squaresum, maka nilai pointer
(%ebp dan %eax) akan tetap sama seperti pada proses 2 dan
4. Kemudian stack akan kembali ke main setelah dilakukan
return value.
Proses 7 : Main akan melakukan return value pada register
%eax. Lalu pointer akan kembali ke return address yang
telah disimpan dan dieksekusi. Hal tersbut dapat dilihat pada
call stack yang menunjuk _mingw_CRTStartup(). %esp dan
%ebp adalah stack frame dari
fungsi _mingw_CRTStartup().

I. Tugas 9 : Program Fibonacci


Fibonacci saat dijalankan.

Ada beberapa file kode terpisah untuk


program ini. File inputn.c berfungsi untuk meminta
dan menyimpan nilai n . Nilai n minimum adalah 2
sehingga diperlukan validasi input. File fibo.c berisi
proses kalkulasi deret fibonnaci dan menampilkan
hasil. File fibo_main.c berisi program utama yang
memanggil prosedur-prosedur pada inputn.c dan
fibo.c.
IV. SIMPULAN

1.

Makefile dan batch file dapat digunakan untuk


mempermudah dalam melakukan kompilasi.

2.

Header file adalah file library yang digunakan


untuk menyimpan fungsi-fungsi yang akan
digunakan di dalam program. Berarti header
berfungsi sebagai penghubung antara dua file
atau lebih sehingga fungsi atau prosedur pada
suatu fungsi juga dapat digunakan pada fungsi
lain (yang dihubungkan).

3.

Kompilasi pada GCC dapat dilakukan dengan


beberapa jenis optimasi (disesuaikan dengan
kebutuhan), seperti O0, -O1,-O2, -O3, -Os, dan
Ofast.

4.

Ketika muncul kode yang sulit dimengerti pada


text editor, kemungkinan itu adalah kode biner.
Dan kita dapat membukanya dengan HexEdit.

5.

Source code (batch.bat) pada tugas 2

Source code (batch.bat) pada tugas 4

Suatu file binary dapat diubah kembali menjadi


bentuk assembly-nya.

V
1)
2)
3)

REFERENSI

NWS3103_Modul_2016.pdf.
https://wiki.gentoo.org/wiki/GCC_optimization/

http://download.myslide.es/getdownload/docume
nt/?id=zbSSyMgk%2F3iM%2FK2rVZSYfLQyf
wDrOj56EInMdVNFx2xsOLfYSjNGuTfy2Drny
PnB2SEqvaPS%2Bs9AnMaCCymMHw%3D%3
D

Lampiran
Source code tugas 1(code.c)

Source code (main_text.c) pada tugas 5

Source code (text.c) pada tugas 5

Source code (fibo.c) pada tugas 9

Source code (makefile) pada tugas 6


Source code (fibo_main.c) pada tugas 9

Source code (add.c) pada tugas 7

Source code (inputn.c) pada tugas 9

Source code (fibo.h) pada tugas 9

Source code (inputn.h) pada tugas 9

Tampilan CodeBlock pada Tugas 8