Anda di halaman 1dari 16

Percobaan I

COMPILER BAHASA C DAN BAHASA ASSEMBLY INTEL X86


Christine Sonya (14S15035)
Tanggal Percobaan : 28/09/2017
NWS3103 Praktikum Arsitektur Sistem Komputer
Laboratorium Sistem Digital Teknik Elektro
Institut Teknologi Del

Abstrak In this practical, student compiles C


language compilation and assembly language. C language II. LANDASAN TEORETIS
is the high-level language which is able to understand but Untuk membuat suatu program, bahasa tingkat tinggi
it is difficult to understand by machine. And assembly cenderung banyak digunakan karena bahasa tingkat tinggi ini
language is a program that contains from many mudah dimengerti oleh manusia seperti halnya bahasa C.
instruction which can change binary code with Sayangnya, bahasa tingkattinggi tidak dapat dimengerti oleh
mnemonic and easy to remember. So, student must be mesin (mikroprosesor) sehingga tidak dapat dieksekusi. Oleh
known the step how to compile the program until the karena itu, diperlukan sebuah penerjemah bahasa
program earns the step of compilation C language pemrograman tingkat tinggi menjadi bahasa tingkat rendah
program until it earns the low-level language which is able yang berisi urutan instruksi yang dimengerti oleh mesin.
to execute for machine. The application that used for the Urutan instruksi tersebut kemudian dikemas dalam suatu
compilation of this compiler is GCC,makefile, and batch0. bentuk executable object program yang disimpan dalam
The purpose of the practical is student able to compile c bentuk file biner.
program using the GCC compiler > Student also can Kumpulan instruksi yang dimengerti oleh mesin
understand how to use stack memory in every Procedure disebut instruction set. Dari sisi instruction set, terdapat dua
Call. penggolongan mesin (mikroprosesor) yaitu complex
instruction set computer (CISC), contohnya mikroprosesor
Keyword : Compiler, GCC, C,stack memory, assembly Intel, dan reduced instruction set computer (RISC),
contohnya MIPS32. Beberapa mikroprosesor Intel
bahkan memiliki tambahan set instruksi seperti MMX,
I. PENDAHULUAN SSE, dan sebagainya.
Adapun Tujuan praktikum adalah sebagai berikut: Proses menerjemahkan baris kode program dalam bahasa C
1. Praktikan memahami tahap-tahap kompilasi program dalam menjadi file executable dilakukan dalam mempat langkah
bahasa C sebagai bahasa tingkat tinggi hingga diperoleh yaitu preprocessor, compiler, assembler, dan linker yang
bahasa tingkat rendah yang dapat dieksekusi oleh mesin. seluruhnya disebut sistem kompilasi.
2. Praktikan mampu melakukan kompilasi program 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. Preprocessor Semua perintah preprocessor yang ditulis
4. Praktikan memahami penggunaan stack memory pada dalam bahasa tingkat tinggi akan diproses terlebih dahulu oleh
setiap procedure call preprocessor sebelum compiler melaksanakan tugasnya.
Perangkat Praktikum yang dipakai adalah sebagai berikut Beberapa tugas dari preprocessor ini adalah sebagai berikut.
1. Komputer Desktop / Laptop dengan sistem operasi o Semua komentar dalam file program diganti dengan spasi
Microsoft Windows 7/8/8.1 satu buah.
2. Compiler GCC dalam paket program CodeBlocks untuk o Semua \n (backslash-newline) yang menandakan baris baru
melakukan kompilasi program akan dihapus tidak peduli dimanapun dia berada. Fitur ini
Notepad++ sebagai teks editor dan HexEdit sebagai memungkinkan kita untuk membagi baris program yang
heksadesimal editor panjang ke dalam beberapa baris tanpa mengubah arti.
o Macro yang telah didefinisikan diganti dengan definisinya.
Contohnya, pada perintah #define MAX_ROWS 10,
preprocessor akan mengganti semua kata
MAX_ROWS dengan 10. Pada perintah #include <stdio.h>,
preprocessor akan mengganti baris tersebut dengan isi file disassembly file biner (.o atau .exe) menjadi file assembly (.s)
stdio.h. bernama Object Dump. Untuk melakukan disassembly, kita
Compiler dapat menggunakan perintah berikut.
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). Hasil dari proses disassembly ditampilkan pada jendela
Command Prompt. Agar hasil dari proses disassembly dapat
Assembler
disimpan ke dalam suatu file, kita dapat menggunakan
Assembler akan menerjemahkan bahasa assembly menjadi file
perintah berikut.
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
dependency dari program yang dibuat, contohnya library
untuk menjalankan fungsi printf. Hasil dari linker berupa file Dengan demikian, hasil proses disassembly akan disimpan
biner executable (dalam platform Microsoft Windows, file dalam file Program.s
ini memiliki akhiran .exe). Untuk melakukan proses kompilasi
menggunakan GCC, kita dapat menggunakan Command B. Subbab Landasan Teoretis II
Prompt pada Microsoft Windows. Perhatikan bahwa GCC GCC mendukung beberapa tingkat optimisasi program yang
harus terpasang dan terkonfigurasi dengan benar (lihat pada dapat dilakukan saat proses kompilasi dilakukan. Terdapat
lembar lampiran petunjuk instalasi dan konfigurasi GCC). beberapa tingkat optimisasi program yang dapat dipilih
Beberapa perintah untuk melakukan kompilasi antara lain dengan menambahkan flag optimisasi saat melakukan
sebagai berikut. kompilasi program. Umumnya optimisasi program merupakan
Hanya melakukan proses preprocessing trade-off antara execution speed, program size, compilation
time, dan kemudahan dalam melakukan debugging.

