Anda di halaman 1dari 18

TEKNIKELEKTROITB

ModulPraktikum ArsitekturSistemKomputerI EL3110

2012

ModulInitelahdirevisidandilengkapioleh: AndriHaryono(TeknikElektro2006) FrillazeusGoltha(TeknikElektro2006) NikoRobbel(TeknikElektro2006) ArdiantoSatriawan(TeknikElektro2007) GilangIlham(TeknikElektro2007) MuhammadJohanA(TeknikElektro2007) UmarAbdulAziz(TeknikElektro2007) TommyGunawan(TeknikElektro2008)

PETUNJUK PRAKTIKUM ARSITEKTUR KOMPUTER I


KOMPOSISINILAI BukuCatatanLaboratorium(BCL) PRAKTIKUM :20% :40%

Ada6percobaandenganbobot40%daritotalpenilaian.berikutnilaitiappercobaan(total 100%). NILAIAKTIVITASPRAKTIKUM SOURCECODE NILAITESTAKHIR LAPORAN :35% :40% :25% :40%

TOLERANSI KETERLAMBATAN 15 MENIT


Keterlambatanlebihdari15menit(berdasarkanjamdilab)tidakdiperbolehkanmasukkelab.

PetunjukPembuatanLaporan 1. Laporan hanya terdiri atas identitas praktikan, abstrak, data praktikum, analisis, dan kesimpulan.Lampirandanhallainnyadisertakanbiladiperlukan.Formatterlampir 2. Ketika melampirkan gambar terminal/command terminal/commandpromtberwarnaputih. prompt, pastikan background

3. Gunakanfontcourier new padakodeprogramyangdilampirkan. #define int accum = START_VAL; START_VAL 0

int sum(int x, int y) { int t = x + y; accum += t; return t; } 4. HapusfolderpekerjaanAndasetiapselesaimenggunakankomputer. 5. Disarankanmencobapraktikumterlebihdahuludirumah.

BahasaC

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 1 KOMPILASI DAN DISASSAMBLE PROGRAM

TUJUAN
Memahami tahaptahap kompilasi dari bahasa tingkat tinggi hingga diperoleh file eksekusi. Memahamicaramemeriksasuatuprogramberbasisbahasaassembly.

ALAT PERCOBAAN
PersonalComputerPC. CompilerGCCpadaOperatingSystem

DASAR TEORI
SistemKompilasi Suatu program akan mudah dibaca dan dimengerti oleh manusia jika ditulis dalam bahasa tingkat tinggi, seperti highlevel C program. Tetapi, agar program dapat dijalankan pada sistem komputer, makasetiapbarispernyataanpadaCharusditerjemahkanolehsuatuprogramlainmenjadiurutan instruksi bahasa mesin tingkat rendah. Instruksiinstruksi tersebut kemudian dikemas dalam suatu bentukyangdisebutexecutableobjectprogramdandisimpandalamfilebiner. Langkahlangkah menerjemahkan barisbaris kode program pada C menjadi file eksekusi dilakukan dalam empat langkah meliputi preprocessor, compiler, assembler, dan linker, yang seluruhnya disebutsistemkompilasi.
program.c Source program (text) Preprocessor (cpp) program i Modified Source program (text) Compiler (ccl) program.s Assembly program (text) Assembler (as) program.o Relocatable object program (binary) Linker (ld) program Executable object program (binary)

Misalkan kita menulis program C dalam dua file p1.c dan p2.c. Kemudian kita mengkompilasi kodeprogramtersebutdenganmengetikkancommandline: $ gcc O2 o prog p1.c p2.c PerintahgccmerupakancompilerdefaultpadaLinuxyangmenggunakanGNUCCompiler.Secara sederhana kita juga dapat menggunakan perintah cc. Flag O2 memerintahkan compiler untuk melakukan optimasi tingkat2. Secara umum, jika tingkat optimasi meningkat maka program akan berjalan lebih cepat, tetapi hal ini beresiko meningkatkan waktu kompilasi dan meningkatkan 6

