Anda di halaman 1dari 38

Percobaan I

COMPILER BAHASA C DAN BAHASA


ASSEMBLY INTEL® X86
Nama Praktikan (Sella Veralisa Simangunsong)
Dosen:Indra Hartanto Tambunan, Ph.D (0128048403)
Asisten : Philippians Manurung, ST
Tanggal Percobaan : 25/09/2020
14S3102 – Praktikum Arsitektur Sistem Komputer
Institut Teknologi Del

Abstrak— untuk membuat suatu program, bahasa tingkat melakukan analisis terhadap Bahasa assembly yang dihasilkan
tinggi cenderung banyak digunakan karena Bahasa tingkat tinggi compiler GCC, serta memahami penggunaan stack memory
ini mudah dimengerti oleh manusia seperti halnya Bahasa C. pada procedure call.
Namun, Bahasa tingkat tinggi tidak dapat dimengerti oleh mesin Beberapa proses penerjemahan kode program dalam Bahasa C
(mikroprosesor) sehingga tidak dapat dieksekusi. Maka
menjadi executable seperti preprocessor, compiler, assembler,
diperlukan Bahasa tingkat tinggi yang dimengerti oleh mesin yang
berisi urutan instruksi. Kumpulan instruksi yang dimengerti oleh dan linker, akan dipahami dalam modul percobaan satu.
mesin disebut instruction set yang terdapat dalam dua
penggolongan yaitu, complex instruction set computer (CISC) dan
reduced instruction set computer (RISC). Proses menerjemahkan II. LANDASAN TEORETIS
baris kode program dalam Bahasa C menjadi executable
2.1. Proses menerjemahkan kode program menjadi file
dilakukan dalam empat langkah yaitu preprocessor, compiler,
assembler, dan linker. executable
Terdapat empat langkah dalam menerjemahkan kode program
Kata Kunci— preprocess, compile, assembly, linker, command dalam Bahasa C menjadi file executable yaitu:
promp, HeXEdit, batchfile, makefile.