Eksekusi perintah tersebut akan menampilkan di layar


Command Prompt kode Program.c setelah melalui proses Flag O2 tersebut menandakan bahwa proses kompilasi
preprocessing. Agar memperoleh output berupa file, dapat dilakukan dengan optimisasi tingkat dua. Beberapa flag
menggunakan tambahan perintah sebagai berikut. optimisasi yang dikenali oleh GCC adalah O0, O1, O2,
O3, Os, dan Ofast. Perbedaan masing-masing level
optimisasi diberikan sebagai berikut.
Eksekusi perintah tersebut akan menghasilkan file Program.i
berisi kode Program.c yang telah melalui preprocessing pada . Makefile dan Batch File
folder yang sama dengan file Program.c. File ini dapat dibuka Untuk suatu project yang terdiri atas beberapa file kode,
dengan teks editor contohnya Notepad++. tentu akan sangat merepotkan untuk melakukan kompilasi
dengan menggunakan perintah kompilasi yang ditulis pada
Hanya melakukan proses preprocessing dan compiling 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
Eksekusi perintah tersebut akan menghasilkan file Program.o nama makefile lalu GCC akan melakukan proses kompilasi
yang merupakan file biner. File ini dapat dibuka dengan untuk semua file tersebut untuk kemudian menggabungkannya
program hex editor contohnya HexEdit.
pada file executable. Makefile dapat bersifat sederhana hingga
Melakukan seluruh proses kompilasi (preprocessing, kompleks, bergantung pada sejauh mana kita menggunakan
compiling, assembly, dan linking)
makefile untuk mengorganisasikan project kita. Contoh isi dari
makefile adalah sebagai berikut.

Eksekusi perintah tersebut akan menghasilkan Program.exe


yang dapat langsung dieksekusi (dijalankan). Kita juga dapat
melakukan kompilasi dua file bahasa C sekaligus.

GCC dapat diperintahkan untuk melakukan kompilasi


