Anda di halaman 1dari 17

Percobaan I

Compiler Bahasa C dan Bahasa Assembly


Intel x86
Rosana Dewi Amelinda (13213060)
Asisten : Ahmad Yusya Sadali (13212134)
Tanggal Percobaan : 30/09/2015
EL3111 Praktikum Arsitektur Sistem Komputer
Laboratorium Sinyal dan Sistem Sekolah Teknik Elektro dan Informatika
Institut Teknologi Bandung

Abstrak Pada modul 1 ini dilakukan sembilan tugas


percobaan yang berkaitan dengan kompilasi program Bahasa C
dan Bahasa Assembly. Software yang digunakan selama
praktikum yaitu GNU C Compiler (GCC), CodeBlock,
Notepad++, dan HexEdit. Percobaan yang dilakukan yaitu
tahapan kompilasi, membandingkan hasil dari tiap tahapan
kompilasi, teknik kompilasi dengan GCC, membandingkan hasil
kompilasi yang dilakukan dengan makefile dan batchfile, serta
penggunaan stack memory pada procedure call. Selanjutnya
diminta untuk membuat program Fibonacci dalam Bahasa C.
Dari praktikum ini diharapkan praktikan mampu memahami
tahap-tahap kompilasi dari dalam Bahasa C hingga menjadi
Bahasa mesin, serta mampu melakukan kompilasi dengan
menggunakan GCC, makefile, dan batch file . Selain itu,
praktikan juga diharapkan mampu memahami dan menganalisis
Bahasa Assembly Intel X86 serta memahami penggunaan stack
memori pada procedure call..
Kata Kunci Bahasa Assembly, GCC, Optimasi, Stack
memory.

I. PENDAHULUAN

alam proses pembuatan suatu program, bahasa tingkat


tinggi lebih banyak digunakan karena bahasa tersebut
lebih mudah dimengerti dan dipahami oleh manusia seperti
halnya Bahasa C. Namun, Bahasa tersebut sulit atau tidak dapat
dimengerti oleh mesin (mikroprosessor) sehingga tidak akan
dieksekusi. Oleh karena itu, diperlukannya suatu Bahasa yang
dapat menjadi jembatan antara kedua Bahasa tersebut (dari
Bahasa tingkat tinggi ke Bahasa tingkat rendah). Sebagai solusi
dari masalah tersebut maka dibuatlah Bahasa Assembly yang
menjadi penerjemah pemrograman tingkat tinggi menjadi
Bahasa tingkat rendah yang berisi urutan instruksi yang
dimengerti oleh mesin. Selanjutnya urutan instruksi tersebut
akan dikemas kedalam suatu bentuk executable object program
yang disimpan dalam bentuk file biner. Proses penerjemahan
dari Bahasa tingkat tinggi menjadi Bahasa Assembly yang
dimengerti oleh mesin disebut compilation. Dari sisi instruction
set (kumpulan instruksi dalam Bahasa mesin), terdapat dua
penggolongan mesin (mikroprosessor) yaitu Complex

Instruction Set Computer (CISC), contohnya miroprosessor


Intel, dan Reduce Instruction Set Computer (RISC), contohnya
MIPS32.

Pada praktikum ini tujuan yang ingin dicapai antara lain :


1. Praktikan memahami tahap-tahap kompilasi program
dalam Bahasa C sebagai Bahasa tingkat tinggi hingga
diperoleh Bahasa tingkat rendah yang dapat
dieksekusi oleh mesin..
2. Praktikan mampu melakukan kompilasi proram
Bahasa C menggunakan compiler GCC beserta
penggunaan makefile dan batch file.
3. Praktikan memahami Bahasa assembly dan mampu
melakukan analisis terhadap Bahasa assembly Intel
x86 yang dihasilkan oleh compiler GCC.
4. Praktikan memahami pengunaan stack memory pada
setiap procedure call.
.
II. LANDASAN TEORETIS
Kompilasi menggunakan GCC
Proses menerjemahkan baris kode program dalam bahasa C menjadi
file executable dilakukan dalam empat langkah yaitu preprocessor,
compiler, assembler, dan linkeryang seluruhnya disebut sistem
kompilasi.
Gambar 1 Proses kompilasi

Preprocessor

Semua perintah preprocessoryang ditulis dalam bahasa tingkat


