Anda di halaman 1dari 22

Percobaan II

Pointer,Structure,Array, dan Operasi


Dalam Level Bit
Janasde Sitompul (14S15036)
Tanggal Percobaan : 13/10/2017
[NWS3102][Praktikum Arsitektur Sistem Komputer]
[Lab Sistem Digital] TeknikElektro
Institut Teknologi Del

bertipe tertentu, arti dari data, dan cara menyimpan data


Abstrak tersebut dalam memory. Terdapat beberapa
In this practicum praktican expected to be able to understand the tipe data yang telah tersedia dalam bahasa C. Tipe data yang
representation of information in bit level which is stored in tersedia ini disebut simple data type.
memory, using operator in C language to process information
and do pointer in its processing by know also function of pointer
of course. In this lab also needs GCC and Code block compilers. Masing-masing tipe data memiliki ukuran yang berbeda-beda
So that the praktican can understand the structure and untuk disimpan di dalam memory.Dalam bahasa C, kita dapat
presentation in the C language. menggunakan sintaks sizeof untuk mengetahui besar tipe data
tersebut di dalam memory. Contohnya, untuk mengetahui
ukuran tipe data integer, kita cukup menggunakan
perintah sizeof(int) untuk mengetahui ukurannya. Kita juga
Kata Kunci : bit level, memory ,Operator in C languange, dapat melihat rentang nilai yang direpresentasikan oleh
GCC. masing-masing tipe data.

I. PENDAHULUAN

P ADAPraktikum yang berjudul Pointer, Struktur, Array,dan


Operasi dalam level bit ini praktikum diharapkan dapat
melakukan tujuan sebagai berikut:
Praktikan memahami representasi informasi dalam
level bit yang disimpan pada memory.
Praktikan mampu menggunakan operator-operator
bitwise dalam bahasa C untuk mengolah
informasi yang tersimpan dalam memory.
Praktikan memahami fungsi pointer dan
menggunakannya untuk melakukan pengolahan data
di dalam memory.
Praktikan memahami array dan representasinya
dalam bahasa C.
Praktikan memahami structure beserta Dengan adanya perbedaan ukuran masing-masing tipe data,
representasinya dalam memory dan pengolahannya diperlukan sebuah mekanisme alignment pada
dalam bahasa C. memory agar setiap data tersusun dengan baik di dalam
memory dan dapat diproses oleh mikroprosesor.
II. LANDASAN TEORETIS Dengan alignment, data-data variabel disimpan dalam lokasi
memory yang memiliki address offset yang
A. Tipe Data
berupa kelipatan dari ukuran word. Hal ini akan menambah
Tipe data merupakan representasi data yang disimpan dalam performance karena data disusun sesuai cara
memory. Tipe data menentukan operasi mikroprosesor menggunakan memory.
yang dapat dilakukan pada suatu data bertipe tertentu, rentang
nilai yang mungkin dimiliki oleh data
structure tersebut). Kita dapat menggunakan pointer untuk
melakukannya. Beberapa mesin juga
B. Operator Bitwise dalam Bahasa C membutuhkan alignment data pada memory secara spesifik
sehingga ukuran structure dapat berbeda karena
Bahasa C mendukung pengolahan informasi dalam level bit compiler secara otomatis melakukan alignment data-data pada
menggunakan operator bitwise. Berbeda structure, contohnya dengan padding.
dengan operator level byte, operator bitwise akan
mengoperasikan data untuk setiap bit. Sedangkan D. Array
operator level byte, data akan diolah dalam bentuk 1 byte (1
byte = 8 bit). Operator bitwise dapat Array merupakan kumpulan lokasi penyimpanan data yang
digunakan pada berbagai tipe data seperti char, int, short, long, kontigu (berurutan) dengan tipe data
atau unsigned. Operator-operator yang sama. Setiap lokasi penyimpanan dalam sebuah array
bitwise dalam bahasa C didefinisikan sebagai berikut. disebut elemen array. Array dialokasikan
secara sekaligus dalam memory sesuai 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
Bahasa C juga memiliki operator logika AND, inclusive OR, array dalam memory dengan deklarasi int nim[8] adalah
dan NOT. Operator ini sering tertukar sebagai berikut (asumsikan address elemen
dengan operator bitwise. Operator logika tersebut diberikan ke-0 adalah 0x4000 dengan nilai elemen pertama adalah 1,
sebagai berikut. Pada operasi logika, setiap nilai elemen kedua adalah 3, nilai elemen
argumen bukan nol merepresentasikan TRUE, sedangkan ketiga adalah 2, nilai elemen keempat adalah 1, nilai elemen
argumen nol merepresentasikan FALSE. kelima adalah 1, nilai elemen keenam
Ekspresi logika akan mengembalikan nilai 1 untuk TRUE dan adalah 0, nilai elemen ketujuh adalah 0, dan nilai elemen
nilai 0 untuk FALSE. kedelapan adalah 7).