makefile dengan perintah sebagai berikut.
A. Subbab Landasan Teoretis 1
Selain dapat melakukan kompilasi, paket compiler GCC juga
menyertakan sebuah disassembler yang mampu melakukan Perintah tersebut akan melakukan kompilasi terhadap
makefile yang diberikan menjadi sebuah program bernama EBP adalah register 32-bit yang digunakan sebagai base
contoh.exe. Program ini dihasilkan oleh hasil linker terhadap pointer. Dengan demikian, EBP akan berisi alamat dari current
dua file objek bernama main.o dan text.o (tentunya termasuk activation frame pada stack.
dengan library yang lain yang dibutuhkan). Untuk memperoleh EIP adalah register 32-bit yang digunakan sebagai instruction
main.o, GCC harus melakukan kompilasi source code main.c pointer. Dengan demikian, EIP akan berisi alamat dari instruksi
menjadi file objek. Begitupula untuk memperoleh text.o, GCC selanjutnya yang akan dieksekusi. Instruksi-instruksi yang
harus melakukan kompilasi source code text.c. Pada platform digunakan pada Intel x86 tidak akan dijelaskan di dalam
Microsoft Windows, terdapat sebuah file shell script modul praktikum ini. Praktikan dapat mempelajari lebih jauh
bernama Windows Batch File. Kita dapat menuliskan mengenai instruksi-instruksi ini pada bab 3 di buku Computer
perintah-perintah yang biasa kita tuliskan secara terpisah pada System A Programmers Perspective yang ditulis oleh
command prompt dalam suatu file yang disimpan dengan Bryant dan OHallaron.
ekstensi .bat. Untuk mengeksekusi perintah-perintah tersebut,
kita cukup menjalankan file .bat tersebut sehingga command Stack dan Procedure Call
prompt terbuka dan perintahperintah yang kita tuliskan Stack pada umumnya disusun atas beberapa
dieksekusi secara otomatis. Contoh Windows Batch File activation frame. Setiap frame memiliki sebuah base
adalah sebagai berikut. pointer yang menunjukkan alamat tertinggi (highest
address) pada frame tersebut. Karena stack tumbuh dari high
address menuju low address, base pointer akanmenunjukkan
alamat tertinggi frame tersebut. Ketika suatu program (caller)
memanggil sebuah prosedur (callee), caller akan memasukkan
argumenargumen untuk memanggil callee dari argumen
terakhir hingga argumen paling awal secara berurutan ke dalam
Windows Batch File tersebut berisi perintah sebagai stack. Selanjutnya, caller akan memasukkan return address ke
berikut. Perintah %~d0 memerintahkan dalam stack. Kemudian, callee memasukkan alamat old base
command prompt untuk berpindah drive letter ke drive letter pointer milik caller ke dalam stack dan memperbarui nilai
yang sesuai dengan lokasi Windows Batch File berada. base pointer yang sesuai dengan frame callee (nilai base
Selanjutnya, perintah cd "%~dp0" memerintahkan command pointer yang baru sama dengan nilai stack pointer setelah old
prompt untuk berpindah folderke lokasi Windows Batch File base pointer disimpan ke dalam stack). Kemudian callee
berada. Selanjutnya, command prompt mengeksekusi perintah melakukan alokasi terhadap variable
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 lokal dan melakukan komputasi sesuai dengan fungsi callee
berikut. tersebut. Ketika callee selesai dieksekusi, callee akan
EAX, EBX, ECX, dan EDX adalah register 32-bit yang menyimpan return value pada register EAX. Kemudian,
bersifatgeneralstorage. callee akan membersihkan framenya sendiri dengan mengganti
ESI dan EDI adalah register 32-bit yang digunakan sebagai alamat base pointer dengan old base pointer yang telah
indexing register. Register ini juga dapat digunakan sebagai disimpan pada stack. Kemudian, return address digunakan
general storage. untuk melanjutkan eksekusi instruksi pada caller.
ESP adalah register 32-bit yang digunakan sebagai stack
pointer. Dengan demikian, ESP akan berisi nilai alamat Hasil dan Analisis
(address) elemen puncak (top element) dari stack. Perlu diingat
bahwa stack membesar dari alamat tinggi (high address) ke Tugas 1 : Proses Kompilasi Bahasa C Menggunakan GCC
arah alamat rendah (low address). Dengan demikian,
memasukkan elemen baru ke dalam stack akan mengurangi
nilai alamat yang tersimpan pada
ESP sedangkan mengeluarkan elemen dari dalam stack akan
menambah ESP.
1. Buatlah program dengan kode sebagai berikut
menggunakan teks editor Notepad++. Sesuaikan identitas
pada header

2. Simpan kode program tersebut dengan nama code.c.


3. Preprocess kode program tersebut menjadi code.i lalu lihat
hasilnya dengan teks editor Notepad++. Pastikan direktori
kerja command prompt berada di direktori tugas 1.

4. Compile kode program tersebut menjadi code.s lalu lihat


hasilnya dengan teks editor Notepad++. Pastikan direktori
kerja command prompt berada di direktori tugas 1.

5. Assemble kode program tersebut menjadi code.o lalu lihat


hasilnya dengan heksadesimal editor HexEdit. Pastikan
direktori kerja command prompt berada di direktori tugas 1.

6. Lakukan semua proses kompilasi terhadap kode program


tersebut menjadi file executable
code.exe lalu lihat hasilnya dengan heksadesimal editor
HexEdit. Pastikan direktori kerja
command prompt berada di direktori tugas 1.

7. Buka file code.o dan code.exe dengan teks editor


Notepad++. Bagaimana hasilnya?

Hasil dari code.i

Hasil dari code.o


3.Simpan kode program tersebut dengan nama batch.bat pada
folder yang sama dengan file
code.c
.4. Klik dua kali pada file batch.bat sehingga muncul jendela
command prompt.
5. Lihat semua file yang dihasilkan pada folder yang sama
dengan file code.c.

Hasilnya:
batch.bat

Code.c

Hasil dari code.s

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 Proses kompilasi diawali dengan
preprocessing yang berperan untuk mengubah file code.c.
Proses kompilasi kedua yaitu compiling . Pada proses ini
dilakukan penerjemahan code.i (Bahasa C) menjadi code.s
Bahasa Assembly. Proses selanjutnya yaitu Assembler. Proses
ini berperan untuk menerjemahkan code.s (Bahasa assembly)
menjadi code.o (file objek).

Tugas 2 : Proses Kompilasi Bahasa C Menggunakan GCC


dengan Bantuan Batch File
1. Salin (copy) file code.c dari folder tugas 1 ke dalam folder
tugas 2.
2. Buatlah batch file dengan kode sebagai berikut
menggunakan teks editor Notepad++.

Code.exe
Code.i

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.

Tugas 3 : Disassembly File Objek


1. Salin (copy) file code.c dari folder tugas 1 ke dalam folder
tugas 2.
2. Buatlah batch file dengan kode sebagai berikut
menggunakan teks editor Notepad++.

3.Gunakan objdump untuk melakukan disassembly file


code.exe.

4.Buka file disassembly_code_o.asm dan