I. PENDAHULUAN
Preprocessor
Computer memiliki bahasanya sendiri yang biasa disebut Semua perintah preprocessor yang ditulis dalam
dengan Bahasa mesin, Bahasa mesin adalah seperangkat Bahasa tingkat tinggi akan diproses terlebih dahulu
instruksi serta data yang bisa dieksekusi secara langsung oleh oleh preprocessor sebelum compiler melaksanaka
prosesor computer. Bahasa mesin ialah tingkatan yang paling tugasnya. Beberapa tugas dari preprocessor ini adalah
rendah dari Bahasa pemrograman, misalnya Bahasa assembly. sebagai berikut:
Dan biasa dipakai sebagai tujuan kompilasi oleh compiler pada 1. Semua komentar dalam file program diganti
Bahasa pemrogramana yang lain pada tingkatan yang lebih dengan spasi satu buah
tinggi missal Bahasa c, pascal, visual basic, java atau COBOL. 2. Semua “\n” yang menandakan baris baru akan
Compiler atau kompilator adalah perangkat lunak yang dihapus tidak pedulu dimanapun dia berada. Fitur
digunakan untuk mengubah source code pemrograman menjadi ini memungkinkan kita untuk membagi baris
Bahasa mesin agar dapat dijalankan oleh konputer. Istilah program yang panjang ke dalam beberapa baris
compiler biasa digunakan untuk program computer yang tanpa mengubah arti.
menerjemahkan program yang ditulis dalam Bahasa c++, 3. Macro yang telah didefinisikan diganti dengan
pascal, FORTRAN, visual basic, java dll diterjemahkan definisinya.
menjadi Bahasa Assembly sebagai perantara. Compiler
Dalam praktikum ini, akan dipahami dan dianalisis bagaimana Compiler aka menerjemahkan Bahasa tingkat tinggi C
computer menerjemakan Bahasa kedalam Bahasa mesin yang menjadi kode assembly, kode assembly ini berisi
dimengerti prosessor. Beberapa kompilasi akan dipraktikan instruksi yang sesuai dengan instruction set yang
menggunakan gcc. Sehingga dapat memahami tahap-tahap dimiliki oleh mesin. File yang dihasilkan pada tahap
kompilasi program dalam Bahasa C sebagai Bahasa tingkat ini masih berupa file teks (.s).
tinggi hingga diperoleh Bahasa tingkat rendah yang dapat Assembler
dieksekusi oleh mesin, melakukan kompilasi program Bahasa Assembler akan menerjemahkan Bahasa assembly
C menggunakan compiler GCC beserta penggunaan makefile menjadi file objek. File objek ini merupakan file biner
dan batch file, memahami Bahasa assembly dn mampu (.o).
Linker disimpan ke dalam suatu file, kita dapat menggunakan perintah
Linker akan menggabungkan file biner yang diperoleh berikut:
pada tahap sebelumnya dengan file biner lain yang objdump -d Program.o > Program.s
merupakan dependency dari program yang dibuat,
contohnya library untuk menjalankan fungsi printf.
objdump -d Program.exe > Program.s
Hasil dari linker berupa file biner executable (dalam
platform Microsoft® Windows™, file ini memiliki
akhiran .exe). 2.4. Optimisasi program melalui proses kompilasi
GCC mendukung beberapa tingkat optimisasi program
Untuk melakukan proses kompilasi menggunakan GCC, kita yang dapat dilakukan saat proses kompilasi dilakukan.
dapat menggunakan commnd prompt pada Microsoft® Terdapat beberapa tingkat optimisasi program yang dapat
Windows™. dipilih dengan menambahkan flag optimisasi saat
2.2. Beberapa perintah proses kompilasi melakukan kompilasi program. Umumnya optimisasi
Hanya melakukan proses preprocessing program merupakan trade-off antara executiom speed,
gcc -E program.c program size, compilation time, dan kemudahan dalam
Eksekusi perintah tersebut akan menampilkan di layar melakukan debugging
command prompt kode program.c setelah melalui gcc –02 -o Program.exe Program.c
proses preprocessing . agar memperoleh output berupa Flag-02 tersebut menandakan bahwa proses kompilasi
file, dapat menggunakan tambahan perintah sebagai dilakukan dengan optimisasi tingkat dua.beberapa flag
berikut: optimisasi yang dikenali oleh GCC adala -00, -01, -02, -03,
gcc –E program.c > program.i -0s, -0fast.
Eksekusi perintah tersebut akan menghasilkan file 2.5. Makefile dan batch file
program.i berisi kode program.c yang telah melalui Untuk suatu project yang terdiri atas beberapa file kode,
preprocessing pada folder yang sama dengan file tenu akan sangat merepotkan untuk melakukan kompilasi
program.c. file ini dapat dibuka dengan teks editor dengan menggunakan perintah kompilasi yang ditulis pada
contohnya notepad++.
command prompt satu per satu untuk setiap file. GCC
Hanya melakukan proses preprocessing dan
memerlukan fitur makefile yang berfungsi untuk menulis
compiling
daftar nama file kode kedalam project tersebut. Cukup
gcc -S Program.c
membrikan GCC nama makefile lalu GCC akan
Eksekusi perintah tersebut akan menghasilkan file
melakukan prose kompilasi untu semua file tersebut untuk
program.s yang berisi baris instruksi assembly pada
kemudian menggabungkannya pada file excutable.
folder yang sama dengan program.c. fil ini dapat
Makefile bersifat sederhana hingga kompleks, bergantung
dibuka dengan teks editor seperti notepad++.
Hanya melakukan proses preprocessing , pada sejauh mana kita menggunakan makefile untuk
preprocessing, dan assembly mengorganisasikan projek kita. Conto isi dari make file:
gcc -c Program.c
Eksekusi perintah tersebut akan mengahsilkan file
program.o yang merupakan file biner. File ini dapat
dibuka dengan program hex editor contohnya HexEdit.
Melakukan seluruh proses kompilasi (preprocessing,
compiling, assembly, linking) Gcc dapat diperintahkan untuk melakukan kompilasi
gcc -o Program.exe Program.c makefile dengan perintah sebagai berikut:
mingw32-make -f makefile
Eksekusi perintah tersebut akan menghasilkan Perintah tersebut akan melakukan kompilasi terhadap
program.exe yang dapat langsung dieksekusi . dapat
makefile yang diberikan menjadi sebuah program bernama
juga melakukan kompilasi dua dile bahsa C sekaligus. contoh.exe. program ini dihasilkan oleh linker terhadap du
gcc -o Program.exe sub.c main.c file objek bernama main.o dan text.o. Untuk memperoleh
2.3. Disassembly menggunakan GCC main.o, GCC harus melakukan kompilasi source code
Selain dapat melakukan kompilasi, paket compiler GCC juga main.c menjadi file objek. Begittu pula untuk memperoleh
menyertakan sebuag disassembler yang mampu melakukan text.o, GCC harus melakukan kompilasi source code text.c.
disassembly,file biner ( .o atau .exe) menjadi file assembly (.s) Pada platform Microsoft® Windows™, terdapat sebuah
bernama object dump. Untuk melakukan assembly kita dapat file shell script bernama Windows™ batch file. Kita dapat
menggunakan perintah: menuliskan perintah-perintah yang biasa kita tuliskan
objdump -d Program.o secara terpisah pada cmd dalam suatu file yang disimpan
dengan ekstensi.bat. untuk mengeksekusi perintah-
objdump -d Program.exe perintha tersebut, kita cukup menjalankan file.bat tersebut
Hasil dari proses disassembly ditampilkan pada jendela sehingga cmd terbuka dan perintah-perintah yang kita
command prompt. Agar hasil dari proses disassembly dapat tuliskan secara otomatis dieksekusi, contoh bacth file
dari argument terakhir hingga argument paling awal secara
berurutan ke dalam stack. Selanjutnya, caller akan
memasukkan return address ke dalam stack. Kemudian
calle memasukkan alamat old base pointer milik caller
kedalam stack dan memperbarui milai base pointer yang
sesuai dengan frame calle (nilai base pointer yang baru
sama dnegan nilai stack pointer setelah old base pointer
disimpan kedalam stack). Kemudian calle melakukan
alokasi terhadap variable local dan melakukan komputasi
Windows™ btch file tersebut berisi perintah sebagai
sesuai dengan fungsi calle tersebut.
berikut. Perintah %~do memerintahkan cmd untuk
Ketika calle selesai dieksekusi, callee akan menyimpan
berpindah drive letter ke drive letter yang sesuai dengan
return value pada register EAX. Kemudian calle akan
lokasi Windows™ batch file berada. Selanjutnya perintah
membersihkan framenya sendiri dengan mengganti alamat
cd : %~dp0” memerintahkan cmd untuk berpidah folder ke
base pointer dengan old base pointer yang telah disimpan
lokasi Windows™ batch file berada. Selanjutnya,
pada stack. Kemudian, return address digunakan untuk
command prompt mengeksekusi perintah yang memnggil
melanjutkan eksekusi instruksi pada caller.
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.
2.6. Instruksi dan Bahasa Assembly Intel® x86
Arsitektur mikroprosesor Intel® x86 merupakan salah satu
arsitektur mikroprosesor yang banyak digunakan. Terdapat
banyak register yang dapat digunakan, misalnya:
 EAX, EBX, 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 mengeluarkan