tinggi akan diproses terlebih dahulu oleh preprocessorsebelum
compilermelaksanakan tugasnya. Beberapa tugas dari
preprocessor ini adalah sebagai berikut.

Semua komentar dalam file program diganti dengan


spasi satu buah.
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.
Macro yang telah didefinisikan diganti dengan
definisinya.
Contohnya, pada perintah #define MAX_ROWS 10,
preprocessor akan mengganti semua kataMAX_ROWS dengan
10.Pada perintah #include <stdio.h>, preprocessor akan
mengganti baris tersebut dengan isi file stdio.h.

Assembler

Assembler akan menerjemahkan bahasa assembly menjadi file


objek. File objek ini merupakan file biner (.o).

Compiler

Compiler akan menerjemahkan bahasa tingkat tinggi C menjadi


kode assembly. Kode assemblyini berisi instruksi-instruksi
yang sesuai dengan instruction set yang dimiliki oleh mesin.
File yang dihasilkan pada tahap ini masih berupa file teks (.s).

Linker

Linker akan menggabungkan file biner yang diperoleh pada


tahap sebelumnya dengan file biner lain yang merupakan
dependencydari 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).

-O0 : tidak melakukan optimalisasi sama sekali namun


mengorbankan waktu kompilasi yang lama, dan
menggunakan RAM yang amat besar baik selama
proses kompialasi atau binari nantinya, namun
baiknya binari akan sangat stabil.
-O1 : opstimasi yang dilakukan sedikit dan
menghasilkan waktu kompilasi yang lama, binary
berukuran besar, dan memakan banyak RAM.
-O2 : optimalisasi lebih ditingkatkan (dari O1),
waktu kompilasi lebih cepat, menghasilkan binari
dengan ukuran tidak terlalu besar dan lebih sedikit
menggunakan RAM
-O3 : optimalisasi penuh, memanfaatkan
multithreading, waktu kompilasi yang cepat, binari
berukuran kecil dan menggunakan RAM seminum
mungkin binarinya nanti, namun potensi crash amat
besar jika sistem tidak mendukung atau source code
tidak mendukung opsi ini.
-Os : optimasi dilakukan dengan mengoptimalkan
pada ukuran yang kecil pada binari saja,
-Ofast : mengaktifkan semua optimasi pada O3 dan
pilihan ffast-math dan fortrand specific

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 :
all: contoh

Untuk melakukan proses kompilasi menggunakan GCC, dapat


digunakan 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 optimasi program yang
dapat dilakukan saat proses kompilasi dilakukan. Terdapat
beberapa tingkat optimasi program yang dapat dipilih dengan
menambahkan flag optimasi saat melakukan kompilasi
program. Umumnya optimasi program merupakan trade-off
antara executablespeed, 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 masing-masing level optimasi
diberikan sebagai berikut :

contoh: main.o text.o


gcc main.o text.o -o contoh.exe
main.o: main.c
gcc -c main.c
text.o: text.c
gcc -c text.c
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 contoh.o dan text.o .
Untuk memperoleh main.o , GCC harus melakukan
kompilasi source code main.c menjadi file objek. Begitu
pula 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 perintah-perintah 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 perintah-perintah yang kita
tuliskan dieksekusi secara otomatis. Contoh Windows Batch
File adalah sebagai berikut :
%~d0
cd "%~dp0"
gcc -O2 -E code.c > Program.l
gcc -O2 -S code.c
gcc -O2 -c code.c
gcc -O2 -o code.c
pause
objdump -d code.o > dump_o.dmp
objdump -d prog.exe > dump_exe.dmp
pause
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 EDIadalah register32-bit yang digunakan
sebagai indexing register. Registerini juga dapat
digunakan sebagai general storage.
ESP adalah register32-bit yang digunakan sebagai
stack pointer. Dengan demikian, ESPakan 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
yangtersimpan pada ESPsedangkan mengeluarkan
elemen dari dalam stack akan menambah ESP.

EBP adalah register32-bit yang digunakan sebagai


