Anda di halaman 1dari 17

PERCOBAAN 1 COMPILER BAHASA C

DAN BAHASA ASSEMBLY INTEL x86


Kevin Manatar Oloan Situmorang (13212029)
Asisten: Devi Oktama Putri Lim (13211124)
Tanggal Percobaan: 29/09/2014
EL3111 - Praktikum Arsitektur Sistem Komputer

Laboratorium Dasar Teknik Elektro - Sekolah Teknik Elektro dan Informatika ITB
Abstrak
Buat program kode seperti pada
modul. Simpan file dengna
code.c.

Pada percobaan ini, praktikan akan memahami tentang


proses kompilasi bahasa C menjadi bahasa mesin. Di
antara proses tersebut akan dipahami bahasa assembly
yang terjadi dalam proses compiler. Di dalamnya akan
ada pemahaman mengenai stack dan procedure call.
Kata kunci : bahasa C, assembly, makefile, batch file,
stack memory, procedure call.

1.

Preprocess code.c menjadi code.i.


(Perintah command prompt
terdapat pada modul).

PENDAHULUAN

Adapun beberapa tujuan yang hendak dicapai


dalam modul praktikum ini adalah sebagai berikut:

Praktikan memahami tahap-tahap kompilasi


program dalam Bahasa C sebagai Bahasa
tingkat tinggi hingga diperoleh Bahasa tingkat
rendah yang dapat dieksekusi oleh mesin.

Praktikan mampu melakukan kompilasi


program bahasa C menggunakan compiler
GCC beserta penggunaan makefile dan batch
file.

Praktikan memahami bahasa assembly dan


mampu melakukan analisis terhadap bahasa
assembly Interl x86 yang dihasilkan oleh
compiler GCC.

Praktikan memahami penggunaan


memory pada setiap procedure call.

Assemble code.c menjadi


code.o. (Perintah command
prompt terdapat pada modul).

Lakukan semua proses


kompilasi menjadi code .exe
(Perintah command prompt
terdapat pada modul).

stack
Buka file code.o dan
code.exe pada teks editor.
Bandingkan hasilnya.

Dalam praktikum ini, beberapa perangkat yang


dipakai adalah sebagai berikut.

Komputer Desktop / Laptop dengan system


operasi Microsoft Windows 7/8/8.1.

Compiler GCC dalam paket program


CodeBlocks untuk melakukan kompilasi
program.

Notepad++ sebagai teks editor dan HexEdit


sebagai heksadesimal editor.

Tugas 2 : Proses Kompilasi Bahasa C


Menggunakan GCC dengan Bantuan Batch File

Berikut dijelaskan metode (langkah-langkah)


percobaan yang akan dikerjakan.

Tugas 1 : Proses
Menggunakan GCC

Kompilasi

Bahasa

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Salin file code.c dari tugas 1 ke


tugas 2.

Salin code.c dari folder tugas 2 ke folder


tugas 4.

Buat batch file dengan kode


terlampir pada modul.

Ubah nama file code.c menjadi


code_O0.c.

Simpan kode dengan nama


batch.bat pada folder yang
sama dengan code.c.

Salin code_O0.c menjadi code_O1.c,


code_O2.c, code_O3.c , code_Os.c,
code_Ofast.c.

Klik batch.bat.

Buat file batch.bat untuk mengkompilasi


kelima file di atas (Perintah command
prompt terdapat pada moudl).

Lihat semua file yang


dihasilkan folder tersebut.

Buat file code_O0.s, code_O1.s,


code_O2.c, code_O3.s, code_Os.s, dan
code_Ofast.s dengan teks editor.

Tugas 3 : Disassembly File Objek

Salin file code.o dan code.exe dari foler


tugas 2 ke folder tugas 3.

Tugas 5 : Kompilasi Beberapa File Kode dengan


GCC
Buatlah file main_text.c
terdapat pada modul.

Gunakan objdump untuk disassembly


code.o (Perintah command propmpt
terlampir pada modul).
Buatlah file text.c tedapat
pada modul.
Gunakan objdump untuk disassembly
code.exe (Perintah command propmpt
terlampir pada modul).
Buatlah file text.h terdapat
pada modul.
Buka file disassemlby_code.o dan
disassembly_code_exe.asm dengan
teks editor. Bandingkan.