kesulitanketikamelakukandebuggingkodeprogram.Optimasitingkat2merupakankompromiyang baik antara kinerja optimasi dan kemudahan debugging. Flag o memerintahkan compiler untuk memberinamafileeksekusiyangdihasilkandengannamaprog. Perintah gcc di atas menerjemahkan kode program menjadi file eksekusi dengan melalui empat langkah. Pertama C preprocessor akan memproses semua preprocessor directive, misalnya #define,ataumemasukkanisifilefileyangtertulis#includedirectivekekodeprogram.Kedua, compiler menghasilkan kode assembly untuk setiap file, menjadi p1.s dan p2.s. Selanjutnya, assembler mengkonversi kode assembly menjadi file kode objek biner p1.o dan p2.o. Terakhir, linkermenggabungkankeduafilekodeobjekdengankodekodeyangmengimplementasikanfungsi fungsilibraryUnixstandar(mis.printf)danmenghasilkanfileeksekusi. Untukhanyamelakukanpreprocessing,kitadapatmenggunakanopsi-Epadacommandline: $ gcc E p1.c Untukmelihat kodeassemblyyang dihasilkanoleh compilerC,kitadapat menggunakanopsi-S padacommandline: $ gcc O2 S p1.c Perintah ini akan menyebabkan compiler hanya menghasilkan file assembly p1.s dan tidak melakukan langkah berikutnya. Kode assembly yang dihasilkan sesuai dengan format GAS (Gnu Assembler). Jikapadacommandlinedigunakanopsi-c,makaGCCakanmelakukancompiledanassemble kodeprogram: $ gcc O2 c p1.c Perintahiniakanmenghasilkanfilekodeobjectp1.o,dalambentukformatbinerdantidakdapat dilihatsecaralangsung. Untuk memeriksa isi dari file kode objek, terdapat suatu program yang bernama disassembler. Programtersebutdapatmelakukankonversifilekodeobjekmenjadiformatassembly.Padasistem Unix/Linux,programOBJDUMP(singkatandariOBJectDUMP)dapatdipanggilmenggunakanflag -d: $ objdump d p1.o Untuk menghasilkan kode yang dapat dieksekusi, kita harus menjalankan linker pada seluruh file kodeobjek.Programeksekusiakandihasilkandenganmenggabungkanseluruhfilekodeobjekpada commandline: $ gcc O2 o prog code.o main.c Fileprogrameksekusiprogyangdihasilkanberisitidakhanyakodeyangkitamasukkan,tetapijuga informasi yang digunakan untuk memulai dan mengakhiri program. Kita juga dapat melakukan dissasamblefileprog: $ objdump d prog Disassemblerakanmengekstrakberbagaiurutankodeyangterdapatpadafileeksekusiprog.

PERCOBAAN
Percobaan 1 : 1. BuatdirektoribarudenganNIMAnda. 2. Buatkodeprogramberikutdenganmenggunakantekseditor. #define START_VAL 0 int accum = START_VAL; int sum(int x, int y) { int t = x + y; accum += t; return t; }

Simpankodeprogramtersebutdengannamacode.cdalamdirektoriyangtelahAndabuattadi.

Percobaan 2 :
1. Preprocesscode.cdanlihathasilnya: $ gcc E code.c 2. Compilecode.cuntukmenghasilkankodeassembly: $ gcc O2 S code.c 3. Compiledanassemblecode.cuntukmenghasilkanfilekodeobjek: $ gcc O2 c code.c 4. Compile dan assemble akan menghasilkan object code. Apa sebetulnya object code ini? Bagaimanakomputermenyimpannyasebagaifile? 5. Agardapatdiperolehprogrameksekusi,diperlukanadanyafungsimainpadasalahsatufilekode objeknya.Buatlahfilebarudanberinamamain.c. 6. Compile seluruh kode untuk menghasilkan program eksekusi. Beri nama program eksekusi tersebutprog. $ gcc O2 o prog code.c main.c 7. Bagaimana caranya agar pada main.c variabel accum dan fungsi sum() dapat digunakan? Beripenjelasan! 8. Bukafilecode.sdancode.odengantekseditor.Berikomentar.