base pointer. Dengan demikian, EBPakan berisi
alamat dari current activation frame pada stack.
EIP adalah register 32-bit yang digunakan sebagai
instruction pointer. Dengan demikian, EIPakan 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 argument-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
Pada tugas 1 ini dilakukan kompilasi program secara
bertahap dengan menggunakan GCC. Proses kompilasi dimulai
dengan membuat code program dalam Bahasa C. Kode tersebut
berextensi file .c (dapa dilihat pada Lampiran 1a).
Proses kompilasi diawali dengan preprocessing yang
berperan untuk mengubah file code.c menjadi file code.i. Kedua
file ini sam-sama bertype filetext, sehingga apabila dibuka pada
Notepad++ menghasilkan tampilat code seperti pada Lampiran
1a dan 1b. Perbedaan yang terlihat antara kedua code tersebut
yaitu pada code.i (masih berwujud Bahasa C) namun spasi/tab
hanya menjadi 1 karakter, komentar tidak ada / hilang, serta
definisi micro sudah diganti kedalam program (N_LOOP
diganti dengan nilai definisinya yaitu 500).
Proses kompilasi kedua yaitu compiling. Pada proses ini
dilakukan penerjemahan code.i (Bahasa C) menjadi code.s
(Bahasa Assembly). Kedua file ini juga masih berupa filetext
sehingga dapa dibuka menggunakan notepad++ (dapat dilihat
pada Lampiran 1b dan 1c). code.s yang sudah dalam Bahasa
assembly ini berisi instruksi-instruksi yang dapat dimengerti
mesin.

Proses selanjutnya yaitu Assembler. Proses ini berperan


untuk menerjemahkan code.s (Bahasa assembly) menjadi
code.o (file objek). Pada tahap ini, file code.o bertipe file
biner,(bukan filetext) sehingga apa bila dibuka dengan text
editor maka akan menghasilkan tampilan karakter yang kurang
dapat dimengerti sebagai berikut :
Gambar 2 Tampilan filetext code.o

Perbedaannya dengan file objek adalah pada executable file ini


ukurannya lebih besar dan isinya lebih 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
Pada tugas 2 ini dilakukan kompilasi program code.c yang
sama dengan tugas 1. Akan tetapi proses kompilasi tidak
dilakukan dengan memberikan perintah satu persatu pada GCC
melainkan dengan membuat suatu batch file. Batch file yang
digunakan sesuai dengan instruksi pada modul yaitu sebagai
berikut :
Gambar 4 File batch.bat

%~d0
cd "%~dp0"
gcc -E code.c > code.i
gcc -S code.c
gcc -c code.c
gcc -o code.exe code.c
code.exe
pause

Namun apabila dibuka dengan menggunakan HexEdit, maka


tampilan dengan pola tertentu dalam bentuk perintah biner
(dapat dilihat pada Lampiran d).
Proses terakhir yaitu Linker. Proses ini berperan untuk
mengubah code.o (file objek) menjadi code.exe (executable
file). File executable ini juga bertipe file biner, sehingga apabila
dibuka menggunakan text editor akan menampilkan kumpulan
karakter yang tidak dapat dipahami sebagai berikut :
Gambar 3 Tampilan filetext code.exe

File batch dengan extensi .bat diatas hanya dapat dijalankan


pada platform DOS dan Windows. File batch berisi perintah
yang mampu diterjemahkan oleh command interpreter. Jadi,
file tersebut memiliki cara kerja yang sama dengan command
prompt hanya saya berbeda pada acara eksekusinya.
Proses kompilasi yang dilakukan dengan bantuan batch file
hanya membutuhkan waktu yang singkat karena kompilasi
tidak dilakukan tahap demi tahap melainkan hanya perlu
melakukan double click pada file batch.bat. Hasilnya diperoleh
yaitu berupa file code.i, code.s, code.o, dan code.exe yang
identic sama dengan file pada modul 1 (kompilasi pertahap
dengan GCC).
Gambar 5 Perbandingan hasil kompilasi pertahap dengan GCC dan
batch file

Namun saat dibuka dengan HexEdit maka tampilan akan


berupa suatu pola bilangan biner (seperti pada Lampiran 1e).

Dari gambar diatas dapat disimpulkan bahwa batch file


melalakukan operasi yang sama dengan command prompt.
Namun dapat lebih praktis dikarenakan user hanya perlu
melakukan eksekusi file.bat tanpa perlu mengetikan perintah

pada command prompt setiap kali akan melakukan kompilasi