Lakukan kompilasi file


(Perintah command prompt
tedapat pada modul).

Tugas 4 : Optimisasi Kompilasi Program pada


GCC

Jalankan prgram
main_text.exe.

Tugas 6 : Penggunaan Makefile pada GCC

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Buka CodeBlocks lakukan setting seperti pada modul.

Salin file main_text.c, text.c, dan


text.h dari folder tugas 5 ke folder
tugas 6.

Perhatikan nilai CPU Registers, Call Stack, Disassembly,


Memory Dump, dan Watches untuk setiap kode.

Buatlah makefile dengan


menggunakan teks editor
terdapat pada modul.

Analisis data yang diperoleh.


Simpan makefile dengan nama
makefile (tanpa eksistensi /
akhiran).

Tugas 9 : Program Fibonacci


Implementasi prosedur-prosedur
yang dibutuhkan. Disertakan juga
file header.

Gunakan command prompt untuk


kompilasi. (Perintah command
prompt terlampir pada modul).

Buat program utama fibo_main.c.


Bandingkan hasil tugas 5 dengan
tugas 6 melakukan main_text.exe.

Buat makefile untuk melakukan


kompilasi seluruh file kode
program.

Tugas 7 : Header File


Pada tugas ini, akan diapahami
bagaimana extern pada header file.

Jalankan program yang telah


dikompilasi lalu periksa
fungsionalitasnya.

Buatlah program dengan kode terlampir di modul.

2.
Simpan dengan nama add.c.

LANDASAN TEORITIS

2.1

KOMPILASI MENGGUNAKAN GCC

Proses menerjemahkan baris kode program dalam


Bahasa C menjadi file executable dilakukan dalam
empat langkah yaitu pre-processor, compiler,
assembler, dan linker yang seluruhnya disebut
sistem kompilasi.

Buat sebuah program sederhana main.c.

Buatlah header file add.h pada main.c.

Semua perintah pre-processor yang ditulis dalam


bahasa tingkat tinggi akan diproses terlebih dahulu
oleh
pre-processor
sebelum
compiler
melaksanakan tugasnya. Beberapa tugas dari preprocessor ini adalah sebagai berikut.

Lakukan kompilasi file


(Perintah command prompt
terdapat pada modul).

Preprocessor

Tugas 8 : Pemanggilan Prosedur dan Stack


Memory

Semua komentar dalam file program


diganti dengan spasi satu buah.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

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,
pre-processor
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 masih
berupa file teks (.s).

Assembler
Assembler akan menerjemahkan bahasa
assembly menjadifile 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 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).

2.2

DISSASSEMBLY MENGGUNAKAN GCC

Selain dapat melakukan kompilasi, paket compiler


GCC juga menyertakan sebuah disassembler yang
mampu melakukan disassembly file biner
(.oatau .exe) menjadi file assembly(.s) bernama
Object Dump.

2.3

OPTIMISASI 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.

2.4

MAKEFILE DAN BATCH FILE

Untuk suatu project yang terdiri atas beberapa file


kode, tentu akan sangat merepotkan untuk
melakukan kompilasi dengan menggunakan
perintah kompilasi yang ditulis pada command
prompt satu per satu untuk setiap file. GCC
memiliki fitur makefile yang 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.
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 perintahperintah tersebut, kita cukup menjalankan file .bat
tersebut sehingga command prompt terbuka dan
perintah-perintah yang kita tuliskan dieksekusi
secara otomatis.

2.5

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 register 32-bit
yang bersifat general storage.
ESI dan EDI adalah register 32-bit yang
digunakan sebagai indexing register. Register ini
juga dapat digunakan sebagai general storage.
ESP adalah register 32-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

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

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.

Instruksi-instruksi yang digunakan pada Intel


x86 tidak akan dijelaskan di dalam modul
praktikum ini. Praktikan dapat mempelajari lebih
jauh mengenai instruksi-instruksi ini pada bab 3di
buku Computer System A Programmers
Perspective yang ditulis oleh Bryant dan
OHallaron.

