Percobaan I Compiler Bahasa C dan Bahasa Assembly Intel ® X86 Zepanya Sahron Banjarnahor (14S16033) Tanggal Percobaan : 27/09/2018 [ELS2203] Elektronika 1] [Laboratorium Sistem Digital] – Teknik Elektro Institut Teknologi Del
Abstrak This week's practice is titled C Language Compiler and Intel x86 Assembly Language. In this lab, 9 assignments will be given for analysis. Practicum tools used are: Laptop with Windows operating system, GCC compiler in Codebloks program package, and the last is Notepad ++ as text editor and HexEdit as hexadecimal editor. The results expected by the practitioner to understand the compilation phase of the program in C Language, are able to compile using the GCC compiler, understand Assembly language, and understand the use of stack memory in each procedure call. Keywords: Assembly, Compiler, GCC. I. PENDAHULUAN Dalam Prose pembuatan program, bahasa tingkat tinggi lebih banyak digunakan karena bahasa tersebut lebih mudah dimengerti dan dipahami oleh manusia contohnya bahasa C. Akan tetapi, bahasa tersebut sulit untuk dimengerti oleh mesin (mikroprosessor) sehingga tidak dieksekusi. Oleh karena itu, diperlukan suatu bahasa yang menjembatani antara kedua bahasa tersebut dari bahasa tingkat tinggi ke tingkat rendah. Solusi dari masalah tersebut adalah dibuatnya Bahasa Assembly yang menjadi penerjemah pemrograman tingkat tinggi menjadi bahasa tingkat rendah yang berisi urutan instruksi yang dimengerti oleh mesin. Selanjutnya instruksi tersebut dikemas kedalam suatu bentuk executable object program yang disimpan dalam bentuk file biner. Proses penerjemahan dari Bahasa tingkat tinggi menjadi bahasa Assembly disebut dengan compilation. Dari sisi instruction set (kumpulan instruksi dalam Bahasa mesin), terdapat dua penggolongan mesin (mikroprosessor) yaitu Complex Instruction Set Computer (CISC), contoh mikroprossesor Intel dan Reduce Instruction Set Computer (RISC), contohnya MIPS32. Pada praktikum ini tujuannya adalah : 1. Praktikan memahami tahap-tahap kompilasi program dalam Bahasa C sebagai tingkat tinggi hingga diperoleh Bahasa tingkat rendah yang dapat dieksekusi oleh mesin.
2.
3.
4.
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 Intel x86 yang dihasilkan compiler GCC. Praktikan dapat memahami penggunaan stack memory pada setiap procedure call. II. LANDASAN TEORI
A. Kompilasi menggunakan GCC Proses menerjemahkan baris kode program dalam bahasa C menjadi file executable dilakukan dalam empat langkah yaitu preprocessor, compiler, assembler, dan linker yang seluruhnya disebut sistem kompilasi.
B. Preprocessor Semua perintah Preprocessor yang ditulis dalam bahasa tingkat tinggi akan diproses terlebih dahulu oleh preprocessor sebelum compiler melaksanakan tugasnya. Beberapa tugas dari preprocessor ini adalah sebagai berikut :
Semua komentar dalam file program, diganti dengan spasi satu buah. Semua \n yang menandakan baris baru akan dihapus tidak peduli dimanapun dia berada. Fitur ini memungkinkan kita untuk membagi baris program yang panjang ke dalam beberapa baris tanpa mengubah arti. Macro yang telah didefinisikan diganti dengan definisinya.
Contohnya, pada perintah #define MAX_ROWS 10, preprocessor akan mengganti semua kata MAX_ROWS dengan 10. Kemudian pada perintah #include <stdio.h>,
preprocessor akan mengganti baris tersebut dengan isi file stdio.h C. MOSFET Sebagai Switch Compiler akan menerjemahkan bahasa tingkat tinggi C ke kode assembly. Kode tersebut berisi intruksi-instruksi yang sesuai dengan indtruction set yang dimiliki oleh mesin. File yang dihasilkan pada tahap ini masih berupa file teks (.s). D. Assembler Assembler akan menerjamahkan bahasa assembly menjadi file objek. File objek ini merupakan file biner (.o).
dengan ukuran tidak terlalu besar dan lebih sedikit menggunakan RAM
-O3: optimalisasi penuh, memanfaatkan multithreading, waktu kompilasi yang cepat, binari berukuran kecil dan menggunakan RAM seminum mungkin binarinya nanti, namun potensi crash amat besar jika sistem tidak mendukung atau source code tidak mendukung opsi ini.
-Os : optimasi dilakukan dengan mengoptimalkan pada ukuran yang kecil pada binari saja,
-Ofast : mengaktifkan semua optimasi pada – O3 E. Linker Linker 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 biner executable (dalam file memiliki akhiran .exe). Untuk melakukan proses kompilasi menggunakan GCC, dapat digunakan Command Prompt pada Microsoft Windows. F. Disassembly menggunakan GCC Selain dapat melakukan kompilasi, paket compiler GCC juga menyertakan sebuah disassembler yang mampu melakukan disassembly file biner (.o atau .exe) menjadi file assembly (.s) bernama Object Dump. G. Optimasi Program melalui Proses Kompilasi GCC mendukung beberapa tingkat optimasi program yang dapat dilakukan saat proses kompilasi dilakukan. Terdapat beberapa tingkat optimasi program yang dapat dipilih dengan menambahkan flag optimasi saat melakukan kompilasi program. Umumnya optimasi program merupakan trade-off antara executablespeed, program size, compilation time, dan kemudahan dalam melakukan debugging. Beberapa flag optimasi yang dikenali oleh GCC adalah – O0, O1, -O2, -O3, -Os, dan – Ofast. Perbedaan masing-masing level optimasi diberikan sebagai berikut :
-O0 : tidak melakukan optimalisasi sama sekali namun mengorbankan waktu kompilasi yang lama, dan menggunakan RAM yang amat besar baik selama proses kompialasi atau binari nantinya, namun baiknya binari akan sangat stabil.
-O1 : opstimasi yang dilakukan sedikit dan menghasilkan waktu kompilasi yang lama, binary berukuran besar, dan memakan banyak RAM.
-O2 : optimalisasi lebih ditingkatkan (dari – O1), waktu kompilasi lebih cepat, menghasilkan binari
dan pilihan – ffast-math dan fortrand specific H. Makefile dan Batch file Pada GCC terdapat fitur makefile yang berfungsi untuk menulis daftar nama file kode didalam suatu project. Kita hanya memberikanGCC nama makefile lalu GCC akan melakukan proses kompilasi untuk semua file tersebut yang kemudian akan digabungkan pada file executable. Makefile dapat bersifat sederhana hingga kompleks, bergantung pada sejauh mana makefile digunakan untuk mengorganisasikan project. Contohnya adalah sebagai berikut : 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
Lalu untuk melakukan kompilasi makefile kita gunakan perintah sesuai dengan yang ada di modul yaitu : Mingw32-make –f makefile Perintah tersebut akan melakukan kompilasi terhadap makefile yang diberikan menjadi sebuah program bernama contoh.exe. Program ini dihasilkan oleh hasil linker terhadap dua file objek bernama contoh.o dan text.o. Untuk memperoleh main.o, GCC harus melakukan kompilasi source code main.c menjadi file objek. Begitu pula untuk memperoleh text.o, GCC harus melakukan kompilasi source code text.c. Pada platform Microsoft® Windows™, ada sebuah file sheel script Windows™ Batch file. Kita dapat menuliskan perintah yang biasa kita tuliskan secara terpisah pada commad prompt dalam suatu file yang disimpan dengan ekstensi .bat. Untuk eksekusi perintah-perintah tersebut, kita cukup menjalankan file .bat tersebut sehingga command prompt terbuka dan perintah yang kita tuliskan dapat dieksekusi secara otomatis. Contoh Windows™ Batch File adalah sebagai berikut :
%~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
Windows™ Batch File tersebut berisi perintah sebagai berikut. Perintah %~d0 memerintahkan command Prompt untuk berpindah driver letter yang sesuai dengan lokasi Windows™ Batch File berada. Selanjutnya, perintah cd “%`dp0” memerintahkan Command prompt untuk berpindah folder ke lokasi Windows™ Batch File berada. Setelah itu command prompt mengeksekusi perintah yang memanggil GCC secara berurutan hingga berhenti akibat adanya perintah pause. Untuk melanjutkan eksekusi, kita cukup menekan sembarang tombol pada keyboard sehingga cmd mengeksekusi perintah selanjutnya yaitu object Dump.
III. HASIL DAN ANALISIS A. Tugas 1 : Proses Kompilasi Bahasa C Menggunakan GCC Pada tugas pertama ini dilakukan kompilasi program, secara bertahap menggunakan GCC. Prosesnya dimulai dengan membuat membuat code program dalam Bahasa C. Kode tersebut berextensi file”.c”. Proses kompilasi diawali dengan preprocessing yang berperan untuk mengubah file code.c ke code.i. kedua file ini typenya filetext, sehingga bias dibuka dari notepad++ seperti gambar berikut. Perbedaannya adalah pada code.i (masih berbentuk bahasa C) tapi spasi hanya 1 karakter, komentarnya hilang, dan definisi mikro sudah finati kedalam program (N_LOOP diganti dengan nilai definisi 500). Proses kompilasi kedua adalah compiling. Proses ini dilakukan penerjemahan code.i jadi kode.s (Bahasa assembly). Kedua file ini masih berbentuk filetxt dan dapat dibuka dari notepad++. Code.s yang sudah dalam bahasa assembly ini berisi instruksi-instruk yang dimengerti mesin. Proses berikutnya adalah Assembler, dimana proses ini berperan untuk menerjemahkan code.s (bahasa assembly) menjadi code.o (file objek). Pada bagian ini file code.o bertipe biner (bukan filetxt) sehingga sehingga jika dibuka dengan text editor menghasilkan karakter yang kurang dimengerti, ditunjukkan seperti dibawah ini :
Gambar 1. Tampilan code.o
Tapi, apabila dibuka dengan HexEdit, maka akan muncul tampilan pola tertentu dalam bentuk biner. Proses terakhir yaitu Linker. Proses ini berperan untuk mengubah code.o (file objek) jadi code.exe. file executable ini juga bertipe file biner, jadi kalau dibuka dengan text editor akan menampilakan karakter yang tidak dipahami, ditujukkan seperti gambar dibawah ini :
Gambar 2. Tampilan filetext code.exe Tapi jika dibuka dengan HexEdit akan menampilakan pola bilangan biner. Perbedaannya dengan file objek adalah pada executable file ini ukurannya lebih besar dan isinya lebih banyak dikarenakan file merupakan gabungan dari semua file yang terkait, contohnya library. B. Tugas 2 : Proses Kompilasi Bahasa C Menggunakan GCC degan Bantuan Batch File Pada tugas ini dilakukan kompilasi program code.c yang sama ditugas 1. Bedanya proses kompilasi tidak dilakukan dengan memberikan perintah satu persatu pada GCC melainkan dengan membuat suatu batch file. Batch file yang kita gunakan sesuai dengan instruksi pada modul yaitu seperti ditujukkan 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
Gambar 3. File batch.bat File ini hanya dapat dijalankan pada platform DOS and Windows. File ini berisi perintah yang mampu diterjemahkan oleh command interpreter. Jadi file ini cara kerjanya sama dengan command prompt hanya bedanya di cara eksekusinya. Proses kompilasi yang dibantu dengan file batch ini membutuhkan waktu yang singkat dikarenakan kompilasi tidak dilakukan tahap demi tahap, tetapi hanya perlu melakukan double klik pada file batch.bat. hasilnya diperoleh yaitu berupa file code.i, code.s, ceode.o, dan code.exe yang identic sama dengan file pada percobaan 1 sebelumnya.
Dari gambar diatas bahwa batch file melakukan operasi yang sama dengan cmd. Tapi lebih praktis karena user hanya perlu melakukan eksekusi file.bat tanpa perlu mengetikan perintah pada cmd setiap kali akan melakukan kompilasi.
C. Tugas 3 : Disassembly File Objek Pada modul 3 dilakukan disassembly file objeck dengan menggunakan objdump. Pertama dilakukan disassembly file code.c sehingga menghasilkan file disassembly_code_o.asm. Kemudian dilakukan pula disassembly file code.exe dan diperoleh file disassembly_code_exe.asm
yang menyatakan bahwa optimasi –O1 lebih optimal untuk mengecilkan file. Pada optimasi dengan – O2, -O3, -Os, dan – Ofast memiliki jumlah baris yang sama yaitu 16 baris. Pada masingmasing optimasi (– O2, -O3, -Os, dan –Ofast) telah dilakukan pengaktifan flag yang berbeda-beda, namun dikarenakan hasil optimasi yang diperoleh sama maka dapat dikatakan bahwa optimasi dengan –O2 saja sudah cukup optimal untuk optimasi pajang file sehingga flag-flag tambahan tidak terlalu berpengaruh. Selain dituinjau dari ukuran file, proses optimasi juga dapat diamati dari segi runtime program. Pada optimasi –O2, O3, dan –Ofast kemungkinan terdapat perbedaan runtime namun karena tidak dilakukannya pengujian pada praktikum ini, maka tidak dapat dikertahui perbedaan antar optimasi dari segi runtime program. Runtime program sendiri dapat dilakukan dengan mencatat timestamp dari tiap proses yang dilakukan dengan bantuan library tambahan sehingga dapat mengakses informasi waktu dati system operasi. E. Tugas 5 : Kompilasi Beberapa File Kode dengan GCC Pada tugas kelima ini dilakukan proses kompilasi terlebih dahulu pada file main_text.c dan text.c sampai didapatkan executable file-nya (main_text.exe). perintah eksekusi pada command prompt ditujukkan pada gambar dibawah ini :
Gambar 6. Perintah eksekusi pada command prompt
Gambar 5. Perbandingan hasil disassembly file code.o dan code.exe Proses disassembly yang sudah dilakukan pada kedua file membuktikan bahwa file binary dapat diubah kembali menjadi bentuk disassembly. Tapi perbedaannya adalah pada file assembly code.o hanya terdapat bagian main dari program, sedangkan pada file assembly code.exe bukan hanya main program, tetapi juga disertai file-file pendukung program lainnya. Hal tersebut menyebabkan disassembly_code_exe.asm memiliki ukuran file yang jauh lebih besar dibandingkan disassembly_code_o.asm. D. Tugas 4 : Optimisasi Kompilasi Program pada GCC Pada bagian ini dilakukan 4 jenis optimasi dari file code.c (diantaranya optimasi –O1, -O2, -O3, -Os, dan –Ofast) yang kemudia akan dibandingkan hasil file assembly-nya. Pada optimasi –O1, terlihat bahwa jumlah baris yang dihasilkan menjadi lebih sedikit daripada file code tanpa optimasi (code_O0.s). hal tersebut sudah sesuai dengan refrensi
Untuk melakukan kompilasi kedua file, dibutuhkan file header yang berfungsi untuk menghubungkan file main_text.c dan text.c file header ini memuat deklarasi fungsi test pada text.c yang selanjutnya akan diterjemahkan dan digunakan pada file main_text.c hasil eksekusi file diatas menunjukkan bahwa GCC juga dapat digunakan untuk melakukan kompilasi beberapa file secara bersamaan dan juga menjadi penghubung antar file menjadi satu program yang utuh secara keseluruhan. F. Tugas 6 : Penggunaan Makefile pada GCC Pada tugas ini menggunakan make_file.c dan text.c Seperti di tugas 5 sebelumnya, dilakukan kompilasi kedua file tersebut dengan menggunakan makefile. Perintah untuk makefile ditujukkan gambar dibawah ini : all: main_text.exe main_text.exe: main_text.o text.o gcc main_text.o text.o -o main_text.exe main_text.o: main_text.c gcc -c main_text.c text.o: text.c gcc -c text.c
Setelah ditest atau di eksekusi dengan cmd, hasil menujukkan kompilasi yang identic sama seperti hasil kompilasi tugas 5. Jadi dapat kita simpulkan bahwa makefile cara lain untuk melakukan kompilasi praktis selain menggunakan batch file.
6. Return temp1+temp2 G. Tugas 7 : Header File Pada tugas kali ini dilakukan penggunaan header file dan extern pada header. Pertama-tama dibuat file add.c, file main.c, file add.h dan juga makefile. Program main.c berfungsi untuk memanggil fungsi yang telah didefinisikan pada add.c. Untuk itu diperlukan header file yang akan di-include pada main.c sehingga dapat memanggil fungsi pada add.c. Proses pemanggilan ini dapat mengalami masalah apabila variable accum (pada add.c) tidak di-extern terlebih dulu sehingga variable tidak terdefinisi pada main.c. Fungsi extern pada header yaitu agar suatu variable dalam sebuah file dapat digunakan pada file “.c” lainnya. H. Tugas 8 : Pemanggilan Prosedur dan Stack Memory Ditugas 8 ini dilakukan percobaan untuk memahami pemanggilan prosedur dan stack pada memory. Pada proses pemanggilan prosedur, memory dapat dimodelkan sebagai stack. Hal tersebut karena proses pemanggilan berbasis stacking data. Proses kompilasi Bahasa C dilakukan secara terurut yang mengakibatkan prose penyimpanan dan pengeluaran datanya pun dilakukan secara terurut. Memory sifatnya dinamis, dimana dapat membesar atau mengecil sesuai kebutuhan. Hal ini dipengaruhi oleh banyaknya data dan optimasi yang dilakukan.
1. Return squaresum (a,b) Call stack : function :main()
2. Int temp1 = square (y) Call stack : function : squaresum(y=5,z=9)
3. Return x*x Call stack : function : square (x=5)
4. Int temp2 = square(z) Call stack : function : squaresumly (y=5,z=9)
5. Return x*x Call stack : function : square (x=9)
call stack : function : squaresum (y=5,z=9)
7. Akhir program Call stack : mingw CRTStartup()
Berdasarkan data tersebut, dapat diamati bahwa terdapat 3 buah stack yang digunakan selama pelaksanaan program, yaitu function main {esp 0x28ff00 ebp 0x28ff28}, function squaresum {esp 0x28fee4 ebp 0x28fe28}, dan terakhir function square {esp 0x28fedc ebp 0x28fedc}. Stack pada ketiga fungsi tersebut berperan dalam melakukan penyimpanan local variable dan return address dari setiap fungsi. Apabila stack telah selesai digunakan, maka nilainya akan direset kembali.. Call stack pada program digunakan untuk menyatakan posisi stack terhadap fungsi yang saat itu digunakan. Misalnya pada return squaresum, stack berada pada fungsi main. %sp atau stack pointer berfungsi untuk menandai letak suatu stack. Nilai %ebp selalu berada diatas nilai %esp dikarenakan base pointer (ebp) menunjukan alamat tertinggi pada frame. Proses pembaharuan nilai pointer dapat dinyatakan sebagai berikut : Proses 1 : stack %ebp dan %esp berselisih 28 bit (0x28). Fungsi main akan pertama-tama akan memanggil fungsi squaresum. Setelah proses pemanggilan, main (sebagai caller ) akan menyimpan return address ke dalam stack. Selanjutnya, squaresum (sebagai callee) akan memperbaharui nilai %ebp dan %esp. Proses 2 : Squaresum yang berikutnya bertindak sebagai caller akan melakukan push nilai y kedalam stack yang menyebabkan nilai %ebp berubah. Kemudian square (sebagai callee) melakukan pembaharuian nilai %ebp dan %esp. Proses 3 : Hasil dari return value (x*x) selanjutnya akan dimasukan kedalam register %eax. Untuk nilai %ebp dan %esp akan tetap sama seperti sebelumnya karena stack belum berpindah. Proses 4 dan 5 : Karena dilakukan perintah return, maka callee akan membersihkan framenya dengan mengganti %ebp dan %esp pada proses 2 sebagai return address untuk melanjutkan proses eksekusi pada caller . Kemudian proses 2 dilakukan kembali untuk mempush nilai variable z. Proses 6 : Di akhir fungsi squaresum, dilakukan perhitungan temp1 + temp dan selanjutnya nilai hasil perhitungan tersebut akan di return dan disimpan pada %eax. Karena masih berada pada fungsi squaresum, maka nilai pointer (%ebp dan %eax) akan tetap sama seperti pada proses 2 dan 4. Kemudian stack akan kembali ke main setelah dilakukan return value. Proses 7 : Main akan melakukan return value pada register %eax. Lalu pointer akan kembali ke return address
yang telah disimpan dan dieksekusi. Hal tersbut dapat dilihat pada call stack yang menunjuk _mingw_CRTStartup(). %esp dan %ebp adalah stack frame dari fungsi _mingw_CRTStartup().
2.
I. Tugas 9 : Program Fibonacci Pada bagian ke 9 ini kompilasi program fibo_main.exe yang merupakan executable file yang berasal dari gabungan file fibo_main.c, inputn.c dan fibo.c. Ketiga file dibuhungkan dengan membuat dua buah header file yaitu fibo.h dan inputn.h Inputn.h :
3.
\#ifndef accum extern int input; #endif
4.
5.
.Fibo.h #ifndef accum extern int fibo (int n); #endif
sedikit langkah pengerjaan. Sedangkan metode kompilasi dengan makefile membuat perintah eksekusi file menjadi lebih mudah. Compiler GCC dapat melakukan disassembly file objek dan file executable yaitu dengan mengubah file.o dan file.exe manjadi bertype file assembly Kompilasi pada GCC dapat dilakukan dengan beberapa jenis optimasi (disesuaikan dengan kebutuhan), seperti –O0, -O1,-O2, -O3, -Os, dan – Ofast. Trade off yang dipertimbangkan yaitu ukuran source code, runtime program, kecepatan kompilasi, serta kemudahan dalam debugging. Pemanggilan prosedur dapat direpresentasikan sebagai stack memory yang bersifat dinamis (ukuran dapat membesar dan mengecil sesuai kebutuhan program yang dijalankan) Header file berfungsi sebagai penghubung antara dua file atau lebih sehingga fungsi atau prosedur pada suatu fungsi juga dapat digunakan pada fungsi lain (yang
dihubungkan).
Extern
berfungsi
untuk
mendeklarasikan sebuah variable global agar dapat
Fibo.c adalahh file yang berisi code untuk menampilkan deret bilangan Fibonacci sebanyak n input yang dimasukan oleh user. Input diperoleh dari fungsi inputn.c . Sedangkan file fibo_main.c adalah main program yang akan memanggil kedua fungsi tersebut (fibo.c serta inputn.c). Header fibo.h berisi deklarasi untuk fungsi fibo sedangkan header inputn.h berisi deklarasi untuk fungsi inputn.h . Kedua header ini akan di-include pada fibo_main.c kedua fungsi (fibo.c serta inputn.c) dapat digunakan pada main program. Eksekusi program berhasil sebagai berikut :
dipakai pada semua file yang telah diubungkan dengan header. 6.
IV. KESIMPULAN
Kompilasi pada GCC terdiri dari 4 tahap yaitu preprocessing, compiling, assembling, dan linking. File hasil preprocessing yaitu berekstensi “ .i “. File hasil compiling berekstensi file “ .s”. File hasil ssembling berekstensi file“ .o”serta file hasil proses linking berekstensi “ .exe”. File .o dan .exe bertype file biner sedangkan ketiga ekstensi file lainnya bertype file text.
Dari percobaan yang telah dilakukan, maka kita dapat menarik V. REFERENSI
kesimpulan sebagai berikut :
[1] Bryant, Randal E. Dan David R. O;Hallaron. Computer 1.
Proses kompilasi pada GCC dapat dilakukan dengan beberapa metode, yaitu menuliskan perintah tahap pertahap pada command prompt, batch file, dan juga makefile. Metode batch file pada dasarnya sama seperti melakukan compiling satu per satu, namun ditulis dalam satu file sehingga hanya memerlukan
System : A Programmer’s Perspective. Prentice Hall. USA.2011 [3]
Data didapat dari praktikum jumat 27 September 2018 di Lab Dasar Teknik Elektro IT Del.
Lampiran
1.
Source code tugas 1 a.
Code.c
// Praktikum NWS3103 Arsitektur Sistem Komputer // Modul : 1 // Percobaan : NA // Tanggal : 27 September 2018 // Kelompok : NA // Rombongan : NA // Nama (NIM) 1 : Zepanya Sahron B (14S16033) // Nama File : Code.c //Deskripsi : Demonstrasi proses kompilasi // menjumlahkan deret bilangan sebanyak N_LOOP
#define N_LOOP 500 int main(void) { int indeks; int accumulator; indeks = 0; accumulator = 0; while (indeks
b.
File code.i
# 1 "code.c" # 1 "" # 1 "" # 1 "code.c" # 15 "code.c" int main(void) { int indeks; int accumulator; indeks = 0; accumulator = 0; while (indeks<500) { accumulator = accumulator + indeks; indeks = indeks + 1; } return accumulator; }
C. File code.s .file "code.c" .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: 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) jle L4 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
D. File code.o
E. File Code.exe