C. Tugas 3 : Disassembly File Objek
Pada modul 3 ini dilakukan disassembly file objek dengan
menggunakan objdump. Pertama-tama dilakukan disassembly
file
code.c
sehingga
menghasilkan
file
disassembly_code_o.asm (Lampiran 2a). Kemudian dilakukan
pula disassembly file code.exe dan diperoleh file
disassembly_code_exe.asm (Lampiran 2b).

dengan bantuan library tambahan sehingga dapat mengakses


informasi waktu dati system operasi
E. Tugas 5: Kompilasi Beberapa File Kode dengan GCC
Pada tugas 5 ini dilakukan proses kompilasi terlebih dahulu
pada file main_text.c (Lampiran 4a) dan text.c (Lampiran 4b)
hingga didapatkan executable file-nya (main_text.exe).
Perintah eksekusi pada command prompt adalah sebagai
berikut :

Gambar 6 Perbandingan hasil disassembly file code.o dan code.exe

Gambar 7 Perintah eksekusi pada command prompt

Proses disassembly yang telah dilakukan pada kedua file


(code.o dan code.exe) membuktikan bahwa suatu file binary
dapat diubah kembali menjadi bentuk assembly-nya. Namun
terdapat perbedaan pada kedua file assembly tersebut, yaitu
pada file assembly code.o hanya terdapat bagian main dari
program, sedangkan pada file assembly code.exe tidak hanya
terdapat main program tetapi juga disertain library program
serta file-file lain pendukung program. Hal ini yang
menyebabkan disassembly_code_exe.asm memiliki ukuran file
yang
jauh
lebih
besar
dibandingkan
dengan
disassembly_code_o.asm (dapat dilihat pada gambar 6).

Untuk melakukan kompilasi kedua file, maka dibutuhkan file


header yang berfungsi untuk menghubungkan file main_text.c
dan text.c . File header ini memuat deklarasi fungsi test pada
text.c yang selanjutnya akan diterjemahkan dan digunakan pada
file main_text.c . Hasil eksekusi file diatas menunjukan bahwa
GCC juga dapat digunakan untuk melakukan kompilasi
beberapa file sekaligus serta menjadi penghubung antar file
(dengan header) hingga menjadi satu program yang utuh.

D. Tugas 4: Optimisasi Kompilasi Program pada GCC


Pada tugas 4 ini dilakukan 4 jenis optimasi dari file code.c
(diantaranya optimasi -O1, -O2, -O3, -Os, dan Ofast) yang
kemudian akan dibandingkan hasil file assembly-nya.File
assembly hasil optimasi dapat dilihat pada Lampiran 3.
Pada file original tanpa optimasi (code_O0.s) menghasilkan
file assembly terpanjang dibandingkan dengan file lainnnya
yaitu dengan jumlah baris sebanyak 29 baris.
Pada optimasi O1, terlihat bahwa jumlah baris yang
dihasilkan (19 baris) menjadi lebih sedikit daripada file code
tanpa optimasi (code_O0.s). Hal ini telah sesuai dengan
referensi yang menyatakan bahwa optimasi dengan O1 lebih
optimal untuk mengecilkan ukuran file.
Pada optimasi dengan O2, -O3, -Os, dan Ofast memiliki
jumlah baris yang sama yaitu 16 baris. Pada masing-masing
optimasi (O2, -O3, -Os, dan Ofast) telah dilakukan
pengaktifan flag yang berbeda-beda, namun dikarenakan hasil
optimasi yang diperoleh sama maka dapat dikatakan bahwa
optimasi dengan O2 saja sudah cukup optimal untuk optimasi
pajang file sehingga flag-flag tambahan tidak terlalu
berpengaruh.
Selain dituinjau dari ukuran file, proses optimasi juga dapat
diamati dari segi runtime program. Pada optimasi O2, -O3,
dan Ofast kemungkinan terdapat perbedaan runtime namun
karena tidak dilakukannya pengujian pada praktikum ini, maka
tidak dapat dikertahui perbedaan antar optimasi dari segi
runtime program. Runtime program sendiri dapat dilakukan
dengan mencatat timestamp dari tiap proses yang dilakukan

F. Tugas 6 : Penggunaan Makefile pada GCC