2.6

STACK DAN PROCEDURE CALL

3.

Stack pada umumnya disusun atas beberapa


activation frame. Setiap frame memiliki sebuah base
pointeryang menunjukkan alamat tertinggi (highest
address) pada frame tersebut. Karena stack tumbuh
dari high address menuju low address, base
pointerakan menunjukkan alamat tertinggi frame
tersebut.
Ketika suatu program (caller) memanggil sebuah
prosedur (callee), caller akan memasukkan
argumen-argumen untuk memanggil callee dari
argumen terakhir hingga argumen paling awal
secara berurutan ke dalam stack. Selanjutnya, caller
akan memasukkan return addresske dalam stack.
Kemudian, callee memasukkan alamat old base
pointer milik caller ke dalam stackdan memperbarui
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 lokal 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. Kemudian, return address digunakan untuk
melanjutkan eksekusi instruksi pada caller.

3.1

HASIL DAN ANALISIS


TUGAS 1 : PROSES KOMPILASI BAHASA
C MENGGUNAKAN GCC

Setelah dilihat pada teks editor, code.o dan


code.exe sama-sama menghasilkan kode biner.
Namun code.o menghasilkan kode yang lebih
singkat dibandingkan dengan code.exe.
Sesuai dengan teori yang dipahami pada landasan
teoritis, hasil terjemahan assembler akan
menghasilkan file objek. File objek ini apabila
melalui linker akan menjadi executable file yang
akan mempaparkan file biner lainnya yang
merupakan dependency dari program yang dibuat.
Oleh karena itulah executable file akan berisi file
biner daripada file objek.

Gambar 3.1.1 Screenshot potongan code.o

Gambar 3.1.2 Screenshot potongan code.exe

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Berdasarkan pengamatan screenshot di atas, file


objek tidak dapat dibaca dalam teks editor karena
file objek berupa file biner yang tidak dapat dibaca
oleh teks editor.
Adapun seperti kita ketahui proses kompilasi
bahasa C diolah menjadi bahasa mesin melalui 4
tahap yaitu pre-processor, compiler, assembler,
dan linker. Apabila program dijalankan dalam
suatu mikroprocessor yang berbeda, maka
assembler harus didesain sedemikian rupa agar file
bahasa C dapat menghasilkan terjemahan bahasa
mesin yang sama.

3.2

TUGAS 2 : PROSES KOMPILASI BAHASA


C MENGGUNAKAN GCC DENGAN
BANTUAN BATCH FILE

Setelah menjalankan batch file, diperoleh file-file


yang sama seperti yang dihasilkan pada tugas 1.
Dari hasil ini, dapat disimpulkan bahwa batch file
dapat melakukan kerja yang sama dengan
mengetik kode di command prompt secara manual.
Sesuai dengan landasan teoritis, batch file mampu
mengeksekusi perintah-perintah dengan cukup
menjalankan file .bat sehingga command prompt
dapat terbuka dan perintah-perintah yang
dituliskan dieksekusi secara otomatis.

Gambar 3.3.2 Screenshot potongan


disassemlby_code_exe.asm

3.4

TUGAS 4 : OPTIMISASI KOMPILASI


PROGRAM PADA GCC

Diperoleh beberapa file assembly untuk masingmasing optimisasi kompilasi sebagai berikut.
code_O0.o:

file format pe-i386

Disassembly of section .text:

3.3

TUGAS 3 : DISASSEMBLY FILE OBJEK

Fungsi Object Dump akan melakukan disassemlby


dari file biner (.o atau .exe) menjadi file assembly
(.s). Diperoleh hasil file assembly seperti di bawah.

Gambar 3.3.1 Screenshot disassemlby_code_o.asm

00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: 83 ec 10
$0x10,%esp
9: e8 00 00 00
<_main+0xe>
e: c7 44 24 0c
$0x0,0xc(%esp)
15: 00
16: c7 44 24 08
$0x0,0x8(%esp)
1d: 00
1e: eb 0c
<_main+0x2c>
20: 8b 44 24 0c
0xc(%esp),%eax
24: 01 44 24 08
%eax,0x8(%esp)
28: ff 44 24 0c
0xc(%esp)
2c: 81 7c 24 0c
$0x1f3,0xc(%esp)
33: 00
34: 7e ea
<_main+0x20>
36: 8b 44 24 08
0x8(%esp),%eax
3a: c9
3b: c3