Bahasa C mendukung deklarasi array secara statis maupun


Khusus untuk operator Right Shift, terdapat dua jenis operator secara dinamis. Array statis memiliki
Right Shift, yaitu Logical Right Shift dan ukuran yang tidak bisa diubah-ubah sedangkan array dinamis
Arithmetic Right Shift. Logical Right Shift akan mengisi bit memiliki ukuran yang dapat ditentukan
MSB dengan nilai 0 sementara Arithmetic Right saat program sedang berjalan. Array dinamis dapat
Shift akan mengisi bit MSB sesuai dengan tanda (sign) dideklarasikan dengan contoh int pusheen[].
variabel tersebut menurut aturan twos complement. Dengan demikian pusheen merupakan array yang memiliki
Untuk Left Shift, tidak ada perbedaan antara Logical Left Shift elemen bertipe integer namun dengan
dan Arithmetic Left Shift. Pada umumnya, banyak elemen yang belum didefinisikan. Untuk melakukan
seluruh mesin dapat mendukung dua jenis operator Right Shift alokasi terhadap array pusheen, kita dapat
dan Left Shift ini. menggunakan perintah malloc atau calloc dalam bahasa C.
Untuk mengubah ukuran array dinamis
C. Structure yang telah dialokasikan, kita dapat menggunakan perintah
realloc. Untuk melakukan dealokasi array
Structure (struct) merupakan complex data type yang dinamis, kita dapat menggunakan perintah free. Perhatikan
mendefinisikan daftar variabel yang akan bahwa pada beberapa kasus, perintah
ditempatkan dalam blok memory menggunakan satu nama. realloc dapat menyebabkan program tidak efisien contohnya
Dengan demikian, setiap variabel berbeda pada saat array diubah ukurannya menjadi
structure dapat diakses menggunakan sebuah single pointer lebih besar dan sistem harus melakukan pemindahan elemen-
atau dengan menggunakan nama structure itu sendiri. elemen array ke posisi memory yang baru
Pada structure, masing-masing variabel disimpan dalam blok agar perbesaran ukuran array dapat dilakukan.
memory yang kontigu yang biasanya Array juga dapat memiliki elemen array berupa array.
memiliki delimiter berupa panjang word. Kita juga dapat Dengan demikian, kita dapat mendefinisikan
menggunakan sintaks sizeof untuk memeriksa array n-dimensi. Contohnya, sebuah matriks merupakan array
deklarasi rekursif terhadap structure (sebuah structure tidak dengan dua dimensi. Array tersebut
boleh berisi structure bertipe yang sama dengan 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).

E. Pointer
Tampak tampilan tugas 1
Pointer merupakan variabel yang menyimpan alamat memory.
Dengan kata lain, pointer memiliki nilai Perlu kita ketahui bahwa XOR memiliki aturan bahwa jika
alamat memory untuk melakukan referensi terhadap suatu kedua pernyataan 0 maka hasil nya 0 dan jika salah satu nya
objek yang tersimpan dalam memory ada nilai nol dan satu maka hasil nya 1. dan juga jika sama
komputer. Dengan menggunakan pointer, kita dapat memiliki sama 1 maka hasilnya nol. Hal ini tampak pada kedua integer
akses terhadap memory secara langsung. digambar.Bahwa 4 terdiri dari 100 sedangkan 5 adalah 101
Untuk setiap tipe data T, terdapat pointer ke T. Deklarasi jika di gabungkan dengan tabel akan menghasilkan 001 yang
pointer dalam bahasa C dapat dilakukan dengan berarti 2 pangkat 0 atau dengan kata lain adalah 1.
mudah, contohnya int *ptr yang merupakan pointer yang
melakukan referensi terhadap objek bertipe
B.Tugas 2:Fungsi Ekstraksi Byte
integer.
Pada tugas 2 ini kita melakukan ektraksi sebanyak ke-n
Pointer juga dapat digunakan untuk menunjukkan structure
berdasarkan alamatnya di memory. Hal ini dari data X. Sehingga di jalankan sebagai berikut:
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. Tampak tampilan tugas 2
Dalam array, indeks biasanya didefinisikan sebagai
perhitungan matematika terhadap alamat pointer. Perlu kita ketahui bahwa pada urutan ke-0 data akan
Dengan demikian penulisan array[i] memiliki ekuivalensi menampilkan nomor paling kiri, dan dilanjutkan terus
dengan *(array + i). Perhitungan menerus hingga urutan ke-3 tetapi pada urutan ke-4 nilai yang
matematika terhadap pointer untuk mengakses setiap elemen ditampilkan adalan nila n itu sendiri . Ini terjadi akibat dari
array dapat dilakukan karena array logical right shift yang mengisi nilai 0 sedangkan Arithmetic
memiliki elemen yang tersusun secara kontigu (berurutan Right Shift yang mengisi bit MSB sesuai variabel menurut two
tanpa jeda). complements.
III.HASIL DAN ANALISIS C.Tugas 3: Fungsi Masking Byte
A. Tugas I : Fungsi XOR Ditampilkan hasil dari cmd dari tugas 3 adalah sebagai
Seperti yang kita ketahui kalau nilai algoritma XOR itu berikut:
adalah sebagai berikut:
= ~( ~ ~& & ~ &~ )
Dan jika dibuat dalam bentuk tabel akan dihasilkan :