Pada tugas 6 dengan menggunakan make_file.c dan text.c
seperti pada tugas 5, dilakukan kompilasi kedua file tersebut
dengan memanfaatkan metode makefile. Perintah untuk
makefile adalah sebagai berikut :
Gambar 8 Makefile

all: main_text.exe
main_text.exe: main_text.o text.o
gcc main_text.o text.o o main_text.exe
main_text.o: main_text.c
gcc -c main_text.c
text.o: text.c
gcc -c text.c
Setelah dilakukan eksekusi dengan command prompt,
diperoleh hasil kompilasi yang identic sama seperti hasil
kompilasi pada tugas 5. Sehingga dapat disimpulkan bahwa
makefile merupakan cara lain melakukan kompilasi yang
praktis selain menggunakan batch file.
G. Tugas 7 : Header File
Pada tugas 7 ini dilakukan beberapa penggunaan header file
dan extern pada header. Pertama-tama dibuat file add.c
(Lampiran 5a), file main.c (Lampiran 5b), file add.h (Lampiran
5c) serta makefile (Lampiran 5d). Program main.c berfungsi
untuk memanggil fungi yang telah didefinisikan pada add.c .
Untuk itu dibutuhkan sebuah header file yang akan di-include
pada main.c sehingga dapat memanggil fungsi pada add.c .

Proses pemanggilan ini akan mengalami masalah apabila


variable accum (pada add.c) tidak di-extern terlebih dahulu
sehingga variable tidak terdefinisi pada main.c . Fungsi extern
pada header yaitu agar suatu variable dalam sebuah file dapat
digunaan pada file .c lainnya. Berikut perintah eksekusi
program :
Gambar 9 Eksekusi program pada command prompt

4.

int temp2 = square(z)


Call stack : function : squaresum(y-5,z=9)

Asm : move 0xc(%ebp),%eax


5.

return x*x
Call stack : function : square(x=9)

Asm = mov 0x8(%ebp),%eax


6.
Seperti dapat dilihat pada gambar diatas, bahwa program
berjalan sudah sebaimana mestinya proses penjumlahan
(accumlator). Maka dapat dikatakan bahwa integrase file add.c
dan main.c serta add.h (sebagai header file) telah berhasil.
H. Tugas 8 : Pemanggilan Prosedur dan Stack Memory
Pada tugas 8 ini dilakukan percobaan untuk lebih memahami
pemanggilan prosedur dan stack pada memory. Pada proses
pemanggilan prosedur, memory dapat dimodelkan sebagai
stack. Hal ini karena proses pemanggilan memory tersebut
berbasis stacking data. Proses kompilasi Bahasa C dilakukan
secara berurutan yang mengakibatkan prose penyimpanan dan
pengeluaran datanya pun dilakukan secara berurutan. Memory
computer yang kita gunakan sifatnya dinamis, dimana
ukurannya dapat membesar atau mengecil sesuai kebutuhan.
Hal ini dipengaruhi oleh banyaknya data dan optimasi yang
dilakukan. Memory akan dihapus saat telah dilakukan
pengembalian return address. Berikut urutan proses yang
dilakukan pada stack memory :
1. return squaresum (a,b)
Call stack : function :main()

Asm : mov 0x18(%esp), %eax


2.

int temp1 = square(y)


Call stack : function : squaresum(y=5,z=9)

Asm : mov 0x8(%ebp),%eax


3.

return x*x
Call stack : function : square(x=5)

Asm : mov 0x8(%ebp),%eax

return temp1+temp2
Call stack : function : squaresum(y=5,z=9)

Asm : mov -0x8(%ebp),%eax


7.

akhir program
Call stack : mingw CRTStartup()

Asm : mov %eax,%ebx