Percobaan3: 1. Lakukandisassemblerpadafilekodeobjek,code.o. $ objdump d code.o Apafungsiopsidpadacommandlinedisassembler? 2. Lakukandisassemblerpadafileprogrameksekusi,prog. $ objdump d prog 3. Bandingkanhasildisassemblerfilekodeobjectdanfileprog. Percobaan4: 1. Lakukankompilasi(sepertipercobaan2)dandisassembler(sepertipercobaan3)dengantingkat optimasiyangberbeda,yaitudenganopsiO1. 2. Bandingkan kode assembler yang dihasilkan antara tingkat optimasi O1 dengan tingkat optimasiO2sepertiyangdilakukanpadapercobaan2dan3. 3. Bagaimanadengan-O3dan-Os? 4. Bagaimanapengaruhtingkatoptimasiyangberbedaterhadapsizedanspeed(terutamaantaraO2dan-O3)?

Percobaan 5 : 1. Buatkodeprogramberikutdenganmenggunakantekseditor.
#include "text.h"

void main() { test(); }

Simpankodeprogramtersebutdengannamamain_text.cdalamdirektoriyangtelahAnda buattadi.

2. Buatkodeprogramberikutdenganmenggunakantekseditor.
#include <stdio.h> #include "text.h"

void test() { printf("Arsitektur Komputer I !\n"); } Simpan kode program tersebut dengan nama text.c dalam direktori yang telah Anda buat tadi.

3. Buatkodeprogramberikutdenganmenggunakantekseditor.
#ifndef TES_H #define TES_H 100

void test();

#endif Simpan kode program tersebut dengan nama text.h dalam direktori yang telah Anda buat tadi.

4. Buatmakefileberikutdenganmenggunakantekseditor.
all: coba

coba: main2.o coba.o gcc main2.o coba.o -o coba

main_text.o: main_text.c gcc -c main_text.c

text.o: text.c 10

gcc -c text.c

Simpan kode program tersebut dengan nama makefile dalam direktori yang telah Anda buat tadi.

5. Jalankan perintah make pada command prompt (NB: Atur terlebih dahulu working direktori
AndapadadirektoriyangAndabuattadi). 6. Perhatikan!Apayangterjadi?Berikomentar. 7. Sekarangeditkodeprogramtext.cyangtelahAndabuattadimenjadi: #include <stdio.h> #include "text.h"

void test() { printf("TES_H = %d\n",TES_H); }

8. Ulangilangkah5dan6.

TUGAS
Buatprogramfibonaccisederhana,yaituprogramyangakanmengeluarkanderetsepertiberikutini 1,1,2,3,5,8,13, Jumlahderetdiinputkanolehusermelaluikeyboard.Misaln=4akankeluarderet1,1,2,3.Program terdiri dari dua file C yaitu fibo.c dan inputn.c. inputn.c akan mengatur masalah input n yang dimasukkan dan fibo.c akan menghitung nilai berdasarkan input n. buatlah makefile yang akan mengkompilasiprogramini. LampirkansemuakodeyangdibuatpadaLampiranLaporan.

11

PRAKTIKUM ARSITEKTUR KOMPUTER MODUL 2 REPRESENTASI DAN MANIPULASI LEVEL BIT

TUJUAN
Memahamirepresentasiinformasipadalevelbit Melatihmelakukanmanipulasiinformasipadalevelbit

ALAT PERCOBAAN
PersonalComputerPC SoftwarecompilerCmisalnyaMinGWatauGCC