push
mov

%ebp

and
sub
00

call

00 00 00

movl

00 00 00

movl
jmp

2c

mov
add
incl
f3 01 00

cmpl
jle

20

mov
leave
ret

Kode 3.4.1 code_O0.s


Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

code_O3.o:
code_O1.o:

file format pe-i386

file format pe-i386


Disassembly of section .text.startup:

Disassembly of section .text:


00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: e8 00 00 00
<_main+0xb>
b: b8 00 00 00
$0x0,%eax
10: 40
11: 3d f4 01 00
$0x1f4,%eax
16: 75 f8
<_main+0x10>
18: b8 4e e7 01
$0x1e74e,%eax
1d: c9
1e: c3
1f: 90

push
mov

%ebp

and
00

call

00

mov
inc
cmp

%eax

00

jne

10

00

leave
ret
nop

%ebp

and
call

mov
leave
ret
nop
nop

Kode 3.4.2 code_O3.s

code_Ofast.o:

Disassembly of section .text.startup:


push
mov

%ebp

and
call

00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: e8 00 00 00 00
<_main+0xb>
b: b8 4e e7 01 00
$0x1e74e,%eax
10: c9
11: c3
12: 90
13: 90

Kode 3.4.2 code_O2.s

push
mov

%ebp

and
call

mov
leave
ret
nop
nop

Kode 3.4.2 code_Ofast.s

mov
leave
ret
nop
nop

file format pe-i386

Disassembly of section .text.startup:

file format pe-i386

00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: e8 00 00 00 00
<_main+0xb>
b: b8 4e e7 01 00
$0x1e74e,%eax
10: c9
11: c3
12: 90
13: 90

push
mov

mov

Kode 3.4.2 code_O1.s

code_O2.o:

00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: e8 00 00 00 00
<_main+0xb>
b: b8 4e e7 01 00
$0x1e74e,%eax
10: c9
11: c3
12: 90
13: 90

code_Os.o:

file format pe-i386

Disassembly of section .text.startup:


00000000 <_main>:
0: 55
1: 89 e5
%esp,%ebp
3: 83 e4 f0
$0xfffffff0,%esp
6: e8 00 00 00 00
<_main+0xb>
b: b8 4e e7 01 00
$0x1e74e,%eax
10: c9
11: c3
12: 90
13: 90

push
mov

%ebp

and
call

mov
leave
ret
nop
nop

Kode 3.4.2 code_Os.s

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Dari tampilan file assembly hasil optimisasi


kompilasi program di atas, diperoleh beberapa
analisis sebagai berikut.

File assembly hasil kompilasi O0 memiliki


code size yang lebih besar dibandingkan file
assembly yang lain. Di samping itu
penggunaan memori lebih sedikit.
File assembly hasil kompilasi O1 memiliki
code size lebih kecil dibandingkan file
assembly hasil kompilasi O0. Namun
menggunakan memori yang lebih banyak.

File assembly hasil kompilasi O2 memiliki


code size yang lebih kecil lagi dibandingkan
file assembly hasil kompilasi O1. Penggunaan
memori sama dengan sebelumnya.

Untuk file assembly hasil kompilasi O3


memiliki code size yang sama dengan file
assembly hasil kompilasi O2. Penggunaan
memori juga sama seperti sebelumnya. Namun
waktu dalam melakukan kompilasi semakin
lama.

3.5

File assembly hasil kompilasi Os memiliki


code size yang sama dengan assembly O3 dan
waktu kompilasi juga berkurang dibandingkan
dengan hasil kompilasi O3.
File assembly hasil kompilasi Ofast memiliki
code size yang sama dengan assembly Os dan
memiliki waktu kompilasi yang sama dengan
waktu kompilasi mode O3.

TUGAS 5 : KOMPILASI BEBERAPA FILE


KODE DENGAN GCC

Hasil yang ditampilkan oleh main_text.exe :

