MODUL 1: KOMPILASI DAN DISASSAMBLE PROGRAM Praktikan: Agung Utama Putra (13210037) Asisten: Kevin Hendharta Waktu Percobaan: 25 Oktober 2012 EL3110 – Arsitektur Sistem Komputer Sekolah Teknik Elektro dan Informatika – ITB
Abstrak Praktikum kali ini akan diperlihatkan mengenai proses kompilasi suatu kode sumber dari berkas teks hingga menjadi file executable yang bisa dijalankan langsung. Prosesnya antara lain kode sumber di precompile, diubah menjadi file assembly, diubah menjadi file objek, di-link dengan kode objek lain, dan akhirnya menjadi file executable. Kata kunci: precompile, compile, disassemble 1. Data Praktikum 1.1 Percobaan I
Direktori untuk membuat code.c disimpan pada folder 037058, gabungan 3 digit terakhir NIM praktikan. 1.2 Percobaan II
Percobaan 2 sampai 5 menggunakan software gcc 4.6.2 di Windows 7. a)
Gambar 2: Hasil program
Perintah $ gcc –O2 –S code.c Menghasilkan kode assembly (terlampir), dan $ gcc –O2 -c code.c Menghasilkan file objek yang tidak bisa dibaca dengan text editor biasa. 1.3 Percobaan III
a) Hasil disassemble code.o Perintah yang digunakan $ objdump –d code.o Menghasilkan
Preprocess code.c
Hasil:
Gambar 3: Hasil decompile code.o
Gambar 1: Hasil percobaan 2, preprocess b)
Compile code.c
Di-compile setelah dibuat main.c (terlampir) untuk main programnya. Hasilnya sebagai berikut: Data masukan: 2 3 Output: 5 5 Data masukan: 3 4 Output: 7 7
b) Hasil disassemble prog Perintah yang digunakan $ objdump –d prog.exe Hasil disassembly sangat panjang. 1.4 Percobaan IV
Perbedaan tiap tingkat optimasi, dari segi ukuran: Ukuran -O1 -O2 -O3 -Os (bytes) code.o 518 518 518 534 code.s 234 249 249 377 prog 49.035 49.071 49.071 49.071 Tabel 1: Perbandingan ukuran
1.5 Percobaan V
Program di-compile dengan makefile, perintah yang digunakan: $ mingw32-make Hasil yang didapat adalah program code.exe. Hasil program:
Gambar 4: Hasil program coba.exe
Setelah diedit, hasilnya jadi:
Gambar 5: Hasil program coba.exe setelah diedit 1.6 Tugas
File fibo.c, inputn.c dan makefile yang dibuat terlampir. Percobaan dilakukan pada komputer dengan software gcc versi 4.4.3 di Ubuntu.
Gambar 6: Hasil program deret fibonacci
2. Analisis 2.1 Percobaan 1
Kode program code.c menjumlahkan 2 nilai x dan y, dan mentotal semua hasil fungsi sum() (bila dipanggil berkali-kali) ke variabel accum. 2.2 Percobaan 2 a) Preprocess code.c
Proprocess adalah persiapan yang dilakukan mesin untuk menandakan jenis berkas, bahasa yang digunakan, jenis commandnya, dan sebagainya. b)
Compile code.c
File code.s berisi barisan perintah dalam bahasa assembly. Bagian fungsi sum() berada pada bagian _sum. Yang dilakukannya adalah memindahkan isi stack 8 blok dari esp ke eax, menambahkan isi eax dengan isi stack 4 blok dari esp, dan menambahkan isi eax ke _accum. Nilai yang dikembalikan ada di register eax, sementara _accum
menyimpan akumulasi pemanggilan fungsi.
nilai
setiap
File code.o adalah file binary, yang isinya memang untuk dibaca mesin sehingga bila dibuka langsung dengan text editor, akan menghasilkan karakter-karakter bukan huruf. Saat meng-compile menjadi program, gcc akan mengambil isi dari main.c & code.c, dan melink keduanya saat melakukan kompilasi, sehingga fungsi yang ada di code.c bisa dipakai di main.c. Variabel accum harus dideklarasikan juga pada main.c bila ingin membaca isi variabel accum dari code.c. 2.3 Percobaan III
a) Disassemble code.o Proses disassemble code.o menghasilkan urutan perintah yang dilakukan section utamanya, section .text. b) Disassemble prog.exe Proses disassemble prog.exe menghasilkan urutan perintah didalamnya. Karena prog.exe sudah merupakan file executable yang isinya me-link file objek lain sebelumnya, ditambah dengan perintah yang terintegrasi dengan OS yang digunakan (dalam hal ini Windows 7), hasil disassembly juga menampilkan urutan perintah yang melakukan akses langsung ke memori. 2.4 Percobaan IV
Secara umum, semakin tinggi tingkatan optimasi akan membuat proses assembly semakin kompleks, lebih lambat saat dikompilasi, tetapi program yang dihasilkan akan berjalan lebih cepat. Dari hasil percobaan tidak terlalu jelas, tetapi tingkat optimasi yang berbeda bisa menghasilkan ukuran program yang berbeda. 2.5 Percobaan V
Perintah make (mingw32-make) menjalankan setiap proses kompilasi berdasarkan rule yang dibuat pada file makefile dalam working directory. Apabila pada direktori yang bersangkutan ada filefile objek yang tidak ditemukan, file-file tersebut akan dicompile terlebih dahulu. Apabila ditemukan, file objek tersebut dianggap sudah tercompile dan akan langsung digunakan untuk mencompile program utama.
2.6 Tugas
Program berjalan dengan benar. 3. Kesimpulan a) File code.c berhasil dibuat. b) Ada beberapa tahap proses kompilasi. c) Proses disassemble melihat nilai dari stiap blok yang dipakai dan juga urutan kerja suatu file/program, dan mengembalikannya ke dalam bentuk kode assembly. d) Semakin tinggi optimisasi semakin baik program yang dihasilkan, tetapi semakin sulit proses kompilasinya. e) Didalam makefile harus terdapat semua file baik .c dan .o yang dibutuhkan. f) Program Fibonacci yang dibuat berjalan sesuai tujuan dan dibuat dengan makefile. g) Daftar Pustaka Bryant, Randal E. dan David R. O’Hallaron. Computer Systems: A Programmer’s Perspective, 2nd Edition.Prentice Hall, 2011.
LAMPIRAN A. Kode code.c #define START_VAL 0 int accum = START_VAL; int sum(int x, int y) { int t = x + y; accum += t; return t; }
B. Kode main.c #include <stdio.h> int accum ; int main (){ int a,b; scanf("%d %d",&a,&b); printf("%d\n",sum(a,b)); printf("%d\n",accum); } C. Kode code.s .file "code.c" .text .p2align 2,,3 .globl _sum .def _sum; .scl 2; .type 32; .endef _sum: LFB0: .cfi_startproc movl 8(%esp), %eax ; ambil parameter pertama addl 4(%esp), %eax ; jumlahkan dengan parameter kedua addl %eax, _accum ; hasil penjumlahkan dikirim ke _accum ret .cfi_endproc LFE0: .globl _accum .bss .align 4 _accum: .space 4 ; _accum menggunakan 4 byte data D. Kode maintext.c #include "text.h" void main() { test(); }
E. Kode text.c (sebelum diedit) #include <stdio.h> #include "text.h" void test() { printf("Arsitektur Komputer I !\n"); } F. Kode text.c (setelah diedit) #include <stdio.h> #include "text.h" void test() { printf("TES_H = %d\n",TES_H); } F. Kode text.h #ifndef TES_H #define TES_H 100 void test(); #endif G. makefile all: coba coba: maintext.o text.o gcc maintext.o text.o -o coba maintext.o: maintext.c gcc -c maintext.c text.o: text.c gcc -c text.c G. Kode fibo.c #include <stdio.h> void fib(int x) { int a=0; int b=1; int t=1; while(x>0){ printf("%d ",t); t = a + b; a = b; b = t; x--; } printf("\n"); }
G. Kode inputn.c #include <stdio.h> void main(){ int el; scanf("%d",&el); fib(el); } G. makefile all: fibo fibo: fibo.o inputn.o gcc fibo.o inputn.o -o fibo fibo.o: fibo.c gcc -c fibo.c inputn.o: inputn.c gcc -c inputn.c