disassembly_code_exe.asm dengan teks editor Notepad++ dan
bandingkan kedua file tersebut.
Code.o
Hasilnya:
File disassembly_code_o.asm

Code.s
File disassembly_code_exe.asm 5.Buka file code_O0.c, code_O1.c, code_O2.c, code_O3.c,
code_Os.c, dan code_Ofast.c dengan teks editor lalu
bandingkan kelimanya.
Hasilnya:
Code_00

Pada file disassembly_code.o.asm,file berupa notepad


kosong, sedangkan disassembly_code_exe.asm file memiliki
isi berupa kodingan. 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 Kemudian dilakukan pula Code_O1.c
disassembly file code.exe dan diperoleh file
disassembly_code_exe.asm

Tugas 4 : Optimisasi Kompilasi Program pada GCC


1. Salin (copy) file code.c dari folder tugas 2 ke dalam folder
tugas 4.
2. Ubah nama file code.c tersebut menjadi code_O0.c
3.Salin file code_O0.c menjadi empat file baru dengan isi
yang sama masing-masing memiliki nama code_O1.c,
code_O2.c, code_O3.c, code_Os.c, dan code_Ofast.c
4. Buatlah file batch.bat untuk melakukan kompilasi kelima
file kode tersebut dengan pilihan optimisasi yang berbeda lalu
secara otomatis melakukan proses disassembly kelima file
objek yang dihasilkan.

Code_O2.c
Code_O3.c

Code.Ofast.c

Code_Os.c

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 assemblynya.
Pada code.00 berisikan header yang sama dengan code yang
pertama . code.O1,code.O2,code.O3,code.Os,code.Ofast
memiliki isi code yang sama . di dalam code tersebut berisi
gcc yang menyebutkan setiap file dan objdump yang
menyebutkan setiap file.

Tugas 5 : Kompilasi Beberapa File Kode dengan GCC


1. Buatlah file bernama main_text.c menggunakan teks merupakan cara lain melakukan kompilasi
editor Notepad++ dengan isi sebagai berikut. yang praktis selain menggunakan batch file
Sesuaikan identitas pada header.
Tugas 6 : Penggunaan Makefile pada GCC
1.Salin (copy) file main_text.c, text.c, dan text.h dari
folder tugas 5 ke folder tugas 6.
2. Buatlah makefile menggunakan teks editor
Notepad++ dengan isi sebagai berikut. Harap berhati-
hati dengan spasi karena dapat menyebabkan
kompilasi mengalami kegagalan.

2. Buatlah file bernama text.c menggunakan teks editor


Notepad++ dengan isi sebagai berikut. Sesuaikan
identitas pada header.
3. Simpan makefile tersebut dengan nama makefile
(tanpa ekstensi / akhiran).
4. Gunakan command prompt untuk melakukan
kompilasi dengan sintaks berikut. Pastikan direktori
kerja command prompt berada di direktori tugas 6.

5.Bandingkan hasil tugas 5 dengan tugas 6 dengan


melakukan eksekusi main_text.exe dan
membandingkan hasil eksekusinya

MakeFile
3. Buatlah file bernama text.h menggunakan teks editor
Notepad++ dengan isi sebagai berikut. Sesuaikan
identitas pada header.
.

Tugas 7 : Header File