prompt secara manual. Perbedaan dengan batch


file adalah makefile melakukan beberapa perintah
dalam satu perintah di command prompt.
Sedangkan batch file melakukannya untuk setiap
perintah.
Adapun hasil tugas 5 dan hasil tugas 6 adalah sama
(dapat dilihat pada hasil tampilan gambar 3.5.1 dan
gambar 3.5.2).

3.7

TUGAS 7 : HEADER FILE

Hasil yang ditampilkan oleh main.exe :

Gambar 3.7.1 Screenshot main.exe


Pada percobaan ini, digunakan extern agar variabel
accum dapat diakses secara global. Variabel accum
diletakkan dalam file header.

3.8

TUGAS 8 : PEMANGGILAN PROSEDUR


DAN STACK MEMORY

Setelah melakukan percobaan diperoleh hasil


sebagai berikut.

Gambar 3.8.1 Isi register ESP dan EBP pada CPU


Register pada return squaresum(a, b);

Gambar 3.5.1 Screenshot main_text.exe


Pada percobaan ini, file bahasa C dapat berjalan
walaupun terdiri atas file yang terpisah. File-file
dapat tetap terintegrasi karena digunakan file
header. Pada percobaan ini digunakan file text.h.

3.6

Gambar 3.8.2 Call stack pada return


squaresum(a, b);

TUGAS 6 : PENGGUNAAN MAKEFILE


PADA GCC

Hasil yang ditampilkan oleh main_text.exe :

Gambar 3.6.1 Screenshot main_text.exe


Pada percobaan ini digunakan makefile (terlampir).
Penggunaan makefile (sesuai dengan landasarn
teoritis) akan mempersingkat proses kompilasi
dibandingkan dengan menggunakan command
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Gambar 3.8.3 Nilai memory ESP pada return


squaresum(a, b);

Gambar 3.8.8 Nilai memory EBP pada int temp1


= square(y);
Gambar 3.8.4 Nilai memory EBP pada return
squaresum(a, b);

Gambar 3.8.9 Isi register ESP dan EBP pada CPU


Register pada return x*x;
Gambar 3.8.5 Isi register ESP dan EBP pada CPU
Register pada int temp1 = square(y);

Gambar 3.8.10 Call stack pada return x*x;


Gambar 3.8.6 Call stack pada int temp1 =
square(y);

Gambar 3.8.11 Nilai memory ESP dan EBP pada


return x*x;
Gambar 3.8.7 Nilai memory ESP pada int temp1
= square(y);

Gambar 3.8.12 Isi register ESP dan EBP pada CPU


Register pada int temp2 = square(z);

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

Gambar 3.8.13 Call stack pada int temp2 =


square(z);
Gambar 3.8.18 Nilai memory ESP pada return
x*x;

Gambar 3.8.19 Isi register ESP dan EBP pada CPU


Register pada return temp1+temp2;

Gambar 3.8.14 Nilai memory ESP pada int


temp2 = square(z);

Gambar 3.8.20 Call stack pada return


temp1+temp2;

Gambar 3.8.15 Nilai memory ESP pada int


temp2 = square(z);

Gambar 3.8.16 Isi register ESP dan EBP pada CPU


Register pada return x*x;

Gambar 3.8.21 Nilai memory ESP pada return


temp1+temp2;

Gambar 3.8.17 Call stack pada return x*x;

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

1
0

Gambar 3.8.22 Nilai memory EBP pada return


temp1+temp2;

Gambar 3.9.1 Hasil kompilasi menggunakan


makefile
Gambar 3.8.23 Isi register ESP dan EBP pada CPU
Register saat program selesai dieksekusi
Gambar 3.9.2 Tampilan fibo_main.exe

4.

KESIMPULAN

Diperoleh beberapa kesimpulan yaitu sebagai


berikut.
Gambar 3.8.24 Call stack saat program selesai
dieksekusi

Gambar 3.8.25 Nilai memory ESP saat program


selesai dieksekusi

Gambar 3.8.26 Nilai memory EBP saat program


selesai dieksekusi

3.9

Proses kompilasi program dalam bahasa C


dilalui oleh 4 tahap, yaitu preprocessor,
compiler, assembler, dan linker.