elemen dari dalam stack akan menambah ESP.
 EBP adalah register 32 bit yang digunakan
sebagai base pointer . dengan demikian EBP
akan berisi alamat dari current activation pada
stack.
 EIP adalah register 32 bit yang digunakan
sebagai instruction pointer. Dengan demikian
EIP akan berisi alamat dari instruksi selanjutnya
yang akan dieksekusi.
2.7. Stack dan procudere call
Satck pada umumnya disusun atas beberapa activation
frame . setiap frame memiliki sebuah base pointer yang
menunjukkan alamat 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) memamnggil sebuah prosedur(calle), caller akan
memasukkan argument – argument untuk memanggil calle
III. HASIL DAN ANALISIS
a. Tugas 1: Proses kompilasi Bahasa C menggunakan GCC

Kode Program:
//praktikum 14S3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//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;
}

Code.o with HeXedit:


Code.s with HeXEdit:

Telah dibahas sebelumnya bahawa proses kompilasi dalam Bahasa C menjadi executable, terdapat proses yang akan
membuat kode program berhasil dieksekusi yaitu preprocessing, compiling, assembling, dan linking. Maka kode
program ini akan dikompilasi mesin (mikroprosesor) dalam 4 tahap tersebut. Dalam tahap preprosessor semua baris kode
program akan diproses dan menghasilkan kode program baru seperti dibawah ini:
Code.i
# 1 "code.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "code.c"
# 11 "code.c"
int main (void)
{
int indeks;
int accumulator;
indeks =0;
accumulator = 0;
while (indeks < 500){
accumulator = accumulator + indeks;
indeks = indeks + 1;
}
return accumulator;
}
Pada code diatas dapat kita lihat bahwa ada yang berubah pada kode program. Dapat kita lihat pada tabel dibawah
Code .c Code .i
#define N_LOOP 500 # 1 "code.c"
int main (void) # 1 "<built-in>"
# 1 "<command line>"
# 1 "code.c"
# 11 "code.c"
while (indeks < N_LOOP) while (indeks < 500){
Pada kolom pertama, pada code.i terdapat angka 1 dan 11. Ini berarti mesin menerjemahkan kode program ke Bahasa
yang mudah dipahami mesin (mikroprosesor).
Pada kolom kedua, pad code.i terdapat perubahan yaitu dari N_LOOP menjadi 500

Code.s
.file "code.c"
.def ___main; .scl 2; .type 32; .endef
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $0, -4(%ebp)
movl $0, -8(%ebp)
L2:
cmpl $499, -4(%ebp)
jleL4
jmp L3
L4:
movl -4(%ebp), %eax
leal -8(%ebp), %edx
addl %eax, (%edx)
leal -4(%ebp), %eax
incl (%eax)
jmp L2
L3:
movl -8(%ebp), %eax
leave
ret
Setelah tahap preprocessing maka tahap selanjutnya adalah tahap compiler. Maka dihasilkan kode program baru dengan
code.s. jelas terdapat perbedaan yang mencolok dari code.s . kode diatas disebut Bahasa Assembly.
Setelah tahap compiler maka tahap selanjutnya adalah assembler yaitu mengubah code.s menjadi code.o. dimana code.o
ini adalah file biner yang ditunjukkan pada gambar sebelumnya. Dengan file biner ini akan memudahkan mesin dalam
menerjemahkan code.c sebelumnya sehingga tahap terakhir yaitu linking. Mengubah code.o menjadi code.exe. tahap
linking adalah tahap akhir dari penerjemahan kode program sehingga kode program dapat dieksekusi.
b. Tugas 2 : Proses kompilasi Bahasa C menggunakan GCC dengan bantuan batch file

Kode Program:

//praktikum NWS3103 Arsitektur Sistem Komputer


//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :proses kompilasi bahasa C menggunakan GCC
// dengan bantuan batch file

#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;
}
Batch file merupakan cara cepat melakukan kompilasi. Berbeda dengan kompilasi menggunakan GCC, pada batch file
ini kompilasi akan lebih cepat karena sekaligus melakukan terjemahan dengan kode dibawah ini
%~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
Dari code program diatas kita dapat melihat bahwa kode preprocessing, compiling, assembling dan linking telah didalam
sebuah batch dengan akhiran .bat. setelah bacth file tersimpan maka otmatis mesin menerima terjemahan hanya satu kali
klik. Maka output dari kode program dengan kompilasi batch file dapat kita lihat pada gambar dibawah