Sehingga jika dipanggil program command prompt akan


dihasilkan pemanggilan sebagai berikut:
Seperti kita ketahui misalkan batas atas adalah 9 dan bawah ditampilkan sebagai berikut:
8 sehingga diperoleh 1001 0000 0000 0000 0000 0000 0000
1000 kemudian shift kiri 31 menjadi 0 kali sebanyak 31 kali
dan dilakukan arit >>>1 menjadi 1000 0000 0000 0000 0000
0000 0000 0000 dan terakhir dilakukan log>> 22 menjadi
0000 0000 0000 0000 0000 0010 0000 0000 yang nantinya
jika dihitung dengan hexadesimal menjadi 0x200.
Perlu kita ketahui juga pada tugas 3 bahwa ketika
dimasukkan batas bawah 9dan batas atas 8 akan
menghasilkan 0x00 ini dikarenakan nilai batas bawah harus
lebih besar dari batas atas.
Tampak tampilan Tugas 6
D.Tugas 4:Fungsi Membalik Urutan Byte
Perlu diketahui bahwa terlihat jelas ketika kita masukkan
Pada Tugas 4 ini kita disuruh untuk membalikkan urutan
nilai 0x04 maka nilai tersebut akan tergesser sebanyak 5 bit ke
byte dan urutan byte ini harus berurutan dari byte ke-0 pada
arah kiri . Begitu juga ketika kami memasukkan angka 10
LSB dan byte ke-3 pada MSB. Sehingga ditampilkan pada
kemudian 13 maka shift register menjadi 0x0000004.
cmd sebagai berikut:
G. Tugas 7: Program Enkripsi Sederhana
Pada Tugas 7 ini akan dibuat program enkripsi sederhana
yang mana program ini akan mengubah input decimal ke biner
terlebih dahulu kemudian di proses juga hasil enkripsi nya .
Yang akan ditampilkan seperti gambar berikut:

Perlu kita ketahui jika nilai 0x12345678 di balikkan maka


dia akan membalikkan nya secara berpasangan menjadi
0x78563412.

E.Tugas 5: Fungsi Pengurangan Byte


Tampak tampilan tugas 7
Pada Tugas 5 ini kita disuruh untuk mengurangi nilai byte
dan hasilnya adalah seperti berikut: Akan dijelaskan bahwa input yang dimasukkan yakni dalam
input decimal (9digit) yakni: 123456789 dan bilangan input
enkripsi nya adalah 85. Sehingga dihasilkan hasil enkripsi
sebesar 1376688192. Begini penjelasan untuk nilai input
enkripsi tadi yang bernilai 85 dapat di ubah ke biner menjadi
01010101 dan nilai 123456789 tadi juga bisa diubah ke biner
menjadi 4 bagian biner dengan ukuran 8 bit. Jadi setelah di
ubah menjadi 4 bagian dalam 8 bit tadi maka setiap bit nya di
enkripsi ke bit dari input enkripsi satu per satu dengan
ketentuan enkripsi XOR sehingga dihasilkan hasil enkripsi
dalam bentuk bit dan diubah kembali menjadi bentuk decimal.

Perlu dikertahui bahwa ketika dimasukkan byte data pertam H.Tugas 8: Pointer dalam Assembly
a kemudian diminta byte data kedua maka melalui sistem two
complement, hasil pengeluaran yakni hasil pengurangan akan Pada Tugas 8 akan ditampilkan hasil sebagai berikut:
muncul misalkan 0x15 dikurangi dengan 0x07 hasilnya adalah
0x0e.