Berdasarkan data tersebut, dapat diamati bahwa terdapat 3 buah
stack yang digunakan selama pelaksanaan program, yaitu
function main {esp 0x28ff00 ebp 0x28ff28}, function
squaresum {esp 0x28fee4 ebp 0x28fe28}, dan terakhir function
square {esp 0x28fedc ebp 0x28fedc}. Stack pada ketiga fungsi
tersebut berperan dalam melakukan penyimpanan local variable
dan return address dari setiap fungsi. Apabila stack telah selesai
digunakan, maka nilainya akan direset kembali.
Call stack pada program digunakan untuk menyatakan posisi
stack terhadap fungsi yang saat itu digunakan. Misalnya pada
return squaresum, stack berada pada fungsi main. %sp atau
stack pointer berfungsi untuk menandai letak suatu stack. Nilai
%ebp selalu berada diatas nilai %esp dikarenakan base pointer
(ebp) menunjukan alamat tertinggi pada frame.
Proses pembaharuan nilai pointer dapat dinyatakan sebagai
berikut :
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
Pada tugas 9 ini dilakukan kompilasi program
fibo_main.exe yang merupakan executable file yang berasal
dari gabungan file fibo_main.c, inputn.c dan fibo.c . Ketiga
file dihubungkan dengan membuat dua buah header file yaitu
fibo.h dan inputn.h .
Inputn.h :
#ifdef accum
extern int input;
#endif
.Fibo.h
#ifdef accum
extern int fibo (int n);
#endif
Fibo.c adalahh file yang berisi code untuk menampilkan deret
bilangan Fibonacci sebanyak n input yang dimasukan oleh
user. Input diperoleh dari fungsi inputn.c . Sedangkan file
fibo_main.c adalah main program yang akan memanggil
kedua fungsi tersebut (fibo.c serta inputn.c). Header fibo.h
berisi deklarasi untuk fungsi fibo sedangkan header inputn.h
berisi deklarasi untuk fungsi inputn.h . Kedua header ini akan
di-include pada fibo_main.c kedua fungsi (fibo.c serta
inputn.c) dapat digunakan pada main program. Eksekusi
program berhasil sebagai berikut :

Gambar 10 Eksekusi program fibonacci

IV. SIMPULAN
Kompilasi pada GCC terdiri dari 4 tahap yaitu
preprocessing, compiling, assembling, dan linking. File
hasil preprocessing yaitu berekstensi .i . File hasil
compiling berekstensi file .s. File hasil ssembling
berekstensi file .o serta file hasil proses linking
berekstensi .exe . File .o dan .exe bertype file biner
sedangkan ketiga ekstensi file lainnya bertype file text.
Proses kompilasi pada GCC dapat dilakukan dengan
beberapa metode, yaitu menuliskan perintah tahap pertahap
pada command prompt, batch file, dan juga makefile.
Metode batch file pada dasarnya sama seperti melakukan
compiling satu per satu, namun ditulis dalam satu file
sehingga hanya memerlukan sedikit langkah pengerjaan.
Sedangkan metode kompilasi dengan makefile membuat
perintah eksekusi file menjadi lebih mudah.
Compiler GCC dapat melakukan disassembly file objek dan
file executable yaitu dengan mengubah file.o dan file.exe
manjadi bertype file assembly.
Kompilasi pada GCC dapat dilakukan dengan beberapa
jenis optimasi (disesuaikan dengan kebutuhan), seperti O0,
-O1,-O2, -O3, -Os, dan Ofast. Trade off yang
dipertimbangkan yaitu ukuran source code, runtime
program, kecepatan kompilasi, serta kemudahan dalam
debugging.
Header file berfungsi sebagai penghubung antara dua file
atau lebih sehingga fungsi atau prosedur pada suatu fungsi
juga dapat digunakan pada fungsi lain (yang dihubungkan).
Extern berfungsi untuk mendeklarasikan sebuah variable
global agar dapat dipakai pada semua file yang telah
diubungkan dengan header.
Pemanggilan prosedur dapat direpresentasikan sebagai
stack memory yang bersifat dinamis (ukuran dapat
membesar dan mengecil sesuai kebutuhan program yang
dijalankan).
REFERENSI
[1] Bryant, Randal E. Dan David R. OHallaron.
Computer Systems : A Programmers Perspective.
Prentice Hall. USA.2011.
[2] Tim Asisten Praktikum.Modul Praktikum EL3111
Arsitektur Sistem Komputer. Laboratorium Sinyal dan
Sistem Sekolah Teknik Elektro dan Informasika
Institut Teknologi Bandung. Bandung. 2015.

Lampiran
1. Source code untuk tugas I
a.

code.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul : 1
// Percobaan : 01
// Tanggal : 30 September 2015
// Kelompok : C
// Rombongan : 30
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : code.c
// Deskripsi : Demonstrasi proses kompilasi C
// Menjumlahkan deret bilangan sebanyak N_LOOP
#define N_LOOP 500
int main(void)
{
int indeks;
int accumulator;
indeks = 0;
accumulator = 0;
while(indeks<N_LOOP)
{
accumulator = accumulator + indeks;
indeks = indeks + 1;
}
return accumulator;
}