Makefile dan batch file dapat digunakan untuk


mempermudah dalam melakukan kompilasi.

Bahasa assembly dihasilkan dari proses


assembler
dimana
bahasa
assembly
bergantung dari bahasa C-nya.

Untuk setiap proses procedure call akan


dialokasikan dalam stack memory.

DAFTAR PUSTAKA
[1]

Hanindhito, Bagus. Modul Praktikum EL3111


Arsitektur Sistem Komputer, Sekolah Teknik
Elektro dan Informatika, Bandung, 2014.

[2]

Bryant, Randal, dan David OHallaron.


Computer Systems : A Programmers Perspective 2nd
Edition. 2011. Massachusetts : Pearson
Education Inc.

[3]

Patterson, David, dan John Hennessy.


Computer Organization and Design: The
Hardware/Software Interface. 2012. Waltham :
Elsevier Inc.
LAMPIRAN

Lampiran untuk Tugas 1 :

TUGAS 9 : PROGRAM FIBONACCI

Setelah melakukan percobaan ini, diperoleh hasil


seperti di bawah.

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

11

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul
: 1
// Percobaan
: Proses
Kompilasi Bahasa C Menggunakan GCC
// Tanggal
: 29 September
2014
// Kelompok
: 16
// Rombongan
: A
// Nama (NIM) 1
: Khairunnisa
(13212028)
// Nama (NIM) 2
: Kevin Manatar
Oloan Situmorang (13212029)
// 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;
}

Kode 5.1.1 code.c


Lampiran untuk Tugas 2 :
%~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

%~d0
cd "%~dp0"
gcc -O0 -c code_O0.c
gcc -O1 -c code_O1.c
gcc -O2 -c code_O2.c
gcc -O3 -c code_O3.c
gcc -Os -c code_Os.c
gcc -Ofast -c code_Ofast.c
objdump -d code_O0.o > code_O0.s
objdump -d code_O1.o > code_O1.s
objdump -d code_O2.o > code_O2.s
objdump -d code_O3.o > code_O3.s
objdump -d code_Os.o > code_Os.s
objdump -d code_Ofast.o >
code_Ofast.s
pause

Kode 5.4.1 batch.bat


Lampiran untuk Tugas 5 :
// Praktikum EL3111 Arsitektur
Sistem Komputer
// Modul : 1
// Percobaan : Kompilasi Beberapa
File Kode dengan GCC
// Tanggal : 9 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// 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");
}

Kode 5.5.1 text.c

Kode 5.2.1 batch.bat


Lampiran untuk Tugas 4 :

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

12

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Kompilasi Beberapa
File Kode dengan GCC
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : text.h
// Deskripsi : Demonstrasi
MakeFile, Mencetak string ke layar
#ifndef TES_H
#define TES_H 100
void test(void);
#endif