Output dengan batch file:


c. Tugas 3:Disassembly file objek
1. Disassembly file code.o:

Disassembly adalah cara cepat dalam menerjemahkan Bahasa c. file code,o dan file code.exe disassembly sehingga
menghasilkan disassembly code dan disimpan dalam code.s. dapat kita lihat hasil disassembly code.o dan code .exe pda
gambar diatas dan dibawah ini

2. Disassembly file code.exe


d. Tugas 4: Optimisasi kompilasi program pada gcc
//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :Optimisasi kompilasi program pada gcc

#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;
}
Pada optimisasi kompilasi program dalam Bahasa C menggunakan nama file yang berbeda. Yang sering digunakan
adala -00. -02, -03, -0s, dan -0fast. Kita juga menggunakan batch file agar kompilasi lebih cepat. Cara ini digunakan jika
kita ingin mengkompilasi file yang berbeda. Dan langsung melakukan proses penerjenahan secara otomatis dengan
bantuan batchfile. Batchfile yang digunakan dalam kode program ini adalah:

%~d0
cd "%cd~dp0"
gcc -00 -c code_00.c
gcc -01 -c code_01.c
gcc -02 -c code_02.c
gcc -03 -c code_03.c
gcc -0s -c code_0s.c
gcc -0fast -c code_0fast.c
objdump -d code_00.o > code_00.s
objdump -d code_01.o > code_01.s
objdump -d code_02.o > code_02.s
objdump -d code_03.o > code_03.s
objdump -d code_0s.o > code_0s.s
objdump -d code_0fast.o > code_0fast.s
pause
Akhiran program selalu diakhir pause, sehingga jika mesin sudah sampai pada 0fast, maka kompilasi akan berhenti.
Kode program tersebut kita simpan menjadi batch file. Jika file sudah tersimpan , maka kita tinggal mengklik batch file
dan yang muncul adalah command prompt dan sudah melakukan kompilasi. Tampilan kompilasi dapat kita lihat pada
gambar dibawah ini.