4. Lakukan kompilasi file tersebut dengan command
1.Pada tugas ini, Anda akan belajar untuk membuat
prompt untuk menghasilkan main_text.exe. Pastikan
dan memanfaatkan header file dan memahami
direktori kerja command prompt berada di direktori
bagaimana extern pada header file bekerja. Anda
tugas 5.
dapat menggunakan makefile atau batch file untuk
melakukan kompilasi tugas ini. Namun, Anda
disarankan untuk menggunakan makefile agar Anda
5. Jalankan program main_text.exe untuk melihat dapat berlatih dalam membuat makefile.
hasilnya. 2.Buatlah program dengan kode sebagai berikut
menggunakan teks editor Notepad++
Pada tugas 6 dengan menggunakan make_file.c dan
text.c seperti pada tugas 5, dilakukan kompilasi
kedua file tersebut dengan memanfaatkan metode
makefile. Setelah dilakukan eksekusi dengan
command prompt, diperoleh hasil kompilasi yang
identic sama seperti hasil kompilasi pada tugas 5.
Sehingga dapat disimpulkan bahwa makefile
3. Simpan kode program tersebut dengan nama add.c address di jendela Memory. Pilih Byte 128 atau yang
4. Buatlah sebuah program sederhana main dalam file lebih tinggi. Perhatikan pula jendela Call stack.
main.c yang meminta pengguna memasukkan dua buah 12. Catat nilai memory di antara address yang
bilangan lalu menjumlahkan kedua bilangan tersebut ditunjukkan oleh EBP dan ESP. Bisakah Anda
dengan memanggil fungsi sum pada add.c. 5. Buatlah merekonstruksi bentuk stack pada kondisi tersebut?
header file add.h yang akan di-include pada main.c. 13. Klik jendela source code, lalu tekan tombol F7
Gunakan extern agar variabel global accum pada add.c pada keyboard untuk melanjutkan eksekusi program
dapat dikenali dan diakses oleh main pada main.c. hingga berhenti pada kode int temp1 = square(y);.
6. Lakukan kompilasi file add.c dan main.c sehingga Perhatikan jendela Call stack. Perhatikan pula jendela
dihasilkan program main.exe. Memory. Isikan nilai register ESP pada address di
jendela Memory. Pilih Byte 128 atau yang lebih
tinggi.
Hasilnya: 14. Catat nilai memory di antara address yang
ditunjukkan oleh EBP dan ESP. Bisakah Anda
merekonstruksi bentuk stack pada kondisi tersebut?
15. Lanjutan eksekusi program dengan menekan
tombol F7 pada keyboard hingga berhenti pada kode
return x*x;. Perhatikan jendela Call stack.
Perhatikan pula jendela Memory. Isikan nilai
Program main.c berfungsi untuk memanggil fungi register ESP pada address di jendela Memory. Pilih
yang telah didefinisikan pada add.c . Untuk itu Byte 128 atau yang lebih tinggi.
dibutuhkan sebuah header file yang akan di- 16. Catat nilai memory di antara address yang
include pada main.c sehingga dapat memanggil fungsi ditunjukkan oleh EBP dan ESP. Bisakah Anda
pada add.c merekonstruksi bentuk stack pada kondisi tersebut?
17. Lanjutkan eksekusi program tersebut dengan
menekan tombol F7 pada keyboard hingga berhenti
Tugas 8 : Pemanggilan Prosedur dan Stack Memory
1. Buka program CodeBlocks 13.12 untuk membuat pada kode int temp2 = square(z);. Perhatikan jendela
project baru. Pilih Console Application lalu klik Go Call stack. Perhatikan pula jendela Memory. Isikan
sehingga wizard Console Application terbuka. nilai register ESP pada address di jendela Memory.
2. Klik next lalu pilih bahasa pemrograman dengan Pilih Byte 128 atau yang lebih tinggi.
bahasa C lalu klik next. 18. Catat nilai memory di antara address yang
3. Isi dengan Project Title, folder project, dan nama ditunjukkan oleh EBP dan ESP. Bisakah Anda
project lalu klik next. merekonstruksi bentuk stack pada kondisi tersebut?
4. Buka file main.c yang telah dihasilkan secara 19. Lanjutan eksekusi program dengan menekan
otomatis pada bagian workspace. tombol F7 pada keyboard hingga berhenti pada kode
5. Hapus semua kode pada file main.c lalu salin semua return x*x;. Perhatikan jendela Call stack.
kode pada tugas pendahuluan (file Perhatikan pula jendela Memory. Isikan nilai
sumofsquare.c). Simpan file main.c dengan perintah register ESP pada address di jendela Memory. Pilih
save. Byte 128 atau yang lebih tinggi.
6. Pilih menu Settings lalu klik Compiler. Beri check 20. Catat nilai memory di antara address yang
pada pilihan Produce debugging symbols [-gse lalu klik ditunjukkan oleh EBP dan ESP. Bisakah Anda
OK. merekonstruksi bentuk stack pada kondisi tersebut?
7. Klik kanan pada baris program lalu pilih Add 21. Lanjutkan eksekusi program tersebut dengan
Breakpoint. Beri semua breakpoint pada setiap baris menekan tombol F7 pada keyboard hingga berhenti
program. pada kode return temp1+temp2;. Perhatikan
8. Pilih menu Debug lalu klik Start / C jendela Call stack. Perhatikan pula jendela Memory.
9. Pilih menu Debug lalu pilih Debugging windows. Isikan nilai register ESP pada address di jendela
Buka CPU Registers, Call stack, Disassembly, Memory Memory. Pilih Byte 128 atau yang lebih tinggi.
dump, dan Watches. Susun semua jendela yang terbuka 22. Catat nilai memory di antara address yang
sedemikan rupa agar tidak menghalangi source code ditunjukkan oleh EBP dan ESP. Bisakah Anda
program utama. merekonstruksi bentuk stack pada kondisi tersebut?
10. Klik pada jedela source code lalu tekan tombol F7 23. Lanjutkan eksekusi program tersebut dengan
pada keyboard. Amati perubahan pada semua menekan tombol F7 pada keyboard hingga program
Debugging windows. Perhatikan juga tanda panah selesai dieksekusi. Perhatikan jendela Call stack.
kuning pada baris kode. Tanda panah kuning ini Perhatikan pula jendela Memory.ontinue.Isikan nilai
merupakan posisi eksekusi program oleh processor. register ESP pada address di jendela Memory. Pilih
11. Saat anak panah kuning berada pada kode return Byte 128 atau yang lebih tinggi.
squaresum(a,b);, lihat isi register ESP dan EBP pada 24. Catat nilai memory di antara address yang
CPU Registers. Isikan nilai register ESP pada ditunjukkan oleh EBP dan ESP. Bisakah Anda
merekonstruksi bentuk stack pada kondisi tersebut?
25. Bandingkan isi stack untuk nilai memory pada (Langkah 6)
setiap state yang Anda catat.

(Langkah 7)

(Langkah 1)

(Langkah 8)

(Langkah 9)
(Langkah 2)

(Langkah 10)
Pada tugas 8 ini dilakukan percobaan untuk lebih
memahami pemanggilan prosedur dan stack pada memory.
Pada proses pemanggilan prosedur, memory dapat
(Langkah 3)
dimodelkan sebagai stack.
Tugas 9 : Program Fibonacci
Buatlah program penghitung deret fibonacci yang sederhana
yaitu program yang akan menampilkan deret fibonacci dengan
banyak angka (n) yang sesuai dengan masukkan pengguna.
Contohnya, bila pengguna menginginkan banyak angka
sebesar n=7, maka deret fibonacci memiliki bentuk seperti
berikut
.
1, 1, 2, 3, 5, 8, 13 Program ini terdiri atas tiga buah file kode.
File inputn.c berisi kode-kode yang menangani proses
meminta pengguna untuk memasukkan nilai n hingga
menerima dan menyimpan nilai n yang dimasukkan oleh
pengguna. Perhatikan bahwa nilai n memiliki batas minimum
sebesar n=2 sehingga diperlukan validasi input. File fibo.c
berisi kode-kode yang menangani proses kalkulasi deret
fibonnaci sesuai jumlah angka yang akan ditampilkan dan
menampilkannya pada layar. File fibo_main.c yang berisi
program utama yang memanggil prosedur-prosedur inputn.c Setiap source code memiliki fungsi yang berbeda beda, tetap
dan fibo.c. memiliki output yang sama. Itu dikarenakan beberapa fungsi
1. Implementasi prosedur-prosedur yang dibutuhkan pada memang digunakan agar tidak terjadi pemanggilan fungsi
inputn.c dan fibo_main.c. Jangan lupa membuat file header yang lain secara berulang ulang. Pemakaian batch file adalah
untuk masing-masing file kode tersebut. salah satu contoh fungsi yang tidak harus dipanggil secara
2. Buatlah program utama pada file fibo_main.c. berulang ulang.dan mengubah code ke program yang
3. Buatlah makefile untuk melakukan kompilasi seluruh file executable.Make File juga berfungsi untuk program yang
kode program. memiliki file kompilasi yang banyak agar tidak harus
4. Jalankan program yang telah dikompilasi lalu periksalah memasukkan input yang banyak. Header adalah
fungsionalitasnya file program yang berguna untuk mendeklarasikan fungsi
Analisis: yang akan dilakukan pengeksekusian.
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 Refrensi
dengan membuat dua buah header file yaitu fibo.h dan NWS3102_Modul_ASK_2016_Final
inputn.h .Langkah langkah menerjemahkan baris-baris kode Id.scribd.com
program pada c menjadi file eksekusi dilakukan dalam 4 Template_Laporan_Praktikum
langkah meliputi preprocessor,compiler,assembler,dan linker https://el3111.bagus.my.id/wp-content
yang seluruhnya disebut kompilasi.

Simpulan
LAMPIRAN: int indeks;
Source code tugas 1 int accumulator;
indeks = 0;
Code.c accumulator = 0;
// Praktikum NWS3103 Arsitektur Sistem Komputer while(indeks<N_LOOP)
// Modul : 1 {
// Percobaan : 1
// Tanggal : 28 September 2017 accumulator = accumulator + indeks;
// Kelompok : 04 indeks = indeks + 1;
// Rombongan : 1 }
// Nama (NIM) 1 : Daniel Simarmata (14S15047) return accumulator;
// Nama (NIM) 2 : Christine sonya (14S15035) }
// Nama (NIM) 3 : Putra Oloan (14S15011)
// Nama File : code.c
// Deskripsi : Demonstrasi proses kompilasi C
// Menjumlahkan deret bilangan sebanyak N_LOOP
#define N_LOOP 500 Tugas 3
int main(void)
{ disassembly_code_o.asm
int indeks; (berupa file kosong)
int accumulator;
indeks = 0; disassembly_code_exe.asm
accumulator = 0;
while(indeks<N_LOOP)
{ code.o: file format pe-i386

accumulator = accumulator + indeks; Disassembly of section .text:


indeks = indeks + 1;
} 00000000 <_main>:
return accumulator; 0: 55 push %ebp
} 1: 89 e5 mov %esp,%ebp
3: 83 ec 18 sub $0x18,%esp
Source tugas 2 6: 83 e4 f0 and $0xfffffff0,%esp
Batch file 9: b8 00 00 00 00 mov $0x0,%eax
e: 89 45 f4 mov %eax,0xfffffff4(%ebp)
%~d0 11:8b 45 f4 mov 0xfffffff4(%ebp),%eax
cd " %~dp0" 14:e8 00 00 00 00 call 19 <_main+0x19>
gcc -E code.c > code.i 19:e8 00 00 00 00 call 1e <_main+0x1e>
gcc -S code.c 1e:c7 45 fc 00 00 00 00 movl $0x0,0xfffffffc(%ebp)
gcc -c code.c 25:c7 45 f8 00 00 00 00 movl $0x0,0xfffffff8(%ebp)
gcc -o code.exe code.c 2c: 81 7d fc f3 01 00 00 cmpl $0x1f3,0xfffffffc(%ebp)
code.exe 33:7e 02 jle 37 <_main+0x37>
pause 35:eb 0f jmp 46 <_main+0x46>
37:8b 45 fc mov 0xfffffffc(%ebp),%eax
code.c 3a:8d 55 f8 lea 0xfffffff8(%ebp),%edx
// Praktikum NWS3103 Arsitektur Sistem Komputer 3d:01 02 add %eax,(%edx)
// Modul : 1 3f: 8d 45 fc lea 0xfffffffc(%ebp),%eax
// Percobaan : 1 42:ff 00 incl (%eax)
// Tanggal : 28 September 2017 44:eb e6 jmp 2c <_main+0x2c>
// Kelompok : 04 46:8b 45 f8 mov 0xfffffff8(%ebp),%eax
// Rombongan : 1 49:c9 leave
// Nama (NIM) 1 : Daniel Simarmata (14S15047) 4a:c3 ret
// Nama (NIM) 2 : Christine sonya (14S15035) 4b:90 nop
// Nama (NIM) 3 : Putra Oloan (14S15011) 4c: 90 nop
// Nama File : code.c 4d:90 nop
// Deskripsi : Demonstrasi proses kompilasi C 4e:90 nop
// Menjumlahkan deret bilangan sebanyak N_LOOP 4f: 90 nop
#define N_LOOP 500
int main(void)
{
Tugas 4 gcc -Ofast -c code_Ofast.c
Code_O1 objdump -d code_O0.o > code_O0.s
objdump -d code_O1.o > code_O1.s
%~d0 objdump -d code_O2.o > code_O2.s
cd " %~dp0" objdump -d code_O3.o > code_O3.s
gcc -O0 -c code_O0.c objdump -d code_Os.o > code_Os.s
gcc -O1 -c code_O1.c objdump -d code_Ofast.o > code_Ofast.s
gcc -O2 -c code_O2.c pause
gcc -O3 -c code_O3.c
gcc -Os -c code_Os.c Code_OO
gcc -Ofast -c code_Ofast.c // Praktikum NWS3103 Arsitektur Sistem Komputer
objdump -d code_O0.o > code_O0.s // Modul : 1
objdump -d code_O1.o > code_O1.s // Percobaan : 1
objdump -d code_O2.o > code_O2.s // Tanggal : 28 September 2017
objdump -d code_O3.o > code_O3.s // Kelompok : 04
objdump -d code_Os.o > code_Os.s // Rombongan : 1
objdump -d code_Ofast.o > code_Ofast.s // Nama (NIM) 1 : Daniel Simarmata (14S15047)
pause // Nama (NIM) 2 : Christine sonya (14S15035)
// Nama (NIM) 3 : Putra Oloan (14S15011)
Code_O2 // Nama File : code.c
%~d0 // Deskripsi : Demonstrasi proses kompilasi C
cd " %~dp0" // Menjumlahkan deret bilangan sebanyak N_LOOP
gcc -O0 -c code_O0.c #define N_LOOP 500
gcc -O1 -c code_O1.c int main(void)
gcc -O2 -c code_O2.c {
gcc -O3 -c code_O3.c int indeks;
gcc -Os -c code_Os.c int accumulator;
gcc -Ofast -c code_Ofast.c indeks = 0;
objdump -d code_O0.o > code_O0.s accumulator = 0;
objdump -d code_O1.o > code_O1.s while(indeks<N_LOOP)
objdump -d code_O2.o > code_O2.s {
objdump -d code_O3.o > code_O3.s
objdump -d code_Os.o > code_Os.s accumulator = accumulator + indeks;
objdump -d code_Ofast.o > code_Ofast.s indeks = indeks + 1;
pause }
return accumulator;
Code_O3 %~d0 }
cd " %~dp0"
gcc -O0 -c code_O0.c Code_Ofast
gcc -O1 -c code_O1.c %~d0
gcc -O2 -c code_O2.c cd " %~dp0"
gcc -O3 -c code_O3.c gcc -O0 -c code_O0.c
gcc -Os -c code_Os.c gcc -O1 -c code_O1.c
gcc -Ofast -c code_Ofast.c gcc -O2 -c code_O2.c
objdump -d code_O0.o > code_O0.s gcc -O3 -c code_O3.c
objdump -d code_O1.o > code_O1.s gcc -Os -c code_Os.c
objdump -d code_O2.o > code_O2.s gcc -Ofast -c code_Ofast.c
objdump -d code_O3.o > code_O3.s objdump -d code_O0.o > code_O0.s
objdump -d code_Os.o > code_Os.s objdump -d code_O1.o > code_O1.s
objdump -d code_Ofast.o > code_Ofast.s objdump -d code_O2.o > code_O2.s
pause
objdump -d code_O3.o > code_O3.s
objdump -d code_Os.o > code_Os.s
Code_Os objdump -d code_Ofast.o > code_Ofast.s
%~d0 pause
cd " %~dp0"
gcc -O0 -c code_O0.c Tugas 5
gcc -O1 -c code_O1.c main.text.c
gcc -O2 -c code_O2.c
gcc -O3 -c code_O3.c // Praktikum NWS3103 Arsitektur Sistem Komputer
gcc -Os -c code_Os.c // Modul : 1
// Percobaan : 1 // Nama (NIM) 1 : Daniel Simarmata (14S15047)
// Tanggal : 28 September 2017 // Nama (NIM) 2 : Christine sonya (14S15035)
// Kelompok : 04 // Nama (NIM) 3 : Putra Oloan (14S15011)
// Rombongan : 1 // Nama File :add.c
// Nama (NIM) 1 : Daniel Simarmata (14S15047) // Deskripsi : Demonstras header file,
// Nama (NIM) 2 : Christine sonya (14S15035) // Menjumlahkan dua bilangan
// Nama (NIM) 3 : Putra Oloan (14S15011)
// Nama File : main_text.c #define START_VAL 0
// Deskripsi : Demonstrasi MakeFile
// Memanggil prosedur test pada text.c int accum = START_VAL;
#include "text.h" int sum(int x, int y)
void main(void) {
{ int t = x + y;
test(); accum += t;
} return t;
}
Text.c
// Praktikum NWS3103 Arsitektur Sistem Komputer Tugas 8
// Modul : 1
// Percobaan : 1 Squaresum.c
// Tanggal : 28 September 2017 // Praktikum NWS3103 Arsitektur Sistem Komputer
// Kelompok : 04 // Modul : 1
// Rombongan : 1 // Percobaan : 1
// Nama (NIM) 1 : Daniel Simarmata (14S15047) // Tanggal : 28 September 2017
// Nama (NIM) 2 : Christine sonya (14S15035) // Kelompok : 04
// Nama (NIM) 3 : Putra Oloan (14S15011) // Rombongan : 1
// Nama File :text.c // Nama (NIM) 1 : Daniel Simarmata (14S15047)
// Deskripsi : Demonstrasi MakeFile, Mencetak string ke // Nama (NIM) 2 : Christine sonya (14S15035)
layar // Nama (NIM) 3 : Putra Oloan (14S15011)
#include <stdio.h> // Nama File : sumofsquare.c
#include "text.h" // Deskripsi : Demonstrasi proses call dan stack
void test(void) // Menghitung jumlah dari kuadrat bilangan
{
printf("Arsitektur Sistem Komputer sangat int square (int x)
menyenangkan!\n"); {
}
return x*x;
Tugas 6 }

Make File int squaresum (int y, int x)


all: main_text.exe {
int temp1 = square(y);
main_text.exe: main_text.o text.o int temp2 = square(x);
gcc main_text.o text.o -o main_text.exe return temp1+temp2;
}
main_text.o: main_text.c
gcc - c main_text.c int main (void)
{
text.o: text.c int a = 5;
gcc -c text.c int b = 9;
return squaresum(a,b);
Tugas 7 }

Add.c
// Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul : 1
// Percobaan : 1
// Tanggal : 28 September 2017
// Kelompok : 04
// Rombongan : 1
Tugas 9

Fibo.c
#include <stdio.h>
int fibo (int n) {
int i;
int a = 1;
int b = 1;
int c;
printf("Deret fibonacchi\n");
printf("1, 1, ");
for (i=1;i<=n-2;i++) {
c = a+b;
printf("%d, ",c);
a = b;
b = c;
}
return 0;
}

Fibo_main.c
#include <stdio.h>
#include "inputn.h"
#include "fibo.h"
int main(void) {
int a;
a = input();
fibo(a);
return 0 ;
}

Input.c
// Praktikum NWS3103 Arsitektur Sistem Komputer
// Modul :1
// Percobaan :1
// Tanggal : 28 September 2017
// Kelompok :3
// Rombongan :1
// Nama (NIM) 1 : Daniel Simarmata (14S15047)
// Nama (NIM) 2 : Christine Sonya (14S15035)
// Nama (NIM) 3 : Putra Oloan Hutagaol (14S15011)
// Nama File : inputn.c
// Deskripsi : Penggunaan Makefile pada GCC
#include <stdio.h>
#define START_VAL 0
int accum = START_VAL;
int input (void)
{
int n;
scanf("%d", &n);
while (n<2)
{
scanf("%d", &n);
}
return (n);
}

Anda mungkin juga menyukai