Kode 5.5.2 text.h

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Kompilasi Beberapa
File Kode dengan GCC
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : main_text.c
// Deskripsi : Demonstrasi
MakeFile memanggil prosedur test
pada text.c
#include "text.h"
void main(void)
{
test();

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

Kode 5.6.1 makefile


Lampiran untuk Tugas 7 :
// Praktikum EL3111 Arsitektur
Sistem Komputer
// Modul : 1
// Percobaan : Header File
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : add.c
// Deskripsi : Demonstrasi header
file menjumlahkan dua bilangan
#include "add.h"
#include <stdio.h>
int accum = START_VAL;
int sum(int x, int y)
{
int t = x + y;
accum += t;
return t;
}

Kode 5.7.1 add.c

Kode 5.5.3 main_text.c


Lampiran untuk Tugas 6 :

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

13

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Header File
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : add.h
// Deskripsi : Demonstrasi
MakeFile

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Header File
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : main_add.c
// Deskripsi : Demonstrasi
MakeFile

#ifndef START_VAL
#define START_VAL 0
extern int accum;
int sum(int x, int y);
#endif

#include<stdio.h>
#include "add.h"
void main(void)
{
int x;
int y;
int z;
printf ("Masukkan bilangan
pertama :");
scanf("%d", &x);
printf ("Masukkan bilangan
kedua :");
scanf ("%d", &y);
z = sum(x,y);
printf ("Jumlahnya : %d\n",
z);
printf ("Masukkan bilangan
pertama :");
scanf("%d", &x);
printf ("Masukkan bilangan
kedua :");
scanf ("%d", &y);
z = sum(x,y);
printf ("Jumlahnya : %d\n",
z);
printf("akumulasi: %d\n",
accum);
}

Kode 5.7.2 add.h

Kode 5.7.3 main.c


Lampiran untuk Tugas 8 :

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

14

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Pemanggilan
Prosedur dan Stack Memory
// Tanggal : 9 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : sumofsquare.c
// Deskripsi : Demonstrasi
procedure call dan stack
menghitung jumlah dari kuadrat
bilangan

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Program Fibonacci
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : fibo.c
// Deskripsi : Menangani proses
kalkulasi deret

#include <stdio.h>
#include <stdlib.h>

int accum = START_VAL;


int fibo (int x, int y)
{
int t = x + y;
accum += t;
return t;

int square (int x)


{
return x*x;
}

#include <stdio.h>
#include "fibo.h"

}
int squaresum (int y, int z)
{
int temp1 = square(y);
int temp2 = square(z);
return temp1+temp2;
}
int main (void)
{
int a = 5; int b = 9;
return squaresum(a,b);
}

Kode 5.8.1 Kode sumofsquare.c


Lampiran untuk Tugas 9 :

Kode 5.9.1 Kode fibo.c


// Praktikum EL3111 Arsitektur
Sistem Komputer
// Modul : 1
// Percobaan : Program Fibonacci
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : fibo.h
// Deskripsi : Demonstrasi
MakeFile,
#ifndef START_VAL
#define START_VAL 0
extern int accum;
int fibo(int x, int y);
#endif

Kode 5.9.2 Kode fibo.h

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

15

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Program Fibonacci
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : inputn.c
// Deskripsi : Menangani proses
meminta pengguna untuk memasukkan
nilai n hingga menerima dan
menyimpan nilai n yang dimasukkan
pengguna.

// Praktikum EL3111 Arsitektur


Sistem Komputer
// Modul : 1
// Percobaan : Program Fibonacci
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : main.c
// Deskripsi : Memanggil prosedurprosedur pada inputn.c dan fibo.c

#include <stdio.h>
#include "inputn.h"

void main(void)
{
int i;
int z;
int batas;

void inputn (int *n)


{
char temp;
printf("Masukkan nilai n :");
scanf ("%d", &(*n));
scanf("%c", &temp);

#include <stdio.h>
#include "fibo.h"
#include "inputn.h"

inputn(&batas);
int a = 1;
int b = 1;

}
printf ("%d ", a);
printf ("%d ", b);
if (batas>2)
{
for (i=3;i<=batas;i++)
{
z = fibo (a,b);
printf ("%d ", z);
a=b;
b=z;
}
}

Kode 5.9.3 Kode inputn.c


// Praktikum EL3111 Arsitektur
Sistem Komputer
// Modul : 1
// Percobaan : Program Fibonacci
// Tanggal : 29 September 2014
// Kelompok : 16
// Rombongan : A
// Nama (NIM) 1 : Khairunnisa
(13212028)
// Nama (NIM) 2 : Kevin Manatar
Oloan Situmorang (13212029)
// Nama File : inputn.h
// Deskripsi : Demonstrasi
MakeFile,
#ifndef START_VAL
#define START_VAL 0
void inputn(int *n);
#endif

Kode 5.9.4 Kode inputn.h

Kode 5.9.5 Kode fibo_main.c


all: fibo_main.exe
fibo_main.exe: fibo_main.o fibo.o
inputn.o
gcc fibo_main.o fibo.o
inputn.o -o fibo_main.exe
fibo_main.o: fibo_main.c
gcc -c fibo_main.c
fibo.o: fibo.c
gcc -c fibo.c
inputn.o: inputn.c
gcc -c inputn.c
Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

16

Kode 5.9.6 Kode makefile

Laporan Praktikum - Laboratorium Dasar Teknik Elektro STEI ITB

17