Output program
Batch file code_00.s:

Bacth file code_01.s:


Batch file code_02.s

Batch file code_03.s


Batch file code 0s.s

Batch file ofast.s


e. Tugas 5: Kompilasi beberapa file kode dengan GCC
1. Kode program main_text.c
//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :kompilasi beberapa file kode dengan GCC

#include "text.h"
void main (void)
{
test();
}

2. Kode program text.c


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :kompilasi beberapa file kode dengan GCC

#include <stdio.h>
#include "text.h"
void test (void)
{
printf ("Arsitektur Sistem Komputer sangat menyenangkan:(!\n");
getch();
}

3. Kode program text.h


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :kompilasi beberapa file kode dengan GCC

#ifndef TEST_H
#define TEST_H 100
void test (void);
#endif
Pada tahap ini kita menggunakan header untuk melakukan kompilasi dengan cepat. Maka kode program dapat kita lihat
pada kotak diatas. Cara ini sungguh unik dan menarik, karena hanya dengan header file tahap penerjemahan dapat
dilakukan computer. Rumus yang digunakan pada kompilasi ini adalah
gcc -o main_text.exe text.c main_text.c
Maka dihasilkan output seperti gambar dibawah ini.
Output program :
f. Tugas 6: Penggunaan makefile pada gcc
Kode program 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

Kode program main_text.c


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :penggunaan makefile pada GCC

#include "text.h"
void main (void)
{
test();
system("pause");
}

Kode program text.c


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :penggunaan makefile pada gcc
#include <stdio.h>
#include <stdlib.h>
#include "text.h"
void test (void)
{
printf ("Arsitektur Sistem Komputer sangat menyenangkan:(!\n");
getch();
}
Kode program text.h
//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :penggunaan makefile dengan GCC

#ifndef TEST_H
#define TEST_H 100
void test (void);
#endif
Sama halnya dengan tugas 5 yaitu menggunakan header, yang menjadi pembeda adalah pad acara ini terdapat makefile.
Dalam makefile tersebut telah dilakukan kompilasi penerjemahan, kode program tersebut disimpan dalam satu file
dengan nama make file. Maka untuk melakukan kompilasi agar dapat menampilkan output maka digunakan rumus
mingw32-make -f makefile
dalam command prompt yang akan dipanggil makefile, dalam makefile tersebut telah terdapat kode untuk
menerjemahkan kode program. Maka diadapt hasilnya sebagai berikut:

Output program:

g. Tugas 7: Header File


Kode program main.c
//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM): Sella Simangunsong (14S18005)
//deskripsi :pemanggilan prosedur dan stack memory

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

void main (void){


int angka_1, angka_2, jumlah;
printf("Masukkan dua bilangan: \n");
printf("Angka 1: "); scanf("%d",&angka_1);
printf("Angka 2: "); scanf("%d",&angka_2);
jumlah = sum(angka_1,angka_2);
printf("Jumlah : %d\n", jumlah);
printf("Masukkan dua bilangan: \n");
printf("Angka 1: "); scanf("%d",&angka_1);
printf("Angka 2: "); scanf("%d",&angka_2);
jumlah = sum(angka_1,angka_2);
printf("Jumlah : %d\n", jumlah);
printf("Akumulasi : %d\n",accum);
system("pause");

Kode program add.c


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :Header file
#define START_VAL 0

int accum = START_VAL;


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

Kode program add.h


//praktikum NWS3103 Arsitektur Sistem Komputer
//Modul :1
//Percobaaan : Compiler bahasa C dan bahasa Assembly Intel
//tanggal :25 september 2020
//Nama (NIM) : Sella Simangunsong (14S18005)
//deskripsi :pemanggilan prosedur dan stack memory

#ifndef START_VAL
#define START_VAL 0
extern int accum;
int sum(int x, int y);
#endif
Sama halnya dengan tugas 6 kita memanfaatkan header file, dan juga menggunakan makefile agar proses kompilasi lebih
mudah.
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

Saya menggunakan makefile untuk melakukan kompilasi. Pada makefile tersebut telah diterjemahkan code program dengan
tahap-tahap penerjemahan. Jika makefile sudah tersedia dengan benar maka eksekusi dapat dialakukan dengan
Gcc mingw32-make –E makefile
Maka otomatis hasil eksekusi akn ditampilakan pada layar komputer

Output:

h. Tugas 8:Pemanggilan prosedur dan stack memory

Kode program dalam pemanggilan prusedur dan stack memory


int square (int x)
{

return x*x;
}
int squaresm (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 squaresm(a,b);
}

1. Ketika panah kuning berada pada kode return squaresum(a,b)

2. Ketika panah kuning int temp1 = square(y);


3. Ketika panah kuning return x*x;

4. Ketika panah kuning int temp2 = square(z);


5. Ketika panah kuning return x*x;

6. Ketika panah kuning return temp1+temp2;


Perbandingan stack memory pada setiap state:
State Stack memory
return squaresum(a,b)

int temp1 = square(y);.

return x*x;.

int temp2 = square(z);.

return x*x;.
Analisis pertanyaan:
1. Bagaimana proses sebuah kode file Bahasa C diolah menjadi program executable
Jawab:

Proses menerjemahkan isi setiap baris pada kode menjadi executable terdapat 4 tahap yaitu preprocessor, compiler,
assembler, dam linker.
Agar computer dapat mengeksekusi kode program maka terdapat tahap untuk menerjemahkan Bahasa agar dapat
dimengerti oleh mesin. Maka proses executable dapat kita lihat sebagai berikut:
- Source program dipreprocessing menjadi program.i dengan rumus “gcc -E code .c > code .i”
- Mengubah program.i menjadi program.s dengan rumus “gcc -S code .c”
- Code program akan menjadi code.s dalam bentuk file biner. Setelah itu code.s menjadi code .exe dengan rumus “gcc
-c code.c”
- Maka akan dapat dilakukan eksekusi dengan ” gcc -o code.exe code.c’
2. Bagaimana pengaruh arsitektur mikroprosesor terhadap compiler bahasa C?
Jawab:
Arsitektur mikroprosesor berpengaruh terhadap compiler Bahasa C, karena yang akan menerjemahkan kode program
dalam Bahasa C adalah microprocessor. Maka perlu adanya, microprocessor untuk dapat melakukan proses kompilasi.
Namun banyak digunakan Bahasa tingkat tinggi yang tidak dapat dimengerti oleh mesin sehingga tidak dapat
microprocessor mengeksekusi kode program
3. Mengapa untuk membuka file objek, baik file .o maupun .exe, tidak dapat dilakukan dengan teks editor biasa?
Jawab:
Karena teks editor tidak dapat menampilkan hasil terjemahan computer. Karena file.c telah diterjemahkan kedalam
Bahasa mesin menjadi file.o file.i dan file.exe. hanya file.i yang dapat ditampilkan oleh teks editor. Namun file.o dan exe
tidak dapat dibaca teks editor karena telah diubah dalam file biner sehingga membutuhkan aplikasi HexEdit agar file
biner dapat ditampilkan.
4. Mengapa hasil disassembly file code.o dan file code.exe menghasilkan file assembly yang berbeda? Mengapa file hasil
disassembly code.exe memiliki isi lebih banyak dibanding file hasil disassembly code.o?
Jawab:
Karena file code .o dan file code.exe memiliki file biner yang berbeda sehingga hasil disassembly juga kan berbeda.
Disassembly code.exe isinya lebih banyak dari code.o, hal ini karena jumlah file biner kedua kode berbeda. Jumlah file
biner code.exe lebih banyak dari file biner code.o
5. Bagaimana pengaruh pilihan optimisasi pada GCC saat kompilasi? Adakah cara untuk mengukur perbedaan
kecepatan eksekusi dari program yang dihasilkan dengan pilihan optimisasi yang berbeda?
Jawab:
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 main.o dan text.o (tentunya termasuk
dengan library yang lain yang dibutuhkan). Untuk memperoleh main.o, GCC harus melakukan kompilasi source code
main.c menjadi file objek. Begitupula untuk memperoleh text.o, GCC harus melakukan kompilasi source code text.c.
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.
6. Apa perbedaan antara file makefile dan file batch? Jenis file yang manakah yang paling membantu dalam praktikum ini?
Jawab:
Perbedaan terdapat pada tata letak kodenya:
Batchfile
Makefile

Yang membantu dan mudah digunakan adalah batchfile. Makefile harus berhati hati dalam penulisan code karena
berpengaruh pada proses kompilasi.

7. Apa fungsi file header?


Jawab:
File header berfungsi untuk memanggil dan menjalankan fungsi – fungsi yang terdapat dalam library header agar dapat
menggunakan fungsi pda file tersebut, mendefinisikan berbagai file makro, fungsi, variable dan konsatanta. File header
bagian dari proses kompilator. Kompilator dari Bahasa C menjalankan program dinamakan preprocessor. Preprocessor
memiliki kemampuan menambahkan dan menghapus kode dari sumber kode
8. Apa fungsi dari variable extern
Jawab:
Fungsi variable extern adalah variable global yang digunakan apabila program yang ditulis berjumlah lebih dari satu
file.cara membuat variable extern adalah dengan menyertakan kata kuci extern di depan deklarasi variable
9. Mengapa dalam procedure call, memory dimodelkan dengan stack?
Jawab:
Karena suatu program memanggil sebuah prosedur, caller akan memasukkan argument untuk memanggil calle dari
argument terakhir hingga argument paling awal secara berurutan sama halnya denga stack yang menunjuk alamt tertinggi
. karena stack tumbuh dari low address ke high address.
10. Bagaimana susunan stack terhadap pemanggilan procedure?
Jawab:

11. Apa saja tanggung jawab caller dalam setiap pemanggilan procedure?
Jawab:
Caller memasukkan argument untuk memanggil callee dari argument terkahir hingga argument paling awal secara
berurutan ke dalam stack . selanjutnya caller akan memasukkan return address ke dalam stack.
12. Apa saja tanggung jawab callee dalam setiap merupakan dependency dari program yang dibuat,
pemanggilan procedure? contohnya library untuk menjalankan fungsi printf.
Jawab: Hasil dari linker berupa file biner executable (dalam
Callee memasukkan alamat old base pointer milik platform Microsoft® Windows™, file ini memiliki
caller ke dalam stack dan memperbarui nilai base akhiran .exe).
pointer yang sesuai dengan frame callee (nilai base 6. Terdapat 7 cara dalam melakukan kompilasi kode
pointer yang baru sama dengan nilai stack pointer program yaitu
setelah old base pointer disimpan ke dalam stack). - Proses kompilasi Bahasa C menggunakan GCC
Kemudian callee melakukan alokasi terhadap variable. - Menggunakan GCC dengan bantuan batch file
Lokal dan melakukan komputasi sesuai dengan fungsi - Disassembly file objek
callee tersebut. Ketika callee selesai dieksekusi, callee -
akan menyimpan return value pada register EAX. - Optimisasi kompilasi program pada gcc
Kemudian, callee akan membersihkan framenya - Kompilasi beberapa file kode dengan GCC
sendiri dengan mengganti alamat base pointer dengan - Makefile
old base pointer yang telah disimpan pada stack. - Header file
Kemudian, return address digunakan untuk 7. Ketika suatu program (caller) memanggil sebuah
melanjutkan eksekusi instruksi pada caller. prosedur (callee), caller akan memasukkan argumen-
argumen untuk memanggil callee dari argumen
terakhir hingga argumen paling awal secara berurutan
IV. SIMPULAN ke dalam stack. Selanjutnya, caller akan memasukkan
Setelah melakukan percobaan, maka dapat disimpulkan return address ke dalam stack. Kemudian, callee
bahwa: memasukkan alamat old base pointer milik caller ke
1. Terdapat 4 tahap dalam menerjemahkan baris kode dalam stack dan memperbarui nilai base pointer yang
program dalam Bahasa C menjadi file executable sesuai dengan frame callee (nilai base pointer yang
yaitu, preprocessor, compiler, assembler, linker. baru sama dengan nilai stack pointer setelah old base
2. Preprocessor Semua perintah preprocessor yang pointer disimpan ke dalam stack). Kemudian callee
ditulis dalam bahasa tingkat tinggi akan diproses melakukan alokasi terhadap variable lokal dan
terlebih dahulu oleh preprocessor sebelum compiler melakukan komputasi sesuai dengan fungsi callee
melaksanakan tugasnya. Beberapa tugas dari tersebut. Ketika callee selesai dieksekusi, callee akan
preprocessor ini adalah sebagai berikut. menyimpan return value pada register EAX.
o Semua komentar dalam file program diganti dengan Kemudian, callee akan membersihkan framenya
spasi satu buah. sendiri dengan mengganti alamat base pointer dengan
o Semua \n (backslash-newline) yang menandakan old base pointer yang telah disimpan pada stack.
baris baru akan dihapus tidak peduli dimanapun dia Kemudian, return address digunakan untuk
berada. Fitur ini memungkinkan kita untuk membagi melanjutkan eksekusi instruksi pada caller.
baris program yang panjang ke dalam beberapa baris
tanpa mengubah arti.
o Macro yang telah didefinisikan diganti dengan REFERENSI
definisinya. 1. Aho, A.V., Ravi, S., & Ullman, J.D. (2007).
3. Compiler akan menerjemahkan bahasa tingkat tinggi Compiler: Principle, techniques and tools. @nd.
C menjadi kode assembly. Kode assembly ini berisi Addison-Wesley. New York
instruksi-instruksi yang sesuai dengan instruction set 2. Bryant, Randal, dan David O’Hallaron. Computer
yang dimiliki oleh mesin. File yang dihasilkan pada Systems : A Programmer’s Perspective 2nd Edition.
tahap ini masih berupa file teks (.s). 2011. Massachusetts : Pearson Education Inc.
4. Assembler akan menerjemahkan bahasa assembly 3. Patterson, David, dan John Hennessy. Computer
menjadi file objek. File objek ini merupakan file biner Organization and Design : The Hardware/Software
(.o). Interface. 2012. Waltham : Elsevier Inc.
5. Linker akan menggabungkan file biner yang diperoleh 4. Modul paraktikum arsitektur computer.
pada tahap sebelumnya dengan file biner lain yang
Lampiran
Contoh dissassembly
File biner dalam HexEdit

Kompilasi GCC

Anda mungkin juga menyukai