DASAR TEORI
Bahasa pemrograman C mendukung operasi Boolean level bit. Simbol yang biasa digunakan untuk melakukan operasi Boolean pada C adalah : | untuk OR, & untuk AND, ~ untuk NOT, dan ^ untuk EXCLUSIVEOR.Operasioperasiinidapatdilakukanpadaberbagaitipedata,sepertichar,int,short, longatauunsigned. Pada operasi logika, C juga mendukung dengan simbol : || untuk operasi logika OR, && untuk operasi logika AND, dan ! untuk operasi logika NOT. Operasi ini mudah tertukar dengan operasi Boolean level bit, tetapi sebenarnya kedua operasi ini sangat berbeda. Pada operasi logika, setiap argumenyangbukan nolmerepresentasikanTRUE,sementaraargumennol(0)merepresentasikan FALSE.Fungsilogikamengembalikannilai1dan0,yangmengindikasikanTRUEdanFALSE. Selain operasi Boolean dan operasi logika, terdapat juga operasi shift. C dapat melakukan operasi shift pada level bit ke kiri dan ke kanan. Pada umumnya, seluruh mesin dapat mendukung dua bentukoperasirightshift:logicaldanarithmetic.Logicalrightshiftmengisisisipalingkiridenganbit 0, sementara arithmetic right shift mengisi sisi paling kiri dengan bit tanda yang direpresentasikan padaMSB.

PERCOBAAN
Pada percobaan ini anda diminta untuk membuat 10 buah fungsi yang berhubungan dengan representasi dan manipulasi informasi pada level bit. Setiap fungsi harus dilengkapi dengan fungsi maindandikompilasihinggadiperolehfileeksekusinya.Penilaiandilakukanberdasarkankebenaran dariprogramsertaefisiensipenggunaankode. Persiapanlingkungankerja: Pindahkedirektorikerjaanda(namadirektorisamadenganNIManda).Simpanseluruhprogram andapadadirektoritersebut. 12

Fungsi1: bitXor(x,y) Buatfungsiyangmemilikiperilakuserupadenganoperasi^. Operatoryangbolehdigunakanhanya&dan~. Contoh:bitXor(4,5) = 1 Prototypefungsi:int bitXor(intx, int y) Fungsi2:oddBits(void) FungsievenBitsmemberikannilaireturnsatuword,dimanaseluruhbitganjildisetmenjadi1. Setiapbitpadasatuworddiberinomordari0(LSB)hingga31(MSB). Prototypefungsi:int oddBits(void) Fungsi3:getByte(x,n) FungsigetBytemengekstrakbytendariworddatax.Urutanbytedalamworddiberinomordari0 (LSB)hingga3(MSB). Contoh:getByte(0x12345678,1) = 0x56 Prototypefungsi:int getByte(int x, int n) Fungsi4:bitMask(highbit,lowbit) FungsibitMaskmenghasilkansuatumaskdimanaseluruhbitantarahighbitdanlowbitdiset menjadi1,danbitsisanyadisetmenjadi0. Asumsi0 <= lowbit <= 31dan0 <= highbit <= 31. Jikalowbit>highbit,maskseluruhnya0. Contoh: bitMask(5,3) = 0x38 Prototypefungsi:int bitMask(int highbit, int lowbit) Fungsi5:reverseBytes(x) FungsireverseBytesmembalikkanurutanbytedariinputworddenganmenukarbyte0dengan byte3,byte1denganbyte2.Urutanbytepadawordberurutandari0(LSB)hingga3(MSB). Contoh:reverseBytes(0x01020304) = 0x04030201

13

Prototypefungsi:int reverseBytes(int x) Fungsi6:tmax(void) Fungsitmaxmengembalikannilaitwoscomplementintegerterbesar. Prototypefungsi:int tmax(void) Fungsi7:minBytes(x) Fungsi minBytes menghitung nilai dari byte data pertama dikurangi byte data kedua. Sistem bilangan negaif yang digunakan adalah twos complement. Tidak boleh menggunakan operator pengurangan(),hanyabolehmenggunakanpenambahan(+)daninvers(~). Contoh:minBytes(0x15,0x07) = 0x0E Prototypefungsi:int minBytes(int x, int y) Fungsi8:shiftRegister(x) Fungsiuntukmemasukkandataberdasarkanfungsishiftregisterpadasistemdigital.Asunsijumlah bit adalah 32 bit, dan setiap nilai yang dimasukkan adalah 5 bit. Nilai awal register adalah 0x00000000. Contoh: shiftRegister(0x04)= 0x00000004 shiftRegister(0x13)= 0x00000093 (dlm biner 0x...0000000100) (dlm biner 0x...0010010011)

