Percobaan II Pointer, Structure, Array dan Operasi Operas i dalam Level Bit Kevin Manatar Oloan Situmorang (13212029) Asisten : Michael (13211028) Tanggal Percobaan : 20/10/2014 EL3111 Praktikum Arsitektur Sistem Komputer Laboratorium Sinyal dan Sistem – Sistem – Sekolah Sekolah Teknik Elektro dan Informatika Institut Teknologi Bandung
Abstrak — Pada praktikum ini, praktikan akan memahami tentang representasi informasi dalam level bit yang disimpan di dalam memory. Kemudian praktikan juga akan menggunakan operator bitwise, menggunakan fungsi pointer, array, dan structure dalam melakukan pengolahan informasi. Kata Kunci — Memory, Memory,
pointer, array, data structure
I. PENDAHULUAN
P
STRUCTURE, ARRAY, DAN OPERASI DALAM LEVEL BIT adalah hal yang sangat mendasari proses pengolahan informasi yang tersimpan dalam memory. Pada praktikum ini, akan dipahami setiap aplikasi dari masing-masing fungsi tersebut. Adapun beberapa tujuan yang hendak dicapai adalah sebagai berikut. 1. Praktikan memahami representasi informasi dalam level bit yang disimpan pada memory. memory. 2. Praktikan mampu menggunakan operator-operator bitwise dalam bahasa C untuk mengolah informasi yang tersimpan dalam memory. memory. 3.
4.
OINTER ,
Praktikan memahami fungsi pointer dan mampu menggunakan pointer menggunakan pointer untuk melakukan pengolahan data di dalam memory. memory.
II. LANDASAN TEORETIS A. Tipe Data Tipe data merupakan representasi data yang disimpan dalam memory. memory. Tipe data menentukan operasi yang dapat dilakukan pada suatu data bertipe tertentu, rentang nilai yang mungkin dimiliki oleh data bertipe tertentu, arti dari data, dan cara menyimpan data tersebut dalam memory. memory. Terdapat beberapa tipe data yang telah tersedia dalam bahasa C. Tipe data yang tersedia ini disebut simple dat a type. type . Masing-masing tipe data memiliki ukuran yang berbeda-beda untuk disimpan di dalam memory. memory. Berikut dipaparkan beberapa tipe data serta penjelasannya:
Type
Explanation
smallest addressable unit of the machine that can contain basic character set. It is char
an integer type. Actual type can be either signed or unsigned depending on the implementation.
Praktikan memahami array beserta representasinya dalam memory dan pengolahan informasinya dalam bahasa C.
5.
Praktikan memahami structure beserta representasinya dalam memory dan pengolahannya dalam bahasa C. Kemudian untuk dapat melakukan praktikum ini, dibutuhkan beberapa perangkat praktikum sebagai berikut. 1. Komputer Desktop / Laptop dengan sistem operasi Microsoft® Windows™7/8/8.1 2. Compiler GCC GCC dalam paket program CodeBlocks untuk melakukan kompilasi program. 3. Notepad++ sebagai teks editor.
same size as char , but guaranteed to be signed char
signed.
same size as char , but guaranteed to be unsigned char
unsigned.
unsigned long lo short short int signed short signed short int
short signed signed integer type. At least in the
ng int
[−32767,+32767] range, thus range, thus at least 16 bits in size.
single precision floating-point type. Actual properties unspecified (except minimum limits), however on most
unsigned short unsigned short in
same as short , but but unsigned. unsigned.
float
t
systems this is the IEEE the IEEE 754 single precision binary floating-point for mat. This format is required by the optional Annex F "IEC 60559 floating-point
int signed int
arithmetic".
basic signed integer type. At least in the [−32767,+32767] range, thus range, thus at least 16 bits in size.
double precision floating-point type. Actual properties unspecified (except
unsigned
minimum limits), however on most same as int , but but unsigned. unsigned.
unsigned int
double
systems this is the IEEE the IEEE 754 double precision binary floating-point for mat. This format is required by the optional
long long int signed long signed long int
Annex F "IEC 60559 floating-point long signed signed integer type. At least in the
arithmetic".
[−2147483647,+2147483647] range, thus range, thus at least 32 bits in size. extended precision floating-point type. Actual properties unspecified. Unlike
unsigned long
types float and double, it can be same as long , but unsigned.
either 80-bit 80-bit floating point format, the format, the
unsigned long int long double
non-IEEE "double-double" or IEEE IEEE 754 quadruple-precision floating-point
long long long long int signed long long signed long long i nt
long long signed signed integer type. At least in
format if a higher precision format is
the
provided, otherwise it is the same
[−9223372036854775807,+9223372036
as double.
854775807] range, thus at least 64 bits in size. Specified since the C99 the C99 version of the standard.
same as long long , but unsigned. unsigned long lo
Specified since the C99 the C99 version of the
ng
standard.
Tabel II. A. 1 Beberapa tipe data dan penjelasannya [1] Untuk melihat besar tipe data dari setiap tipe data, dapat digunakan source code yang tertera pada modul. Kemudian diperoleh hasil sebagai berikut.
Khusus untuk operator Right Shift , terdapat dua jenis operator Right Shift , yaitu Logical Right Shift dan Arithmetic Right Shift . Logical Right Shift akan mengisi bit MSB dengan nilai 0 sementara Arithmetic Right Shift akan mengisi bit MSB sesuai dengan tanda ( sign) variabel tersebut menurut aturan two’s complement . Untuk Left Shift , tidak ada perbedaan antara Logical Left Shift dan Arithmetic Left Shift . Pada umumnya, seluruh mesin dapat mendukung dua jenis operator Right Shift dan Left Shift ini.
Gambar II. A. 1 Hasil Eksekusi sizeof.c (Source code tertera pada modul) Dengan adanya perbedaan ukuran masing-masing tipe data, diperlukan sebuah mekanisme alignment pada memory agar setiap data tersusun dengan baik di dalam memory dan dapat diproses oleh mikroprosesor. Dengan alignment , data-data variabel disimpan dalam lokasi memory yang memiliki address offset yang berupa kelipatan dari ukuran word . Hal ini akan menambah performance karena data disusun sesuai cara mikroprosesor menggunakan memory.
Gambar II. B. 1. Skema Left Logical Shift [3]
B. Operator Bitwise dalam Bahasa C
Gambar II. B. 2. Skema Right Logical Shift [3]
Bahasa C mendukung pengolahan informasi dalam level bit menggunakan operator bitwise. Berbeda dengan operator level byte, operator bitwise akan mengoperasikan data untuk setiap bit. Sedangkan operator level byte, data akan diolah dalam bentuk 1 byte (1 byte = 8 bit). Operator bitwise dapat digunakan pada berbagai tipe data seperti char, int, short, long, atau unsigned. Operator-operator bitwisedalam bahasa C didefinisikan sebagai berikut.
Gambar II. B. 3. Skema Left Arithmetic Shift [3]
Bahasa C juga memiliki operator logika AND, inclusive OR, dan NOT. Operator ini sering tertukar dengan operator bitwise. Operator logika tersebut diberikan sebagai berikut. Pada operasi logika, setiap argumen bukan nol merepresentasikan TRUE, sedangkan argumen nolmerepresentasikan FALSE. Ekspresi logika akan mengembalikan nilai 1 untuk TRUE dan nilai 0 untuk FALSE.
Gambar II. B. 4. Skema Right Arithmetic Shift [3]
C. Structure Structure (struct) merupakan complex data type yang mendefinisikan daftar variabel yang akan ditempatkan dalam blok memory menggunakan satu nama. Dengan demikian, setiap variabel berbeda pada structuredapat diakses menggunakan sebuah single pointer atau dengan menggunakan nama structureitu sendiri. Pada structure, masing-masing variabel disimpan dalam blok memory yang kontigu yang biasanya memiliki delimiter berupa panjang word . Kita juga dapat menggunakan sintaks sizeof untuk memeriksa ukuran structureyang kita definisikan. Perlu diingat bahwa bahasa C tidak mengizinkan kita melakukan deklarasi rekursif terhadap structure (sebuah structure tidak boleh berisi structure bertipe yang sama dengan structure tersebut). Kita dapat menggunakan pointer untuk melakukannya. Beberapa mesin juga membutuhkan alignment data pada memory secara spesifik sehingga ukuran structure dapat berbeda karena compiler secara otomatis melakukan alignment data-data pada structure, contohnya dengan padding . Untuk mengatur alignment data, perlu dimasukkan beberapa bytes (yang sebenarnya tidak digunakan) di antara akhir dari data structure terakhir dan awal dari data structure selanjutnya. Hal ini yang disebut dengan data structure padding. [2] Berikut dijelaskan bagaimana cara menghitung jumlah bytes dari padding :
bertipe integer namun dengan banyak elemen yang belum didefinisikan. Untuk melakukan alokasi terhadap array pusheen, kita dapat menggunakan perintah malloc atau calloc dalam bahasa C. Untuk mengubah ukuran array dinamis yang telah dialokasikan, kita dapat menggunakan perintah realloc. Untuk melakukan dealokasi array dinamis, kita dapat menggunakan perintah free. Perhatikan bahwa pada beberapa kasus, perintah realloc dapat menyebabkan program tidak efisien contohnya saat array diubah ukurannya menjadi lebih besar dan sistem harus melakukan pemindahan elemen-elemen array ke posisi memory yang baru agar perbesaran ukuran array dapat dilakukan. Array juga dapat memiliki elemen array berupa array. Dengan demikian, kita dapat mendefinisikan array n-dimensi. Contohnya, sebuah matriks merupakan array dengan dua dimensi. Array tersebut memiliki elemen array berupa array, contohnya int pusheen [][5] atau int pusheen[4][5]. Namun, karena memory komputer bersifat linear, komputer akan menyimpan array n-dimensi dalam bentuk linear juga. Hal ini menyebabkan kita harus memperhatikan urutan indeks untuk mengakses setiap elemen array n-dimensi karena hal ini akan berpengaruh terhadap performance dari program yang kita buat terlebih data array yang diolah cukup besar, contohnya seberapa baikkah program yang kita buat dalam memanfaatkan cache memory (cache-friendly).
padding = (align – (offset mod align)) mod align new offset = offset + padding = offset + (align – (offset mod ali n mod ali n
D. Array Array merupakan kumpulan lokasi penyimpanan data yang kontigu (berurutan) dengan tipe data yang sama. Setiap lokasi penyimpanan dalam sebuah array disebut elemen array. Array dialokasikan secara sekaligus dalam memorysesuai dengan ukurannya. Karena letak elemen yang berurutan, akses elemen array pada memory relatif lebih mudah dan cepat dibandingkan dengan struktur data Linked-List . Setiap elemen dalam array dapat diakses menggunakan indeks yang biasanya berupa bilangan bulat skalar bukan negatif. Dalam bahasa C, elemen pertama dalam array diberi indeks 0. Representasi array dalam memory dengan deklarasi int nim [8] adalah sebagai berikut (asumsikan address elemen ke-0 adalah 0x4000 dengan nilai elemen pertama adalah 1, nilai elemen kedua adalah 3, nilai elemen ketiga adalah 2, nilai elemen keempat adalah 1, nilai elemen kelima adalah 1, nilai elemen keenam adalah 0, nilai elemen ketujuh adalah 0, dan nilai elemen kedelapan adalah 7).
Bahasa C mendukung deklarasi array secara statis maupun secara dinamis. Array statis memiliki ukuran yang tidak bisa diubah-ubah sedangkan array dinamis memiliki ukuran yang dapat ditentukan saat program sedang berjalan. Array dinamis dapat dideklarasikan dengan contoh int pusheen []. Dengan demikian pusheen merupakan array yang memiliki elemen
Gambar di atas menunjukkan bagaimana penyimpanan variabel matriks 1 dimensi pada memory.
Gambar di atas menunjukkan bagaimana penyimpanan variabel matriks 2 dimensi pada memory.
E. Pointer Pointer merupakan variabel yang menyimpan alamat memory. Dengan kata lain, pointer memiliki nilai alamat memory untuk melakukan referensi terhadap suatu objek yang tersimpan dalam memory komputer. Dengan menggunakan pointer, kita dapat memiliki akses terhadap memory secara langsung. Untuk setiap tipe data T, terdapat pointer ke T. Deklarasi pointer dalam bahasa C dapat dilakukan dengan mudah, contohnya int * ptr yang merupakan pointer yang melakukan referensi terhadap objek bertipe integer . Pointer juga dapat digunakan untuk menunjukkan structure berdasarkan alamatnya di memory. Hal ini sangat berguna untuk melakukan passing structure ke atau dari sebuah fungsi hanya dengan memberikan alamat structure tersebut di memory. Pointer ini juga dapat di-dereferensi seperti halnya pointer lain dalam bahasa C, yaitu menggunakan operator dereference (*). Selain itu, juga terdapat operator yang sangat berguna yaitu struct_name -> member untuk melakukan dereferensi pointer-to-struct lalu mengakses nilai dari anggota structure tersebut. Operator tersebut memiliki ekuivalensi dengan (*struct_name).member. Sebetulnya, sebuah fungsi dapat langsung mengembalikan sebuah structure walaupun hal ini terkadang tidak efisien saat dijalankan. Dalam array, indeks biasanya didefinisikan sebagai perhitungan matematika terhadap alamat pointer . Dengan demikian penulisan array[i] memiliki ekuivalensi dengan *(array + i). Perhitungan matematika terhadap pointer untuk mengakses setiap elemen array dapat dilakukan karena array memiliki elemen yang tersusun secara kontigu (berurutan tanpa jeda).
B. Tugas 2 : Fungsi Ekstraksi Byte Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
C. Tugas 3 : Fungsi Masking Byte Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
D. Tugas 4: Fungsi Membalik Urutan Byte Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
E. Tugas 5 : Fungsi Pengurangan Byte Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
F. Tugas 6 : Fungsi Shift Register Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut. Gambar di atas menunjukkan pointer a melakukan reference terhadap memory address yang menunjukkan variable b. [4] III. HASIL DAN A NALISIS A. Tugas I : Fungsi XOR Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
G. Tugas 7 : Program Enkripsi Sederhana Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
H. Tugas 8 : Pointer dalam Assemlby Hasil yang diperoleh sebagai berikut.
.file "coba.c" .text .globl _coba .def _coba; .scl 2; .type 32; .endef _coba: pushl %ebp movl %esp, %ebp subl $16, %esp movl 8(%ebp), %eax movl (%eax), %eax movl %eax, -4(%ebp) movl 12(%ebp), %eax movl (%eax), %eax movl %eax, -8(%ebp) movl 16(%ebp), %eax movl (%eax), %eax movl %eax, -12(%ebp) movl -8(%ebp), %eax movl -4(%ebp), %edx addl %edx, %eax movl %eax, -16(%ebp) movl 12(%ebp), %eax movl -16(%ebp), %edx movl %edx, (%eax) movl 16(%ebp), %eax movl -8(%ebp), %edx movl %edx, (%eax) movl 8(%ebp), %eax movl -12(%ebp), %edx movl %edx, (%eax) leave ret .ident "GCC: (tdm-2) 4.8.1"
.file "coba02.c" .text .globl _coba .def _coba; .scl 2; .type 32; .endef _coba: pushl %ebp movl %esp, %ebp subl $32, %esp movl 8(%ebp), %eax fldl (%eax) fstpl -8(%ebp) movl 12(%ebp), %eax fldl (%eax) fstpl -16(%ebp) movl 16(%ebp), %eax fldl (%eax) fstpl -24(%ebp) fldl -8(%ebp) faddl -16(%ebp) fstpl -32(%ebp) movl 12(%ebp), %eax fldl -32(%ebp) fstpl (%eax) movl 16(%ebp), %eax fldl -16(%ebp) fstpl (%eax) movl 8(%ebp), %eax fldl -24(%ebp) fstpl (%eax) leave ret .ident "GCC: (tdm-2) 4.8.1" File coba02.s I. Tugas 9 : Fungsi Membalik Urutan Array Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
File coba.s J. Tugas 10 : Matriks Nama Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
M. Tugas 13 : Penjumlahan Biner dengan Array Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
Representasi tipe data float dalam memory digambarkan sebagai berikut.
Representasi tipe data double dalam memory digambarkan sebagai berikut.
K. Tugas 11 : Matriks Nama dengan Pointer Program berhasil dikompilasi, namun di tengah keberjalanan eksekusi main.exe, program error. L. Tugas 12 : Perkalian Matriks Hasil yang diperoleh setelah menjalan main.exe adalah sebagai berikut.
Urutan structure dapat mempengaruhi ukuran dari structure tersebut karena adanya proses alignment yang dilakukan. Salah satu penyebab bertambahnya ukuran structure karena adanya penambahan bytes untuk menjaga alignment structure, hal tersebut yang kita kenal padding. Oleh seban itu untuk mengurangi besarnya bytes padding yang muncul, data structure perlu disusun berdasarkan tipe data yang sama terlebih dahulu. Kemudian tipe data yang ukuruannya lebih kecil diletakkan di awal structure. Perbedaan antara data structure dan array adalah pada data structure, setiap variable hanya dapat diakses menggunakan sebuah single pointer atau dengan menggunakan nama structure itu sendiri. Namun untuk array, dapat diakses pada lokasi penymipanan yang berbeda. Akses elemen array pada memor y akan lebih mudah dan cepat dibandingkan dengan structure data. Cara mengakses elemen pada array harus menggunakan indeks, contoh int data[15]. Perbedaan antara array statis dan array dinamis, array statis memiliki ukuran yang tidak bisa diubah-ubah sedangkan array dinamis memiliki ukuran yang dapat ditentukan saat program sedang berjalan. Untuk array n-dimensional, alamatnya dialokasikan sesuai dengan besar dimensinya. Misal jika 2 dimensi, maka t iap array akan memiliki dua slot alamat kosong untuk diisi. Kemudian lokasi penyimpanan dari seluruh array itu akan kontigu (berurutan). Prinsip pengurangan two’s complement dapat diilustrasikan melalui contoh berikut.
Dipilih prototype yang ketiga (sesuai pada modul) dengan menjadikan matriks sebagai array dinamis. Dengan penggunaan prototype ini, pengaksesan memory lebih cache friendly.
adanya proses alignment dalam data structure. Penggunaan array lebih mudah dan cepat dibandingkan dengan penggunaan data structure. R EFERENSI
[1] http://en.wikipedia.org/wiki/C_data_types. Diakses Kamis, 23 Oktober 2014, pukul 16.50 WIB. Pointer dapat digunakan untuk mengakses alamat secara langsung. Pointer juga dapat digunakan untuk menunjukkan structure berdasarkan alamatnya di memory. Hal ini berguna untuk melakukan passing structure ke atau dari sebuah fungsi hanya dengan memberikan alamat structure tersebut di memory. Pointer juga dapat didereferensi untuk mengakses nilai dari suatu anggota structure tersebut. Bahaya yang mungkin muncul dengan adanya pointer : Bahaya yang mungkin ada dengan pointer sebagai moniker: memory leak, double delete, invalid memory access.
Bahaya yang mungkin ada dengan pointer sebagai iterator: array out of bound.
Bahaya yang mungkin ada dengan pointer sebagai abstraksi fixed memory.
[3] http://en.wikipedia.org/wiki/Bitwise_operation. Diakses Kamis, 23 Oktober 2014, pukul 17.47 WIB. [4] http://en.wikipedia.org/wiki/Pointer_(computer_programming ). Diakses Kamis, 23 Oktober 2014, pukul 18.02 WIB. [5] Hanindhito, Bagus. Modul Praktikum EL3111 Arsitektur Sistem Komputer, Sekolah Teknik Elektro dan Informatika, Bandung, 2014. [6] Bryant, Randal, dan David O’Hallaron. Computer Systems : A Programmer’s Perspective 2nd Edition. 2011. Massachusetts : Pearson Education Inc.
IV. SIMPULAN
[2] http://en.wikipedia.org/wiki/Data_structure_alignment#Data_s tructure_padding. Diakses Kamis, 23 Oktober 2014, pukul 17.01 WIB.
Informasi yang disimpan di memory dapat direpresentasikan dalam level bit. Dalam mengolah informasi pada memory, dapat digunakan operator-operator bitwise. Pointer memiliki banyak kegunaan dalam pengolahan informasi, namun memiliki banyak bahaya juga. Penggunaan data structure yang tidak terartur, akan menyebabkan semakin besar ukurannya. Hal ini disebabkan
[7] Patterson, David, dan John Hennessy. Computer Organization and Design: The Hardware/Software Interface. 2012. Waltham : Elsevier Inc.
Lampiran 1. Source code untuk tugas I :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 1 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : bitXor.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int bitXor(int x, int y); #endif File bitXor.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 1 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main_bitXor.c Deskripsi : Fungsi yang berperilaku sama dengan operator bitwise XOR
#include "bitXor.h" #include
int bitXor(int x, int y) { return (~( ~(~x&y) & ~(x&~y) )); }
File bitXor.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 1 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk memasukkan masukan dalam fungsi XOR
#include "bitXor.h" #include int main () {
int a,b; printf("Nilai a: "); scanf("%d", &a); printf("a dalam heksadesimal: 0x%08X\n",a); printf("\nNilai b : " ); scanf("%d", &b); printf("b dalam heksadesimal : 0x%08X\n",b); printf("\na XOR b adalah : %d \n" , bitXor(a,b)); printf("a XOR b dalam heksadesimal : 0x%08X\n",bitXor(a,b)); return 0; }
File main.c
2. Source code untuk tugas II :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 2 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : getByte.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int getByte (int x, int n); #endif File getByte.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 2 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : getByte.c Deskripsi : Fungsi untuk melakukan ekstraksi byte ke-n.
#include #include "getByte.h" int getByte (int x, int n) { return ((( x << ((3-n)*8)) >> 24) & 0x000000ff ); }
File getByte.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 2 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk getByte.c.
#include #include "getByte.h" int main () {
int a,b; printf("Masukkan bilangan integer : "); scanf("%d", &a); printf("Representasi bilangan tersebut dalam heksadesimal : 0x%08X\n",a); printf("\nMasukkan urutan byte yang ingin diambil (0 sampai 3) : "); scanf("%d", &b); printf("\nMaka byte yang diambil adalah : %d", getByte(a,b)); printf("\nRepresentasi byte yang diambil dalam heksadesimal : 0x%08X\n",getByte(a,b)); return 0; }
File main.c 3. Source code untuk tugas III :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 3 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : bitMask.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int bitMask (int highbit, int lowbit); #endif File bitMask.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 3 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : bitMask.c Deskripsi : Fungsi untuk menghasilkan suatu mask.
#include #include "bitMask.h" int bitMask (int highbit, int lowbit) { if (lowbit >= highbit) return 0; else return (((0xffffffff >> (31-highbit)) >> lowbit) << lowbit); }
File bitMask.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 3 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk bitMask.c.
#include #include "bitMask.h" int main () {
int a,b; printf("Masukkan nilai highbit (antara 0-31) : "); scanf("%d", &a); printf("Masukkan nilai lowbit (antara 0-31) : "); scanf("%d", &b); printf("\nMaka hasil bitmask adalah : %d", bitMask(a,b)); printf("\nRepresentasi bitmask dalam heksadesimal : 0x%08X\n", bitMask(a,b)); return 0; }
File main.c 4. Source code untuk tugas IV :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 4 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : reverseBytes.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int reverseBytes (int x); #endif File reverseBytes.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 4 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : reverseBytes.c Deskripsi : Fungsi untuk membalikkan urutan byte.
#include #include "getByte.h" int reverseBytes (int x) { return ( (getByte(x,0)<<24) + (getByte(x,1)<<16) + (getByte(x,2)<<8) + (getByte(x,3)) ); }
File reverseBytes.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 4 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama
#include #include "getByte.h" #include "reverseBytes.h" int main () {
int a; printf("Masukkan sebuah integer : "); scanf("%d", &a); printf("Representasi integer dalam heksadesimal : 0x%08X\n",a); printf("Maka reverseBytes dari integer tersebut adalah : %d\n" , reverseBytes(a)); printf("Representasi reverseBytes dalam heksadesimal : 0x%08X\n",reverseBytes (a)); return 0; }
File main.c Pada tugas ini juga digunakan kode getByte.h dan getByte.c yang sama seperti source code untuk tugas II. 5. Source code untuk tugas V :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 5 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : minBytes.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int minBytes (int x, int y); #endif File minBytes.h
// Praktikum EL3111 Arsitektur Sistem Komputer // Modul : 2 // Percobaan : 5 // Tanggal : 20 Oktober 2014 // Kelompok : 16 // Rombongan : A // Nama (NIM) 1 : Khairunnisa (13212028) // Nama (NIM) 2 : Kevin Situmorang (13212029) // Nama File : minBytes.c // Deskripsi : Fungsi untuk menghitung hasil pengurangan antara byte data pertama dengan kedua. #include #include "minBytes.h"
int minBytes (int x, int y) { return ( x + (~y+1) ); }
File minBytes.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 5 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk minBytes.c.
#include #include "minBytes.h" int main () {
int a,b; printf("Masukkan nilai scanf("%d", &a); printf("Representasi a printf("Masukkan nilai scanf("%d", &b); printf("Representasi b printf("Maka nilai a-b printf("\nRepresentasi return 0;
byte pertama (a) : "); dalam heksadesimal : 0x%08X\n", a); byte kedua (b) : "); dalam heksadesimal : 0x%08X\n", b); adalah : %d", minBytes(a,b)); a-b dalam heksadesimal : 0x%08X\n", minBytes(a,b));
}
File main.c 6. Source code untuk tugas VI :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 6 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : shiftRegister.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 extern int accumulation; int shiftRegister (int x); #endif File shiftRegister.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 6 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : shiftRegister.c Deskripsi : Fungsi untuk merepresentasikan shift register.
#include #include "shiftRegister.h" int accumulation = 0; int shiftRegister (int x) {
accumulation = accumulation << 5; accumulation = accumulation + (x & 31); return accumulation; }
File shiftRegister.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 6 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk shiftRegister.c.
#include #include "shiftRegister.h" int main () {
int a,b,c; printf("Isi register saat ini : 0x%08X\n \n", accumulation); printf("Masukkan nilai pertama yang akan dimasukkan ke register (maksimum 5 bit) : "); scanf("%d", &a); printf("Representasi nilai pertama dalam heksadesimal : 0x%08X\n",a); printf("Maka isi register saat ini adalah : 0x%08X\n", shiftRegister(a)); printf("\n\nMasukkan nilai kedua yang akan dimasukkan ke register (maksimum 5 bit) : "); scanf("%d", &b); printf("Representasi nilai kedua dalam heksadesimal : 0x%08X\n",b); printf("Maka isi register saat ini adalah : 0x%08X\n", shiftRegister(b)); printf("\n\nMasukkan nilai ketiga yang akan dimasukkan ke register (maksimum 5 bit) : "); scanf("%d", &c); printf("Representasi nilai ketiga dalam heksadesimal : 0x%08X\n",c); printf("Maka isi register saat ini adalah : 0x%08X\n", shiftRegister(c)); return 0; }
File main.c 7. Source code untuk tugas VII :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 7 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : enkripsi.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int enkripsi (int x, int y); #endif
File enkripsi.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 7 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : enkripsi.c Deskripsi : Program enkripsi.
#include "enkripsi.h" int enkripsi (int x, int y) {
int a,b,c,d; a = bitXor ((getByte(x,3)),(y & b = bitXor ((getByte(x,2)),(y & c = bitXor ((getByte(x,1)),(y & d = bitXor ((getByte(x,0)),(y & return ( (a << 24) + (b << 16)+
255)); 255)); 255)); 255)); (c << 8) + d ); }
File enkripsi.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 7 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : dekripsi.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 int dekripsi (int x, int y); #endif
File dekripsi.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 7 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : dekripsi.c Deskripsi : Program untuk melakukan deskripsi.
#include "dekripsi.h" int dekripsi (int x, int y) { return ( enkripsi(x,y) ); }
File dekripsi.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 7 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama untuk mengambil masukan.
#include #include #include #include #include int main
"dekripsi.h" "enkripsi.h" "getByte.h" "bitXor.h" ()
{
int m,n,p; printf("Masukkan sebuah integer : "); scanf("%d", &m); printf("Masukkan kode enkripsi : "); scanf("%d", &n); p = enkripsi(m,n); printf("Maka hasil enkripsi integer tersebut adalah : %d", p); printf("\nHasil deskripsi dari enkripsi bilangan tersebut adalah : %d" , dekripsi(p,n)); return 0; }
File main.c Pada tugas ini juga digunakan kode bitXor.h dan bitXor.c yang sama seperti source code untuk tugas I. Begitu juga dengan getByte.h dan getByte.c seperti source code untuk tugas II. 8. Source code untuk tugas VIII sama seperti yang tertera pada modul praktikum. 9. Source code untuk tugas IX :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 9 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : reverseArray.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 void reverseArray (char originalstring[], char reversedstring[]); #endif File reverseArray.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 9 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : reverseArray.c Deskripsi : fungsi untuk membalikkan array.
#include #include void reverseArray (char originalstring[], char reversedstring[]) {
int i = 0, j; int length; length = strlen(originalstring ); for (j = length - 1; j >= 0; j--) {
reversedstring [i] = originalstring[j]; i += 1; }
reversedstring [i] = '\0'; for (j = 0; j < length; j++) {
printf ("%c", reversedstring[j]); } }
File reverseArray.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 9 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama
#include #include #define MAX 100 int main () {
char originalstring[MAX]; char reversedstring[MAX]; puts ("Masukkan kata :"); fgets (originalstring , sizeof(originalstring ), stdin); originalstring [strlen(originalstring ) - 1] = '\0'; while (originalstring [0] == '\0') {
puts ("Masukkan kata :"); fgets (originalstring , sizeof(originalstring ), stdin); originalstring [strlen(originalstring ) - 1] = '\0'; }
reverseArray (originalstring , reversedstring); return 0; }
File main.c 10. Source code untuk tugas X :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 10 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : matriksNama.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 void matriksNama (char data[100][100], int jumlah_data); #endif File matriksNama.h
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 10 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : matriksNama.c Deskripsi : Fungsi input matriks nama sekaligus menampilkan isi data
#include void matriksNama (char data[100][100], int jumlah_data) {
int panjang_data[100]; int i, j; char temp; for (j=0;j
File matriksNama.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 10 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama
#include #include "matriksNama.h" int main () {
char nama[100][100]; int banyak_data; printf("Jumlah data= "); scanf ("%d", &banyak_data ); matriksNama (nama, banyak_data); return 0; }
File main.c 11. Source code untuk tugas XI hampir sama dengan tugas X, perbedaan terdapat pada struktur data char data [100][100] menjadi char **data[100]. 12. Source code untuk tugas XII :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 12 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama
#include struct Matriks {
int jumlahBaris; int jumlahKolom; int** nilai; };
struct Matriks mulMatriks(struct Matriks A, struct Matriks B) {
int i,j,k,r,sum; struct Matriks C; C.jumlahBaris =A.jumlahBaris ; C.jumlahKolom =B.jumlahKolom ; C.nilai=(int**) malloc(C.jumlahBaris *sizeof(int*)); for(i=0;i
int main(void) {
int i,j; struct Matriks A,B,C; do{
printf("Baris matriks A : ");scanf("%i",&A.jumlahBaris ); printf("Kolom matriks A : ");scanf("%i",&A.jumlahKolom ); printf("Baris matriks B : ");scanf("%i",&B.jumlahBaris ); printf("Kolom matriks B : ");scanf("%i",&B.jumlahKolom ); } while(A.jumlahKolom!=B.jumlahBaris ); //alokasi memori untuk matriks A A.nilai=(int**) malloc(A.jumlahBaris *A.jumlahKolom*sizeof(int*)); for(i=0;i
printf("\nMatriks B :\n"); for (i=0;i
File main.c 13. Source code untuk tugas XIII :
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 13 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : sumofbiner.h Deskripsi : File header
#ifndef START_VAL #define START_VAL 0 void sumofbiner (int bil1, int bil2); #endif File sumofbiner.h
// // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 13 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : sumofbiner.c
// Deskripsi
: Fungsi menjumlahkan dua bilangan two’s complement
#include #include "sumofbiner.h" void sumofbiner (int bil1, int bil2) {
int a[8],b[8],hasil[8],sum=0,min=0; int i, carry = 0; for(i=0;i <7;i++) { a[i]=(bil1>> i)&1; b[i]=(bil2>> i)&1; hasil[i]=(carry+a[i]+b[i])&1; carry=((carry+a[i]+b[i])>> 1)&1; sum|=(hasil[i]<
a[7]=(bil1>> 31)&1; b[7]=(bil2>> 31)&1; hasil[7]=(carry+a[7]+b[7])&1; sum|=(hasil[7]<<7); if(hasil[7]==1) { sum|=0xFFFFFF00; }
carry=0; for(i=0;i <8;i++) { hasil[i]=(a[i]-carry-b[i])&1; carry=((a[i]-b[i]-carry)>> 1)&1; min|=(hasil[i]<
printf("Jumlah dua bilangan desimal di atas : %d\n",sum); }
File sumofbiner.c
// // // // // // // // // //
Praktikum EL3111 Arsitektur Sistem Komputer Modul : 2 Percobaan : 13 Tanggal : 20 Oktober 2014 Kelompok : 16 Rombongan : A Nama (NIM) 1 : Khairunnisa (13212028) Nama (NIM) 2 : Kevin Situmorang (13212029) Nama File : main.c Deskripsi : Program utama
#include #include "sumofbiner.h" int main () {
int des_1, des_2; printf("Masukkan bilangan desimal pertama:"); scanf("%d",&des_1); printf("Masukkan bilangan desimal kedua:"); scanf("%d",&des_2); sumofbiner(des_1,des_2); return 0; }
File main.c