F.Tugas 6: Fungsi Shift Register


Pada Tugas ini kita disuruh membuat fungsi dimana setiap
nilai yang dimasukkan dalam shift register secara bergantian
adalah 5 bit,dgn nilai awal 0x00000000. yang akan
Tampak tampilan tugas 10
Pada tugas ini program akan meminta input berupa panjang
karakter yang diperlukan misalkan 6 kemudian dimasukkan
berurut ke bawah dan selanjutnya diminta panjang input
karakter yang diminta dan selanjutnya karakter nya. maka
hasil outputnya akan menggabungkan karakter pertama dan di
bawahi karakter kedua.

K.Tugas 11:Matriks Nama dengan Pointer


Tampak tampilan tugas 8
Pada tugas ini program akan menampung 10 char yang
nantinya akan dialokasikan dalam memory pada tugas ini
I.Tugas 9: Fungsi Membalik Urutan Array
digunakan array statis. Berikut tampak pada cmd:
Pada tugas 9 kita disusruh membuat sebuah program yang
menerima,menyimpan, dan lalu menampilkan nya dilayar
dengan susunan terbalik. Hal ini akan tampak seperti gambar
sebagai berikut:

Perlu kita ketahui bahwa ketika kita input kata demi kata
maka kata tersebut akan tergabung menjadi sebuah nama. ini
terjadi akibat fungsi dari [n] dimana n merupakan banyak
Tampak tampilan tugas 9 memori untuk menampung kata.

Disini dari segi konsep hampir sama dengan tugas L.Tugas 12:Perkalian Matriks
sebelumnya hanya saja disini dilakukan looping sama seperti
program bubblestack. yang mana pada karakter ke 1 akan Pada tugas ini program akan melakukan perkalian dua
berpindah terus menerus dari karakter 2 hingga sampai ke matriks. Program ini juga menggunakan mulMatriks sebagai
karakter ke 5 hingga seterusnya. deklarasi nya. Berikut hasilnya:

J.Tugas 10: Matriks Nama


Pada tugas ke 10 akan ditampilkan sebagai berikut:

Program ini juga menggunakan fungsi mulMatriks yang


terdiri dari struct MatriksA, dan struct MatriksB. dengan
meminta 4 buah intenger.
III. SIMPULAN
J.Tugas 13:Penjumlahan Biner dengan Array Kesimpulan dari praktikum modul 02 ini adalah sebagai
Pada tugas 13 ini untuk membuat program yang dapat berikut:
melakukan penjumlahan bilangan biner dengan konsep Adanya offset pada address menyebabkan ukuran
representasi two complements menggunakan array yang terdiri tipe data yang berbeda -beda.
hingga 8 bit. Sebagai contoh antara 00000111 dengan Dalam melakukan representasi dalam level bit pada
00001000 maka akan menghasilkan penjumlahan sebesar memory kita dapat menggunakan pointer,array
11101010 dengan hasil desimal 87 Berikut tampak tampilan di bahkan structure untuk melakukan representasi
cmd: tersebut.

REFERENSI
Basic format for books:
[1] Electrical Engineering IT Del, 2017, Modul Praktikum Arsitektur
Sistem Komputer,Laguboti.
[2] https://id.wikipedia.org/wiki/offset_address
[3] https://id.wikipedia.org/wiki/pointer
[4] https://id.wikipedia.org/wiki/array

Lampiran
1. Source code untuk tugas I
fungsi Xor.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : fungsiXor.c
// Deskripsi : sebuah fungsi yang memiliki perilaku yang sama dengan operator XOR
#include <stdio.h>

int fungsiXor (int x, int y);

int fungsiXor (int x, int y)


{
int result;
result = ~((~(~x&y))&(~(x&~y)));
return result;
}

fungsi Xor.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : fungsiXor.h
// Deskripsi : header fungsi XOR

#ifndef FUNGSIXOR
#define FUNGSIXOR
int fungsiXor (int x, int y);
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : fungsiXor.h
// Deskripsi : main program fungsi XOR

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

int main (void)


{
//Deklarasi variabel
int a,b ;

printf("Masukan bilangan intenger pertama : ");


scanf("%d",&a);
printf("Masukan bilangan intenger kedua : ");
scanf("%d",&b);
printf("Hasil operasi XOR : %d",fungsiXor(a,b));

return 0;
}

2. Screenshot hasil tugas 2

getByte.c