ket:inputsebelumnyaberpengaruhpadanilaisekarang. Prototypefungsi:int shiftRegister (int x) TUGAS

Buatlah sebuah program enkripsi sederhana yang berfungsi untuk menyamarkan 9 digit angka. Enkripsi yang akan dibuat adalah dengan melakukan operasi XOR setiap 8 bit dari 32 bit input dengan sebuah angka desimal 8 bit. Contoh : Input angka 123456789 (00000111 01011011 11001101 00010101), angka desimal untuk enkripsi 85. Maka output hasil enkripsi adalah 1376688192 (01010010 00001110 10011000 01000000). Input 9 digit angka dan angka desimal untuk mengenkripsi merupakan input keyboard. Buat juga program untuk dekripsinya! Buatlahmakefileyangakanmengkompilasiprogramini.

14

PRAKTIKUM SISTEM KOMPUTER MODUL 3 POINTER DAN ARRAY

TUJUAN
Memahamikonseparray,pointerdanalokasimemori MelatihpenggunaanarraydanpointerdalamCdanassembler

ALAT PERCOBAAN
PersonalComputerPC SoftwarecompilerCmisalnyaMinGWatauGCC

DASAR TEORI
Array adalah kumpulan lokasi penyimpanan data, setiap data menyimpan tipe data yang sama. Setiaplokasipenyimpanandisebutelemenarray Anda tahu bahwa semua bahasa pemrograman tingkat tinggi menggunakan variabel. Sedangkan pada bahasa pemrograman tingkat rendah variabel didefinisikan dengan cara yang lebih rumit. Di sinilahsalahsatukelebihanCditunjukkan,dimanaiadapatmenjembataniantarabahasakelastinggi (unggul dengan kemudahan karena konsepnya manusiawi) dengan bahasa tingkat rendah (powerfull, karena akses maksimal terhadap hardware). Dalam C, programmer memiliki akses terhadap memory secara langsung dengan menggunakan p o i n t e r . Untuk memahami konsep pointer, anda perlu mempelajari konsep pengalamatan mempory. Definisi pointer adalah variabel yangmenyimpanalamatmemory.

PERCOBAAN
Percobaan1: 9.
void coba(int* x, int* y, int* z) { int a = *x; int b = *y; int c = *z; int d = a + b; *y = d ;

Masukkan kode program berikut dengan menggunakan teks editor. Simpan kode program tersebutdengannamacoba.c

15

*z = b ; *x = c ; }

10. 11. Kemudiankompilasiprogramtersebutagardidapatcoba.s,padafilecoba.sterdapatangka angkayangmenunjukkanpenggunaanmemory,apaartiangkaangkatersebut. pada file coba.c ganti keyword int dengan double, kemudian kompilasi file coba.c yang sudah diubah, lihat kode assembler yang dihasilkan, apakah berbeda dengan yang sebelumnya? Mengapa? seperti sebelumnya pada kode assembler yang dihasilkan akan munculangkaangka,apaartiangkaangkainidalampenggunaanmemory?

Percobaan2: Padapercobaaniniandadimintauntukmembuatbeberapafungsiyangberkaitandenganarraydan pointer. Berikan juga penjelasan cara kerja programnya di laporan, terutama yang berhubungan denganarraydanpointer. Fungsi1: Buat fungsi yang dapat membaca beberapa karakter dalam array (1 elemen array terdapat 1 karakter)danmenghasilkanoutputdalamsusunanyangterbalik. Contoh:HELLOmenjadiOLLEH Fungsi2: Buatfungsiyangdapatmelakukanpenyimpanansebuahlist(Nama)dalamtwodimensionalarray ofcharuntukmenampilkannama. Contoh:Bob Fungsi3: BuatfungsisepertipadaFungsi2,namundenganmenggunakanarrayofpointersyangmenunjuk padapenyimpanan(Nama).JelaskanperbedaanantaraFungsi3denganFungsi2. Alice Jude Newton

16