b. File code.i
# 1 "code.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "code.c"
# 13 "code.c"
int main(void)
{
int indeks;
int accumulator;
indeks = 0;
accumulator = 0;
while(indeks<500)
{
accumulator = accumulator + indeks;
indeks = indeks + 1;
}
return accumulator;
}

c.

File code.s
.file "code.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:

LFB0:
.cfi_startproc
pushl %ebp
.cfi_def_cfa_offset 8
.cfi_offset 5, -8
movl %esp, %ebp
.cfi_def_cfa_register 5
andl $-16, %esp
subl $16, %esp
call ___main
movl $0, 12(%esp)
movl $0, 8(%esp)
jmp L2
L3:
movl 12(%esp), %eax
addl %eax, 8(%esp)
incl 12(%esp)
L2:
cmpl $499, 12(%esp)
jle L3
movl 8(%esp), %eax
leave
.cfi_restore 5
.cfi_def_cfa 4, 4
ret
.cfi_endproc
LFE0:

d.

File code.o

e.

File code.exe (hanya sebagian screen shoot code)

2. Hasil tugas 3
a. Disasssembly_code_o.asm
code.o:

file format pe-i386

Disassembly of section .text:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: 83 ec 10
9: e8 00 00 00 00
e: c7 44 24 0c 00 00 00
15: 00
16: c7 44 24 08 00 00 00
1d: 00
1e: eb 0c
20: 8b 44 24 0c
24: 01 44 24 08
28: ff 44 24 0c
2c: 81 7c 24 0c f3 01 00
33: 00
34: 7e ea

push
mov
and
sub
call
movl

%ebp
%esp,%ebp
$0xfffffff0,%esp
$0x10,%esp
e <_main+0xe>
$0x0,0xc(%esp)

movl

$0x0,0x8(%esp)

jmp
mov
add
incl
cmpl

2c <_main+0x2c>
0xc(%esp),%eax
%eax,0x8(%esp)
0xc(%esp)
$0x1f3,0xc(%esp)

jle

20 <_main+0x20>

36: 8b 44 24 08
3a: c9
3b: c3

b.

3.

mov
leave
ret

0x8(%esp),%eax

Disassembly_code_exe.asm (hanya sebagian screen shoot code)

Hasil Tugas 4
a. code_O0.s
code_O0.o:

file format pe-i386

Disassembly of section .text:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: 83 ec 10
9: e8 00 00 00 00
e: c7 44 24 0c 00 00 00
15: 00
16: c7 44 24 08 00 00 00
1d: 00
1e: eb 0c
20: 8b 44 24 0c
24: 01 44 24 08
28: ff 44 24 0c

push
mov
and
sub
call
movl

%ebp
%esp,%ebp
$0xfffffff0,%esp
$0x10,%esp
e <_main+0xe>
$0x0,0xc(%esp)

movl

$0x0,0x8(%esp)

jmp
mov
add
incl

2c <_main+0x2c>
0xc(%esp),%eax
%eax,0x8(%esp)
0xc(%esp)

2c: 81 7c 24 0c f3 01 00
33: 00
34: 7e ea
36: 8b 44 24 08
3a: c9
3b: c3

b.

cmpl

$0x1f3,0xc(%esp)

jle
mov
leave
ret

20 <_main+0x20>
0x8(%esp),%eax

code_O1.s

code_O1.o:

file format pe-i386

Disassembly of section .text:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: e8 00 00 00 00
b: b8 00 00 00 00
10: 40
11: 3d f4 01 00 00
16: 75 f8
18: b8 4e e7 01 00
1d: c9
1e: c3
1f: 90

c.

push
mov
and
call
mov
inc
cmp
jne
mov
leave
ret
nop

%ebp
%esp,%ebp
$0xfffffff0,%esp
b <_main+0xb>
$0x0,%eax
%eax
$0x1f4,%eax
10 <_main+0x10>
$0x1e74e,%eax

code_O2.s

code_O2.o:

file format pe-i386

Disassembly of section .text.startup:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: e8 00 00 00 00
b: b8 4e e7 01 00
10: c9
11: c3
12: 90
13: 90