// Praktikum NWS3102 Arsitektur Sistem Komputer


// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : getByte.c
// Deskripsi : Fungsi yang dapat melakukan ekstraksi byte ke-n dari suatu data X
yang memiliki

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

int getByte (int x, int n)


{
switch (n)
{
case 0 : return ((unsigned) (x & 0x000000FF)) >> 0;
case 1 : return ((unsigned) (x & 0x0000FF00)) >> 8;
case 2 : return ((unsigned) (x & 0x00FF0000)) >> 16;
case 3 : return ((unsigned) (x & 0xFF000000)) >> 24;
}

getByte.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : getByte.c
// Deskripsi : Fungsi yang dapat melakukan ekstraksi byte ke-n dari suatu data X yang
memiliki

#ifndef GETBYTE
#define GETBYTE
int getByte(int x,int n);
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : getByte.c
// Deskripsi : Fungsi yang dapat melakukan ekstraksi byte ke-n dari suatu data X yang
memiliki

#include <stdio.h>
#include "getByte.h"
int main(void)
{
int x;
int result;
int n;
printf("Masukan data yang akan di ekstraksi : 0x");
scanf ("%x",&x);
printf("Ekstraksi dilakukan pada data ke-: ");
scanf("%d",&n);
printf("Hasil ekstraksi data : 0x%x", getByte(x,n));

return 0;
}

3. Screenshot hasil tugas 3

bitMask.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : bitMask.c
// Deskripsi : fungsi yang menghasilkan suatu mask dengan aturan seluruh bit diantara
batas atas
// (highbit) dan batas bawah (lowbit) diset menjadi 1 sedangkan bit diluar highbit dan
lowbit diset menjadi 0.

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

int bitMask (int highbit, int lowbit)


{
int range = highbit-lowbit;
unsigned masking;
if (range<1)
return 0;
else
{
masking = (1<<31)>>range;

return masking>>(31-highbit);
}
}

bitMask.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : bitMask.h
// Deskripsi : main program untuk melakukan pengurangan byte

#ifndef BITMASK
#define BITMASKint bitMask(int highbit,int lowbit);
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : bitMask.h
// Deskripsi : main program untuk melakukan pengurangan byte

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

int main(void)
{
int x,y;
printf("Masukan batas atas bit yang akan dimasking : ");
scanf ("%d",&x);
printf("Masukan batas bawah bit yang akan dimasking : ");
scanf("%d",&y);

printf("Hasil masking bit : 0x%x", bitMask(x,y));

return 0;
}

4.Screenshot hasil tugas 4


reserveBytes.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : reverseBytes.c
// Deskripsi : fungsi yang dapat membalik urutan byte dari suatu data X dengan
menukar byte
//ke-0 dengan byte ke-3 dan byte ke-2 dengan byte ke-1. Urutan byte pada data
berurutan dari byte
//ke-0 pada LSB dan byte ke-3 pada MSB.

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

int reverseBytes (int x)


{
unsigned Byte3 = (x & 0xFF000000);
//byte ke-3 dari x tetap, byte lainnya diset 0
unsigned Byte2 = (x & 0x00FF0000);
//byte ke-2 dari x tetap, byte lainnya diset 0
unsigned Byte1 = (x & 0x0000FF00);
//byte ke-1 dari x tetap, byte lainnya diset 0
unsigned Byte0 = (x & 0x000000FF);
//byte ke-0 dari x tetap, byte lainnya diset 0
Byte3 = Byte3 >> 24;
//Byte3 ini menjadi byte ke-0 atau di shift kanan sebanyak 6 byte
Byte2 = Byte2 >> 8;
//Byte2 ini menjadi byte ke-1 atau di shift kanan sebanyak 2 byte
Byte1 = Byte1 << 8;
//Byte1 ini menjadi byte ke-2 atau di shift kiri sebanyak 2 byte
Byte0 = Byte0 << 24;
//Byte0 ini menjadi byte ke-3 atau di shift kiri sebanyak 6 byte
return (Byte0 + Byte1 + Byte2 + Byte3);
}

reverseBytes.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : reverseBytes.h
// Deskripsi : header sebagai penghubung fungsi (reverseBytes.c) dengan main program
(main.c)

#ifndef REVERSEBYTES
#define REVERSEBYTES
int reverseBytes(int x) ;
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : main.c
// Deskripsi : main program untuk melakukan reverse bytes

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

int main(void)
{
int x;

printf("Masukan data yang akan direverse urutannya : 0x");


scanf ("%x",&x);

printf("Hasil reverse urutan byte : 0x%x",reverseBytes(x));

return 0;
}

5. Screenshot hasil tugas 5

minBytes.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul : NA
// Percobaan : NA
// Tanggal : 10 Oktober 2016
// Kelompok : NA
// Nama (NIM) 1 : Praktikan 1
// Nama (NIM) 2 : Praktikan 2
// Nama File : minBytes.c
// Deskripsi : fungsi yang dapat menghitung hasil pengurangan antara
// byte data pertama dikurangi dengan byte data kedua.

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

int minBytes (int x, int y)


{
return ( x + (~y+1) );
}
minBytes.h
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul : NA
// Percobaan : NA
// Tanggal : 10 Oktober 2016
// Kelompok : NA
// Nama (NIM) 1 : Praktikan 1
// Nama (NIM) 2 : Praktikan 2
// Nama File : minBytes.h
// Deskripsi :header sebagai penghubung fungsi (minBytes.c) dengan
// main program (main.c)

#ifndef START VAL


#define START_VAL 0
int minBytes (int x, int y);
#endif

main.c
// Praktikum EL3111 Arsitektur Sistem Komputer
// Modul : NA
// Percobaan : NA
// Tanggal : 10 Oktober 2016
// Kelompok : NA
// Nama (NIM) 1 : Praktikan 1
// Nama (NIM) 2 : Praktikan 2
// Nama File : main.c
// Deskripsi : main program untuk melakukan pengurangan byte

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

int main ()
{
int a,b;
printf("Masukkan nilai byte pertama (a) : ");
scanf("%d", &a);
printf("Representasi a dalam heksadesimal : 0x%08X\n", a);
printf("Masukkan nilai byte kedua (b) : ");
scanf("%d", &b);
printf("Representasi b dalam heksadesimal : 0x%08X\n", b);
printf("Maka nilai a-b adalah : %d", minBytes(a,b));
minBytes(a,b));
printf("\nRepresentasi a-b dalam heksadesimal : 0x%08X\n", minBytes(a,b));
return 0;
}

