Laporan Praktikum Arsitektur Sistem Komputer - Compiler Bahas C dan Bahasa Assembly Intel x86
October 2, 2017 | Author: Kevin Manatar Oloan Situmorang | Category: N/A
Short Description
Pada percobaan ini, akan dipahami proses kompilasi bahasa C menjadi bahasa mesin. Di antara proses tersebut akan dipaham...
Description
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
C
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
1
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
2
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
o
Semua komentar dalam file program diganti dengan spasi satu buah.
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
3
o
o
Semua \n (backslash-newline) yang menandakan baris baru akan dihapus tidak peduli dimanapun dia berada. Fitur ini memungkinkan kita untuk membagi baris program yang panjang ke dalam beberapa baris tanpa mengubah arti. 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 , 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
4
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 Programmer’s Perspective” yang ditulis oleh Bryant dan O’Hallaron.
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
5
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 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: 83 ec 10 $0x10,%esp 9: e8 00 00 00 e: c7 44 24 0c $0x0,0xc(%esp) 15: 00 16: c7 44 24 08 $0x0,0x8(%esp) 1d: 00 1e: eb 0c 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 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
e
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
6
code_O3.o: code_O1.o:
file format pe-i386
file format pe-i386 Disassembly of section .text.startup:
Disassembly of section .text: 00000000 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: e8 00 00 00 b: b8 00 00 00 $0x0,%eax 10: 40 11: 3d f4 01 00 $0x1f4,%eax 16: 75 f8 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
b
leave ret nop
%ebp
and call
b
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
b
00000000 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: e8 00 00 00 00 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
b
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 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: e8 00 00 00 00 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 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: e8 00 00 00 00 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 : 0: 55 1: 89 e5 %esp,%ebp 3: 83 e4 f0 $0xfffffff0,%esp 6: e8 00 00 00 00 b: b8 4e e7 01 00 $0x1e74e,%eax 10: c9 11: c3 12: 90 13: 90
push mov
%ebp
and call
b
mov leave ret nop nop
Kode 3.4.2 code_Os.s
Laporan Praktikum - Laboratorium Dasar Teknik Elektro – STEI ITB
7
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
8
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
9
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 O’Hallaron. Computer Systems : A Programmer’s 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 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 #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 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 #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 #include
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 #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 #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 #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
View more...
Comments