• Tidak ada hasil yang ditemukan

EL3111_1_13213060

N/A
N/A
Protected

Academic year: 2021

Membagikan "EL3111_1_13213060"

Copied!
17
0
0

Teks penuh

(1)

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.

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

(2)

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

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

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

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 :

-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

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.

(3)

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.

(4)

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

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

Namun saat dibuka dengan HexEdit maka tampilan akan berupa suatu pola bilangan biner (seperti pada Lampiran 1e).

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

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

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

(5)

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

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

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

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 7 Perintah eksekusi pada command prompt

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

(6)

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

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

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

(7)

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. O’Hallaron. Computer Systems : A Programmer’s 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.

(8)

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:

(9)

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

(10)

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 push %ebp 1:89 e5 mov %esp,%ebp

3:83 e4 f0 and $0xfffffff0,%esp

6:83 ec 10 sub $0x10,%esp

9:e8 00 00 00 00 call e <_main+0xe>

e:c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp)

15:00

16:c7 44 24 08 00 00 00 movl $0x0,0x8(%esp)

1d:00

1e:eb 0c jmp 2c <_main+0x2c>

20:8b 44 24 0c mov 0xc(%esp),%eax

24:01 44 24 08 add %eax,0x8(%esp)

28:ff 44 24 0c incl 0xc(%esp)

2c:81 7c 24 0c f3 01 00 cmpl $0x1f3,0xc(%esp)

33:00

(11)

36:8b 44 24 08 mov 0x8(%esp),%eax

3a:c9 leave 3b:c3 ret

b. Disassembly_code_exe.asm (hanya sebagian screen shoot code)

3. Hasil Tugas 4 a. code_O0.s

code_O0.o: file format pe-i386

Disassembly of section .text: 00000000 <_main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: 83 ec 10 sub $0x10,%esp 9: e8 00 00 00 00 call e <_main+0xe> e: c7 44 24 0c 00 00 00 movl $0x0,0xc(%esp) 15: 00 16: c7 44 24 08 00 00 00 movl $0x0,0x8(%esp) 1d: 00 1e: eb 0c jmp 2c <_main+0x2c> 20: 8b 44 24 0c mov 0xc(%esp),%eax 24: 01 44 24 08 add %eax,0x8(%esp) 28: ff 44 24 0c incl 0xc(%esp)

(12)

2c: 81 7c 24 0c f3 01 00 cmpl $0x1f3,0xc(%esp) 33: 00 34: 7e ea jle 20 <_main+0x20> 36: 8b 44 24 08 mov 0x8(%esp),%eax 3a: c9 leave 3b: c3 ret b. code_O1.s

code_O1.o: file format pe-i386

Disassembly of section .text: 00000000 <_main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: e8 00 00 00 00 call b <_main+0xb> b: b8 00 00 00 00 mov $0x0,%eax 10: 40 inc %eax 11: 3d f4 01 00 00 cmp $0x1f4,%eax 16: 75 f8 jne 10 <_main+0x10> 18: b8 4e e7 01 00 mov $0x1e74e,%eax 1d: c9 leave 1e: c3 ret 1f: 90 nop c. code_O2.s

code_O2.o: file format pe-i386

Disassembly of section .text.startup: 00000000 <_main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: e8 00 00 00 00 call b <_main+0xb> b: b8 4e e7 01 00 mov $0x1e74e,%eax 10: c9 leave 11: c3 ret 12: 90 nop 13: 90 nop d. code_O3.s

code_O3.o: file format pe-i386

Disassembly of section .text.startup: 00000000 <_main>:

0: 55 push %ebp 1: 89 e5 mov %esp,%ebp

(13)

6: e8 00 00 00 00 call b <_main+0xb> b: b8 4e e7 01 00 mov $0x1e74e,%eax 10: c9 leave 11: c3 ret 12: 90 nop 13: 90 nop e. code_Os.s

code_Os.o: file format pe-i386

Disassembly of section .text.startup: 00000000 <_main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: e8 00 00 00 00 call b <_main+0xb> b: b8 4e e7 01 00 mov $0x1e74e,%eax 10: c9 leave 11: c3 ret 12: 90 nop 13: 90 nop f. code_Ofast.s

code_Ofast.o: file format pe-i386

Disassembly of section .text.startup: 00000000 <_main>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 83 e4 f0 and $0xfffffff0,%esp 6: e8 00 00 00 00 call b <_main+0xb> b: b8 4e e7 01 00 mov $0x1e74e,%eax 10: c9 leave 11: c3 ret 12: 90 nop 13: 90 nop 4. 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

(14)

#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

(15)

// 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)

(16)

{ 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) {

(17)

a = input();

fibo(a); return 0 ; }

Gambar

Gambar 1 Proses kompilasi
Gambar 5 Perbandingan hasil kompilasi pertahap dengan GCC dan  batch file
Gambar 9 Eksekusi program pada command prompt

Referensi

Dokumen terkait

Berdasarkan uraian di atas penulis berkeinginan untuk melakukan penelitian tentang pemberian bawang putih dalam bentuk tepung yang diberikan dalam ransum dengan berbagai

Parfum Laundry Semarang Beli di Toko, Agen, Distributor Surga Pewangi Laundry Terdekat/ Dikirim dari Pabrik BERIKUT INI PANGSA PASAR PRODUK NYA:.. Kimia Untuk Keperluan Laundry

tertinggi (15%) dicapai oleh 16 provinsi dari 21 provinsi dampingan wilayah -2 , sedangkan 5 provinsi yang tidak mencapai skor maksimal yaitu; Jawa Tengah, Jawa

Begitu juga dengan sifat-sifat yang telah disepakati atau kesesuaian produk untuk aplikasi tertentu tidak dapat disimpulkan dari data yang ada dalam Lembaran Data Keselamatan

Menetapkan batas angka acak atau bilangan random menggunakan n random menggunakan pecahan desimal yang dimulai dari 0,0000.. Simulasi Monte Carlo sampai pasien ke-150.. c)

• Syarat KEBARUAN untuk memperoleh hak paten bagi suatu invensi adalah penting, karena adalah TIDAK ADIL atau MERUGIKAN masyarakat luas jika sebuah invensi yg sudah umum

Berbeda dengan hasil penelitian oleh Nuraeni et al., (2013), adapun metode konservasi yang sudah diterapkan petani adalah pola tanam tumpang gilir, pemanfaatan sisa tanaman

Hasil akhir yang diharapkan adalah tersusunnya bank desain yang berisi desain dan gambar kerja sebagai standar bagi UKM dan pelaku usaha rotan Sulawesi Tenggara dalam