d.

push
mov
and
call
mov
leave
ret
nop
nop

%ebp
%esp,%ebp
$0xfffffff0,%esp
b <_main+0xb>
$0x1e74e,%eax

code_O3.s

code_O3.o:

file format pe-i386

Disassembly of section .text.startup:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0

push
mov
and

%ebp
%esp,%ebp
$0xfffffff0,%esp

6: e8 00 00 00 00
b: b8 4e e7 01 00
10: c9
11: c3
12: 90
13: 90

e.

call
mov
leave
ret
nop
nop

b <_main+0xb>
$0x1e74e,%eax

code_Os.s

code_Os.o:

file format pe-i386

Disassembly of section .text.startup:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: e8 00 00 00 00
b: b8 4e e7 01 00
10: c9
11: c3
12: 90
13: 90

f.

push
mov
and
call
mov
leave
ret
nop
nop

%ebp
%esp,%ebp
$0xfffffff0,%esp
b <_main+0xb>
$0x1e74e,%eax

code_Ofast.s
code_Ofast.o:

file format pe-i386

Disassembly of section .text.startup:


00000000 <_main>:
0: 55
1: 89 e5
3: 83 e4 f0
6: e8 00 00 00 00
b: b8 4e e7 01 00
10: c9
11: c3
12: 90
13: 90

4.

push
mov
and
call
mov
leave
ret
nop
nop

%ebp
%esp,%ebp
$0xfffffff0,%esp
b <_main+0xb>
$0x1e74e,%eax

Hasil tugas 5
a. Main_text.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 05
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : main_text.c
// Deskripsi : Demonstrasi MakeFile
// Memanggil prosedur test pada text.c

#include "text.h"
void main(void)
{
test();
}

b. Text.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 05
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// 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");
}

c. Text.h
#ifndef TES_H
#define TES_H 100
void test(void);
#endif

5.

Hasil Tugas 7
a. Add.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 07
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : add.c
// Deskripsi : Demonstrasi header file
// Menjumlahkan dua bilangan
#define START_VAL 0
int accum = START_VAL;
int sum(int x, int y)
{
int t = x + y;
accum += t;
return t;
}

b. Main.c
// Praktikum EL3111 Arsitektur Sistem Komputer

//
//
//
//
//
//
//
//
//
//

Modul
: 01
Percobaan : 07
Tanggal
: 30 September 2015
Kelompok : 30
Rombongan : C
Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
Nama File : main.c
Deskripsi : Demonstrasi header file
Menjumlahkan dua bilangan

#include <stdio.h>
#include "add.h"
int main(void)
{
int x,y,z;
scanf("%d", &x);
scanf("%d", &y);
z = sum(x,y);
printf("%d", z);
return 0;
}
c. Add.h
#ifndef accum
extern int sum (int x, int y);
#endif
d. Makefile
all: main.exe
main.exe: main.o add.o
gcc main.o add.o -o main.exe
main.o: main.c
gcc -c main.c
add.o: add.c
gcc -c add.c
6.

Kode program tugas 9


a. Inputn.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 09
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : inputn.c
// Deskripsi : Program fibonacci
#include <stdio.h>
#define START_VAL 0
int accum = START_VAL;
int input (void)

{
int n;
scanf("%d", &n);
while (n<2)
{
scanf("%d", &n);
}
return (n);
}
b. Fibo.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 09
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : fibo.c
// Deskripsi : Program fibonacci
#include <stdio.h>
int fibo (int n)
{
int i;
int a = 1;
int b = 1;
int c;
printf("1, 1, ");
for (i=1;i<=n-2;i++)
{
c = a+b;
printf("%d, ",c);
a = b;
b = c;
}
return 0;
}
c. Fibo_main.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul
: 01
// Percobaan : 09
// Tanggal
: 30 September 2015
// Kelompok : 30
// Rombongan : C
// Nama (NIM) 1 : Rosana Dewi Amelinda (13213060)
// Nama (NIM) 2 : Audinata Ibrahim Sitaba(13213061)
// Nama File : fibo_main.c
// Deskripsi : Program fibonacci
#include <stdio.h>
#include "inputn.h"
#include "fibo.h"
int main(void)
{
int a;

a = input();
fibo(a);
return 0 ;
}