6. Screenshot hasil tugas 6

shiftRegister.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : shiftRegister.c
// Deskripsi : fungsi yang merepresentasiakan rangkaian sistem digital.

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

int global_var = 0;

int shiftRegister (int x)


{
global_var = (global_var << 5) | x;
return global_var;
}

shiftRegister.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : shiftRegister.h
// Deskripsi : header sebagai penghubung fungsi.

#ifndef SHIFTREGISTER
#define SHIFTREGISTER
int shiftRegister(int x);
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : main.c
// Deskripsi : main program untuk fungsi shift register

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

int main (void)


{
int x;

printf("Masukan input : 0x");


scanf("%x",&x);

printf("Hasil shift register yaitu : 0x%.8X", shiftRegister(x));

return 0;
}

7. Screenshot hasil tugas 7

enkripsi.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : enkripsi.c
// Deskripsi : Fungsi yang merupakan tempat terjadinya proses penyamaran pengkodean
yang dilakukan pada sebuah data.

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

int enkripsi (int angka, int desimal)


{
int byte_0, byte_1, byte_2, byte_3;
byte_0 = (angka^desimal)&0x000000FF;
byte_1 = (((angka>>8)^desimal)<<8)&0x0000FF00;
byte_2 = (((angka>>16)^desimal)<<16)&0x00FF0000;
byte_3 = (((angka>>24)^desimal)<<24)&0xFF000000;

return
(byte_0+byte_1+byte_2+byte_3);
}

enkripsi.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : shiftRegister.h
// Deskripsi : Fungsi yang menghubungkan fungsi main_enkripsi.c dengan fungsi proses
pengkodean data (enkripsi.c).

#ifndef ENKRIPSI
#define ENKRIPSI
int enkripsi (int angka, int desimal);
#endif

main_enkripsi.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : main_enkripsi.c
// Deskripsi : fungsi yang didalamnya terjadi pemanggilan fungsi program main
enkripsi.c .

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

int main ()
{
int desimal, bilangan_pengenkripsi;
printf("Masukan bilangan desimal yang akan di enkripsi (9 digit) : ");
scanf("%d", &desimal);
printf("Masukan bilangan desimal untuk input enkripsi : ");
scanf("%d", &bilangan_pengenkripsi); bilangan_pengenkripsi = bilangan_pengenkripsi &
0x000000FF;
printf("\n Hasil proses enkripsi : %d\n",enkripsi(desimal,bilangan_pengenkripsi));

return 0;
}

8. Screenshot hasil tugas 8


// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : coba.c
// Deskripsi : Fungsi yang didalamnya melakukan pengamatan penggunaan pointer pada
saat menggunakan bahasa assembly.(enkripsi.c).

void coba(int* x, int* y, int* z)


{
int a;
int b;
int c;
int d;
/*double a;
double b;
double c;
double d;*/

a = *x;
b = *y;
c = *z;
d = a+b;
*y = d;
*z = b;
*x = c;

int main (void)


{
return(0);

9.Screenshot hasil tugas 9


// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : reverse.c
// Deskripsi : merupakan program yang berisikan perintah penerimaan dan penyimpanan
beberapa karakter dalam sebuah array of character sebuah program.

# include <stdio.h>

int main ()
{

char teks[100];
int i, length;

printf("Masukkan panjang kata \n");


scanf("%d",&length);
printf("Masukkan input kata \n");
for (i=0;i<(length+1);i++)
{
scanf("%c",&teks[i]);
}
printf("Karakter yang sudah dibalik urutannya : \n");
for (i=(length);i>-1;i--)
{
printf("%c",teks[i]);
}

return(0);

10.Screenshot hasil tugas 10

Arraynama.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : Arrsynama.c
// Deskripsi : program yang didalamnya terdapat proses penyimpanan karakter ke dalam
sebuah array yang dimasukkan karakter per karakter.

#include <stdio.h>
int main (void)
{

char nama[5][100];
int x,y,i,j;
char inp,junk,out;

printf("Meminta masukan 2 nam dalam karakter \n");


printf("Masukan panjang nama 1 =\n");
scanf("%d",&x);
printf("Masukan nama pertama = \n");
scanf("%c", & junk);
for (i=0;i<x;i++)
{
scanf("%c", & nama[0][i]);
scanf("%c", & junk);
}
printf("panjang nama 2 = \n");
scanf("%d",&y);
printf("Masukan nama kedua = \n");
scanf("%c", & junk);
for (i=0;i<y;i++)
{
scanf("%c", & nama[1][i]);
scanf("%c", & junk);
}
printf("Output nama \n");
for (i=0;i<x;i++)
{
out = nama[0][i];
printf("%c",out);
}

printf("\n");
for (i=0;i<y;i++)
{
out = nama[1][i];
printf("%c",out);
}

return(0);
}

\
11.Screeenshot hasil tugas 11

pointer_nama.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : pointer_nama.c
// Deskripsi : merupakan sebuah program yang didalamnya terdapat pengaplikasian array
of pointer to array of array of character.

#include<stdio.h>
#define MAX 10
#define SIZE 31

int main ()
{
char *nama[MAX],input[MAX][SIZE];
int n,x,y;
printf("Masukkan nama kata per kata (maksimal 10 enter) : \n");
for(n=0;n<MAX;n++)
{
gets(input[n]);
nama[n]=input[n];
if(!strcmp(nama[n],"exit"))
{
break;
}
}
printf("\n=======Output========\n");
for(x=0;x<n;x++)
{
printf("%s ",nama[x] );
}

return (0);
}

12. Screenshot hasil tugas 12


mulMatriks.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : mulMatriks.c
// Deskripsi : merupakan sebuah yang akan melakukan proses perkalian antara dua
inputan matriks.

#include <stdio.h>
#include <stdlib.h>
#include "mulMatriks.h"

struct Matriks
{
int jumlahBaris;
int jumlahKolom;
int** nilai;
};
struct Matriks mulMatriks (struct Matriks A, struct Matriks B)
{
int i,j,k,l;
struct Matriks x;
x.jumlahKolom = B.jumlahKolom;
x.jumlahBaris = A.jumlahBaris;

x.nilai = (int**)
calloc(x.jumlahBaris,sizeof(int*));
for (i=0;i<x.jumlahBaris;i++)
{
x.nilai[i] = (int*)
calloc(x.jumlahKolom, sizeof(int));
}
for (k=0;k<A.jumlahKolom;k++)
{
for (i=0;i<A.jumlahBaris;i++)
{
l = A.nilai[i][k];
for (j=0;j<x.jumlahKolom;j++)
{
x.nilai[i][j] +=
l*B.nilai[k][j];
}
}
}

return x;
}

mulMatriks.h
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : mulMatriks.h
// Deskripsi : merupakan sebuah fungsi yang didalamnya merupakan penghubung antara
fungsi mulmatriks.c dengan main.c.

#ifndef MULMATRIKS
#define MULMATRIKS
extern struct Matriks mulMatriks
(struct Matriks A, struct Matriks B);
#endif

main.c
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : main.c
// Deskripsi : main program untuk perkalian matrix

#include<stdio.h>
#include<stdlib.h>
#include"multmatrix.h"

struct Matrix
{
int jumlahbaris;
int jumlahkolom;
int** nilai;
};

int main(void)
{
struct Matrix A,B,C;
int i,j;
printf("Masukkan jumlah baris matrix A: ");
scanf("%d", &A.jumlahbaris);
printf("Masukkan jumlah kolom matrix A: ");
scanf("%d", &A.jumlahkolom);
A.nilai = malloc(A.jumlahbaris*sizeof(int*));
for(i=0;i<=A.jumlahbaris;i++)
{
A.nilai[i]= malloc(A.jumlahkolom*sizeof(int));
}
for(i=0;i<=A.jumlahbaris-1;i++)
{
for(j=0;j<=A.jumlahkolom-1;j++)
{
printf("Masukkan elemen ke %d, %d: ", i+1,j+1);
scanf("%d", &A.nilai[i][j]);
}
}
printf("Masukkan jumlah baris matrix B: ");
scanf("%d", &B.jumlahbaris);
printf("Masukkan jumlah kolom matrix B: ");
scanf("%d", &B.jumlahkolom);
B.nilai = malloc(A.jumlahbaris*sizeof(int*));
for(i=0;i<=B.jumlahbaris;i++)
{
B.nilai[i]= malloc(B.jumlahkolom*sizeof(int));
}
for(i=0;i<=B.jumlahbaris-1;i++)
{
for(j=0;j<=B.jumlahkolom-1;j++)
{
printf("Masukkan elemen ke %d, %d: ", i+1,j+1);
scanf("%d", &B.nilai[i][j]);
}
}

if(A.jumlahkolom = B.jumlahbaris)
{
C = multmatrix(A,B);
printf("\nHasil perkalian dua buah matrix:\n");
for(i=0;i<=A.jumlahbaris-1;i++)
{
for(j=0;j<=C.jumlahkolom-1;j++)
{
printf("%d ", C.nilai[i][j]);
}
printf("\n");
}
}
else
{
printf("Tidak memenuhi syarat perkalian matrix!");
}

return 0;
}
13. Screenshot hasil tugas 13
// Praktikum NWS3102 Arsitektur Sistem Komputer
// Modul : 2
// Percobaan : NA
// Tanggal : 13 Oktober 2017
// Kelompok : 3
// Janasde(14s15036) 1 : Praktikan 1
// Rory (14s15022) 2 : Praktikan 2
// Febrian (14s15006) :Praktikan 3
// Nama File : main.c
// Deskripsi : merupakan sebuah file yang didalamnya terdapat proses penjumlahan dan
pengurangan biner menggunakan fungsi array.
#include <stdio.h>
#include <math.h>

int fungsiXor (int x, int y)


{
int result;
result = ~((~(~x&y))&(~(x&~y)));
return result;
}

int getBit (int x, int n)


{
return ((x>>n)&1);
}

int bitDes (int *A)


{
int i;
int value = 0;
for (i=0;i<=6;i++)
{
value += A[i]*pow(2,i);
}
value -= A[7]*pow(2,7);

return value;
}

int main (void)


{
int x,y,i,temp,hasil,plus, min;
int C[8],D[8],E[8],result[8];
int carry = 0;
printf("Masukan bilangan pertama :\n");
scanf("%d",&x);
printf("Masukan bilangan kedua :\n");
scanf("%d",&y);

for (i=0;i<8;i++)
{
C[i] = getBit(x,i);
D[i] = getBit(y,i);
}
for (i=0;i<8;i++)
{
result[i] =
fungsiXor(fungsiXor(C[i],D[i]),carry);carry
=((C[i]&carry)|(D[i]&carry))|(C[i]&D[i]);
}
printf("Hasil penjumlahan biner : ");
for (i=0;i<8;i++)
{
printf("%d",result[i]);
}
plus = bitDes(result);
printf("\nHasil desimal : %d",plus);
y = ~y+1;
for (i=0;i<8;i++)
{
E[i] = getBit(y,i);
}
for (i=0;i<8;i++)
{
result[i] =
fungsiXor(fungsiXor(C[i],E[i]),carry);
carry =((C[i]&carry)|(E[i]&carry))|(C[i]&E[i]);
}
printf("\nHasil pengurangan biner: ");

for (i=0;i<8;i++)
{
printf("%d",result[i]);
}
min = bitDes(result);
printf("\nHasil desimal : %d",min);

return(0);
}

Anda mungkin juga menyukai