Fungsi4: Buat fungsi yang dapat melakukan perkalian pada dua matriks. Keluaran dari fungsi merupakan matrikshasilperkaliantersebut.Dalammelakukanoperasiperkalianmatriksgunakanprosesloop Contoh:mulMatriks(intA[m][n],intB[n][o])=C[m][o]=A[m][n]*B[n][o] Catatan: Pada fungsi di atas, anda harus dapat membuat agar fungsi mengoutput sebuah matriks. Ada beberapa cara untuk melakukan ini, misalnya cara paling sederhana adalah membuat matriks hasilnya sebagai parameter fungsi dan diubahubah nilainya di dalam fungsi (misal C adalah outputnya):
void addMatriks(int A[m][n], int B[m][n], int C[m][n]);

Tetapi prototype ini memunculkan pertanyaan mengenai kemungkinan implementasi dan cara pemakaianfungsinya:apakahdarifungsiyangmemanggilmatriksChanyamerupakanpointerdan akandialokasikannilainyadidalamfungsi,ataumatriksCsudahterbentuksebagaiarraydantinggal diubah nilainya? Biasanya prototype seperti ini lebih cenderung ke cara yang kedua, yaitu array C sudahadadantinggaldigunakan.Yangmenjadimasalah,daridalamfungsitidakadajaminanbahwa arrayCsudahteralokasikandenganbenardanmemilikiukuranyangbenar.Apabilaternyatasalah, ada kemungkinan fungsi menulis data ke alamat memori yang sebetulnya bukan milik C (misalnya karenamelebihibatasindeksmaksimumarrayyangdialokasikanuntukC). Caralainyanglebihamanadalahmembuatfungsimereturnpointerdarimatriksyangdialokasikan secaradinamikdidalamfungsi:
int** addMatriks(int A[m][n], int B[m][n]);

Perhatikan juga bahwa anda harus dapat memberitahukan kepada fungsi berapa nilai m, n, dan o (ukuran matriks) dari fungsi yang memanggilnya. Cara paling mudah adalah membuat m, n, dan o sebagaiglobalvariable.Namun demikiancarainibiasanyatidak disukaikarenapenggunaanglobal variable membuat alur dan struktur program menjadi kurang jelas, selain membuat fungsi anda menjadikurangfleksibel.Caralainadalahmembuatm,n,danomenjadiparameterfungsi,: 17

int** mulMatriks(int m, int n, int o, int A[m][n], int B[n][o]);

tetapiinimembuatjumlahparameterfungsimenjadibanyak.Selainitu,denganmenyimpanukuran matriks pada variabel terpisah, berarti perlu dibuat dua variabel tambahan, yang secara struktural dalamprogramtidakadahubungannyadenganarraymatriksnya,untukmenyimpanukuranmatriks. Salah satu solusi adalah dengan menyimpan matriks dalam suatu struktur data, misalnya yang sederhanasaja:
struct Matriks { int jumlahBaris; int jumlahKolom; int** nilai; // ini akan menjadi dynamic array 2 dimensi };

sehinggaprototypefungsimenjadi:
struct Matriks mulMatriks(struct Matriks A, struct Matriks B);

ataujikainginlebihefisienmemori:
struct Matriks* mulMatriks(struct Matriks* pA, struct Matriks* pB);

Andabebasmemilihcaraapapunyangdisebutkandiatas,ataumenggunakancaralainjikamenurut andalebihbaik.

TUGAS
Buatlah sebuah program yang mensimulasikan operasi aritmatika pada level bit 2s complement denganmenggunakanarray.Arrayyangdigunakanterdiridari8bitsajadanhanyabolehdiisioleh angka 1 dan 0. Operasi aritmatika yang akan disimulasikan hanya penjumlahan dan pengurangan. Contoh:penjumlahanantara7dan8.Angka7dimasukkankedalamarraymenjadi00000111dan angka8menjadi00001000,makahasilpenjumlahanadalah00001111dankemudiandiubahkembali menjadiangkadesimal,yaitu15.Buatlahmakefileyangakanmengkompilasiprogramini.

18

Anda mungkin juga menyukai