Analisis :
Pada percobaan ini, dilakukan sebuah algoritma untuk
mengeluarkan logika fungsi XOR dengan memanfaatkan
operator bitwise AND dan operator bitwise NOT.
Keluaran dari fungsi XOR adalah :
A B A^B Analisis :
0 0 0 Dalam percobaan ini, dilakukan masking dengan aturan
0 1 1 bahwa seluruh bit mulai dari batas atas hingga batas bawah
diset menjadi 1 sedangkan bit lainnya di set menjadi 0. Dalam dicerminkan menjadi (-) dengan operasi ~y+1. Kemudian
data diatas, inputan diminta batas atas 5 dan batas bawahnya dilakukan operasi pengurangan bilangan pertama dengan
3. Dan hasil yang diperoleh dari masking adalah x38. Pada bilangan kedua dengan operator penjumlahan (+). Dan
operator fungsi pada program awalnya diset suatu bit bernilai eksekusi terakhir adalah dengan melakukan AND antara hasil
1. Kemudian dilakukan shift sebanyak 31 kali. Kemudian akan pengurangan tersebut dengan 0xFF, agar menghasilkan
melakukan shift kanan sebanyak selisih antara batas atas dan hexadesimal.
batas bawah. Dan yang terakhir adalah melakukan shift right
F. Percobaan VI :Fungsi Shift Register
sebanyak 31-batas atas pada byte.
Data :
Analisis :
Dalam percobaan ini, dilakukan fungsi shift register, atau
kata lain adalah menggeser byte. Diasumsi bahwa banyak bite
Analasis : adalah 32 dan setiap nilai yang dimasukkan secara bergantian
Pada percobaan ini, dilakukan membalik urutan dari byte. adalah 5 bit. Awal diset shift register dengan 0x00000000.
Dalam data diatas, inputan dari user adalah 0x01020304 dan Kemudian akan bergeser sesuai dengan inputan dari user.
memperoleh output nya 0x04030201. Dalam programnya Dalam data, inputan dari user adalah 0x04, dan hasil shift
dilakukan penukrana byte ke-0 dengan byte ke-3 dan byte ke-2 adalah 0x00000004. Dan yang kedua adalah inputannya 0x93
dengan byte ke-1. Hal pertama yang dieksekusi adalah dan hasil shifting adalah 0x00000093. Dari program yang
pemisahan byte dengan melakukan operasi AND antara telah dibuat, dilakukan menggeser nilai awal sebanyak 5 bit ke
bilangan denga 0xFF. Kemudian, dilakukan penukaran posisi kiri kemudian selanjutnya melakuakn operasi OR terhadap
byte ke 3 di shift menjadi byte ke 0 dan juga sebaliknya. input nilai yang diberikan.
Setelah penukaran terjadi, selanjutnya yang dieksekusi adalah
G. Percobaan VII : Program Enkripsi Sederhana
return nilai hasil penjumlahan keempat byte tersebut.
Data :
E. Percobaan V : Fungsi Pengurangan Byte
Data :
Analisis :
Analisis : Fungsi ekripsi dilakukan byte per byte. Untuk byte
Untuk percobaan ini, dilakukan operasi pengurangan byte. pertama, hasil dari variabel angka yang di XOR dengan
Pengurangan dari byte pertama dengan byte kedua. Inputan variabel desimal kemudian dilakukan operasi AND dengan
kedua byte ini merupakan inputan dari user secara langsung, 0xFF sehingga diperoleh hasil untuk byte pertama. Untuk byte
yang kemudian dieksekusi dan menghasilkan output yang kedua, terlebih dahulu dilakuakn shift right sebanyak 8
pengurangan dari kedua byte. Dari data diatas, inputan dari byte kemudian di XOR dengan variabel desimal dan
user adalah 0x15 sebagai byte pertama dan 0x07 sebagai byte selanjutnya dilakukan shift left sebanyak 8byte. Dan yang
kedua. Dan outputnya adalah 0x0E. Dan benar bahwa byte terakhir adalah dilakukan operasi AND dengan 0xFF.
0x15 – 0x07 adalah 0x0E. Hal yang dilakukan pada program Sedangkan untuk byte ketiga dan keempat, operasinya yang
adalah algoritma yang digunakan dengan melakukan shift kiri dilakukan sama dengan yang dilakukan pada byte kedua
yang kemudian dilakukan shift kanan pada bilangan yang namun dilakukan shift sebanyak 16 byte pada byte ke-tiga dan
pertama dan juga yang kedua. Lalu bilangan kedua 24 byte untuk byte ke-empat. Setelah diperoleh nilai untuk
setiap byte hasil, kemudian dilakukan return dari hasil .def _coba; .scl 2; .type
pernjumlahan byte tersebut. 32; .endef
_coba:
H. Percobaan VIII : Pointer dalam Assembly pushl %ebp
Data : movl %esp, %ebp
.file "pointerdanassembly.c" subl $32, %esp
.text movl 8(%ebp), %eax
.globl _coba movl 4(%eax), %edx
.def _coba; .scl 2; .type movl (%eax), %eax
32; .endef movl %eax, -8(%ebp)
_coba: movl %edx, -4(%ebp)
pushl %ebp movl 12(%ebp), %eax
movl %esp, %ebp movl 4(%eax), %edx
subl $16, %esp movl (%eax), %eax
movl 8(%ebp), %eax movl %eax, -16(%ebp)
movl (%eax), %eax movl %edx, -12(%ebp)
movl %eax, -4(%ebp) movl 16(%ebp), %eax
movl 12(%ebp), %eax movl 4(%eax), %edx
movl (%eax), %eax movl (%eax), %eax
movl %eax, -8(%ebp) movl %eax, -24(%ebp)
movl 16(%ebp), %eax movl %edx, -20(%ebp)
movl (%eax), %eax fldl -8(%ebp)
movl %eax, -12(%ebp) faddl -16(%ebp)
movl -8(%ebp), %eax fstpl -32(%ebp)
addl -4(%ebp), %eax movl 12(%ebp), %ecx
movl %eax, -16(%ebp) movl -32(%ebp), %eax
movl 12(%ebp), %edx movl -28(%ebp), %edx
movl -16(%ebp), %eax movl %eax, (%ecx)
movl %eax, (%edx) movl %edx, 4(%ecx)
movl 16(%ebp), %edx movl 16(%ebp), %ecx
movl -8(%ebp), %eax movl -16(%ebp), %eax
movl %eax, (%edx) movl -12(%ebp), %edx
movl 8(%ebp), %edx movl %eax, (%ecx)
movl -12(%ebp), %eax movl %edx, 4(%ecx)
movl %eax, (%edx) movl 8(%ebp), %ecx
leave movl -24(%ebp), %eax
ret movl -20(%ebp), %edx
.def ___main; .scl 2; .type movl %eax, (%ecx)
32; .endef movl %edx, 4(%ecx)
.globl _main leave
.def _main; .scl 2; .type ret
32; .endef .def ___main; .scl 2; .type
_main: 32; .endef
pushl %ebp .globl _main
movl %esp, %ebp .def _main; .scl 2; .type
subl $8, %esp 32; .endef
andl $-16, %esp _main:
movl $0, %eax pushl %ebp
movl %eax, -4(%ebp) movl %esp, %ebp
movl -4(%ebp), %eax subl $8, %esp
call __alloca andl $-16, %esp
call ___main movl $0, %eax
movl $0, %eax movl %eax, -4(%ebp)
leave movl -4(%ebp), %eax
ret call __alloca
call ___main
movl $0, %eax
.file "pointerdanassembly_double.c" leave
.text ret
.globl _coba
Analisis :
Awalnya, penggunaan memory dari kedua program adalah
memory yang sudah berbeda (alokasi). Dalam tipe data integer
terdapat sub1 $16, %esp sedangkan pada tipe data double
sub1 $32, %esp. Hal ini disebabkan karena tipe data
yang digunakan berbeda.
I. Percobaan IX : Fungsi Membalik Urutan Array
Data :
Analisis :
Dalam program yang telah dicantumkan dalam lampiran
dibawah, variabel yang digunakan adalah char
*nama[10]. Hal ini berarti dapat dideklarasi sederet array
yang berupa pointer to array of char. Optimasi memory yang
dilakukan yaitu ketika awal program hanya dialokasikan
memory yang cukup menampung char dengan maksimum 10
character. Selanjutnya setiap input nama akan dialokasikan
memory untuk menampung nama sebanyak 10 char. Hal ini
menyebabkan memory yang dialokasikan bergantung dengan
jumlah inputan.
Analisis:
L. Percobaan XII : Perkalian Matriks
Dalam program dilakukan fungsi looping untuk menerima
input dari user dengan satu persatu akan disimpan dalam array Data :
yang sudah disediakan diawal dalam penginisialisasian. Dan
kemudian dilakukan penampilan karakter tersebut secara
terbalik dengan menggunakan fungsi looping juga.
J. Percobaan X : Matriks Nama
Data :
Analisis :
Cara kerja program yaitu dengan melakukan validasi syarat
perkalian matriks. Yakni jumlah kolom matriks pertama harus
sama dengan baris matriks kedua. Apabila syarat tak terpenuhi
maka akan ditampilkan tidak terpenuhi.
Kemudian kedua matriks diisi nilainya dengan
menggunakan looping. Kemudian dilakukan perkalian matriks
dengan memanggil fungsi perkalian (mullMatriks). Pada saat
Analisis: pemanggilan fungsi, hanya dilempar vatiable nama matriks.
Dalam percobaan ini, dilakuakan membalikkan matriks dari Hal ini dilakukan karena variable nama matriks sudah
nama. Pada program dilakukan inisialisasi dari tipe data char menunjukan alamat matriks, bukan nilainya. Sehingga apabila
dengan dua dimensi char nama[5][100] . Kemudian diubah didalam funsgi maka variable local pada main akan
akses untuk pengisian dari tipe data char nama tersebut dan ikut berubah.
penulisan char dilakukan seperti menggunakan array pada
M. Percobaan XIII: Penjumlahan Biner dengan Array
umumnya.
Data :
K. Percobaan XI : Matriks Nama dengan Pointer
Data :
mengakibatkan urutan indeks harus diperhatikan juga untuk
mengakses setiap elemen array n-dimensi karena hal ini akan
berpengaruh pada performance dari program yang akan
dibuat, terutama apabila data array yang diolah cukup besar.
Operasi-operasi yang dapat dilakukan pada operasi level bit
(bitwise) dalam Bahasa C antara lain operasi AND (&),
inclusive OR ( | ), exclusive OR( ^ ), left shift (<<), right shift
(>>), dan NOT (~).
Pada system bilangan two’s complemen, operasi
pengurangan dilakukan dengan cara menjumlahkan bilamgan
Analisis : pertama dengan nilai negative dari bilangan kedua. Missal
Pada tugas 13, dibuat sebuah program yang dapat bilangan pertama adalah x, dan bilangan kedua adalah y. maka
melakukan simulasi operasi penjumlahan pada level bit operasi pengurangan yaitu x + (-y). Dengan –y diperoleh dari
dengan representasi two’s complement menggunakan array. ~y+1.
Array yang digunakan terdiri dari 8 bit dan hanya boleh diisi Pointer merupakan variabel yang menyimpan alamat
dengan angka 1 dan 0. Contohnya, misalkan penjumlahan memory. Dengan kata lain, pointer memiliki nilai alamat
antara 7 dan 8. Angka 7 akan dimasukan kedalam array memory untuk melakukan referensi terhadap suatu objek yang
berurutan untuk setiap bit menjadi 00000111 dan angka 8 akan tersimpan dalam memory komputer. Dengan menggunakan
dimasukan ke dalam array berurutan untuk setiap bit menjadi pointer, kita dapat memiliki akses terhadap memory secara
00001000. Kemudian hasil penjumlahannya adalah 00001111. langsung. Pointer juga dapat digunakan untuk menunjuk
Hasil pejumlahan ini kemudian diubah menjadi bilangan structure berdasarkan alamanya di memory. Selain itu pointer
decimal dengan membaca isi array tersebut. juga dapat di-dereferensi seperti halnya pointer lain dalam
Kode program terlampir. Proses yang digunakan pada Bahasa C.
program yaitu pertama-tama dibuat representasi bit dalam Perkalian matriks yang dipilih yaitu dengan prototype struct
array dari input yang diberikan . Hal ini dilakukan dengan Matriks mulMatriks (struct Matriks A, struct Matriks B).
memanfaatkan fungsi getBit(x,i) . Kemudian dilakukan Prototype fungsi tersebut dipilih karena matriks hasil perkalian
simulasi penjumlahan dengan aturan two’s complement. dalam fungsi sesuai dengna dimensi matriks perkalian tersebut
Selanjutnya array berisi bit hasil penjumlahan diubah kembali (array dinamis). Selain itu, jumlah parameter fungsi tidak
menjadi bilangan biner dengan menggunakan fungsi int bitDes banyak karena matriks disimpan dalam suatu struct sehingga
(int *A). Untuk prose pengurangan, hal yang sama dilakukan penggunaan memori dapat diminimalisasi.
seperti pada proses pengurangan namun dengna mengubah
bilangan biner kedua menjadi –y (= ~y+1) terlebih dahulu
kemudian dijumlahkan dengan bilangan pertama.
Analisis Pertanyaan :
Representasi tipe data float dan double dalam memory yaitu
float merupakan tipe data floating point ukuran 32 bit (4
bytes) sedangkan double merupakan tipe data floating point
ukuran 64 bit (8 bytes)
Urutan penulisan structure menentukan ukuran structure
karen pada computer 32-bit, work size sebanyak 4 byte yang
berarti memory akan diproses per-4-byte.
Perbedaan array dan structure yaitu array merupakan
kumpulan lokasi penyimpanan data yang kontinu (berurutan)
dengan tipe data yang sama. Sedangakan structure merupakan
complex data type yang mendefinisikan daftar variable yang
akan ditempatkan dalam blok memory menggunakan satu
nama.
Array statis memiliki ukuran yang tidak dapat diubah-ubah
sedangkan array dinamik memiliki ukuran yang dapat
ditentukan saat program sedang berjalan.
Setiap elemen dalam array dapat diakses menggunakan
indeks yang biasanya berupa bilangan bulat scalar atau
negative. Dalam Bahasa C, elemn pertama dalam array diberi
indeks 0. Representasi array dalam memory dengan deklarasi
int nim [8].
Array juga dapat memiliki elemen array berupa array
sehingga dapat didefinisikan array n-dimensi. Namun karena
memory computer bersifat linier, maka computer akan
menyimpan array n-dimensi dalam bentuk linier juga. Hal ini
IV. SIMPULAN
Suatu informasi disimpan dalam memory dengan
representasi sesuai dengan tipe datanya. Ukutan tipe
data berbeda-beda disebabkan adanya address offset
dalam memori sehingga digunakan padding untuk
mengisi blok kosong.
Operator bitwise dapat digunakan untuk pengolahan
data secara langsung dalam level bit pada memory.
Operasi bitwise ini relative lebih cepat dibandingkan
dengan fungsi bawaan atau fungsi buatan yang
bekerja pada high level.
Pointer digunakan sebagai penunjuk suatu alamat
dengan data tertentu. Pointer dapat digunakan sebagai
pengubah nilai suatu variable local fungsi dari fungsi
lain. Selain itu dapat digunakan pula untuk
optimalisasi penggunaan memory (karena mirip
dengan array dinamik)
Array adalah suatu data dengan tipe data tertentu
yang tersusun secara berurutan dengan alamat yang
berurutan pula. Array berdimensi satu, dua, atau
tiga.Untuk array berdimensi dua dalam bentuk table,
namun representasinya pada memory tetap sebaris
namun bersusun menurut baris dan kolom.
Structure dapat digunakan untuk membentuk suatu
tipe data bentukan agar lebih mudah digunakan
dalam program. Selain itu dalam penyusunan variable
pada structure, perlu memperhatikan ukuran dari
masing-masing variable dan urutan deklarasinya agar
diperoleh penggunaan memori yang optimal dengan
padding seminimal mungkin.
REFERENSI
[1].
Bryant, Randal, dan David O’Hallaron. Compuer
Systems : A Programmer’s Perspective 2nd Edition.
2011 Massachusetts : Person Education Inc.
Patterson,
[2].
David, dan John Hennessy. Computer Organization
and Desigh : The Hardware/Software Interface.
2012. Waltham : Elsevier Inc.
LAMPIRAN
#include<stdio.h>
//#include<stdlib.h>
#ifndef fungsiXOR
#define fungsiXOR
int bitXOR (int a, int b);
#endif
#include <stdio.h>
#include "bitXOR.h"
#include<stdio.h>
#include "getbyte.h"
#ifndef GETBYTE
#define GETBYTE
int getbyte(int angka, int ekstraksi);
#endif
#include <stdio.h>
#include <stdio.h>
#include "bitmask.h"
#ifndef BITMASK
#define BITMASK
int bitmask(int highbit, int lowbit);
#endif
#include <stdio.h>
#include <stdio.h>
#include "reversebyte.h"
#include <stdio.h>
#include "reversebyte.h"
#ifndef REVERSEBYTE
#define REVERSEBYTE
int reversebyte (int x);
#endif
#include <stdio.h>
#include "minbyte.h"
#include <stdio.h>
#include "minbyte.h"
#include <stdio.h>
#include <stdlib.h>
int global_var =0;
int main (void){
int x;
printf("Masukkan input : 0x"); scanf("%x",&x);
printf("Hasil Shift Register : 0x%.8x", shiftregister(x));
}
#include <stdio.h>
int enkripsi (int angka, int desimal);
int dekripsi (int angka, int desimal);
int main (){
int desimal, pengenkripsi, pendekripsi;
printf("Masukkan bilangan desimal yang akan di enkripsi (9digit) : "); scanf("%d",
&desimal);
printf("Masukkan bilangan desimal untuk input enkripsi :");
scanf("%d",&pengenkripsi);
pengenkripsi = pengenkripsi & 0x000000FF;
printf("\n Hasil enkripsi : %d\n",enkripsi(desimal,pengenkripsi));
#include <stdio.h>
a = *x;
b = *y;
c = *z;
d = a+b;
*y=d;
*z=b;
*x=c;
}
#include <stdio.h>
a = *x;
b = *y;
c = *z;
d = a+b;
*y=d;
*z=b;
*x=c;
}
#include <stdio.h>
int main (){
int i, length;
char teks[length+1];
printf("Masukkan panjang kata : "); scanf("%d", &length);
printf("Masukkan Kata :\n");
for (i=0;i<(length+1);i++){
scanf("%c", &teks[i]);
}
for (i=(length);i>-1;i--){
printf("%c", teks[i]);
}
return (0);
}
#include<stdio.h>
#include<stdio.h>
struct matrics{
int jb;
int jk;
int** nilai;
};
struct matrics mulmatrics(struct matrics A, struct matrics B){
int i,j,k,l;
struct matrics x;
x.jk=B.jk;
x.jb=A.jb;
x.nilai = (int**)calloc(x.jb,sizeof(int*));
for(i=0;i<x.jb;i++){
x.nilai[i]=(int*)calloc(x.jk,sizeof(int));
}
for(k=0;k<A.jk;k++){
for(i=0;i<A.jb;i++){
l=A.nilai[i][k];
for(j=0;j<x.jk;j++){
x.nilai[i][j] += l*B.nilai[k][j];
}
}
}
return x;
}
int main (void){
struct matrics A,B,C;
int i,j;
#ifndef BIT
#define BIT
int bitXOR(int a, int b);
int getbit(int x, int y);
int bitdes(int *z);
#endif
#include <stdio.h>
#include <math.h>
#include "biner.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "biner.h"
for (i=0;i<8;i++){
A[i]=getbit(x,i);
B[i]=getbit(y,i);
}
for (i=0;i<8;i++){
result[i]=bitXOR(bitXOR(A[i],B[i]),carry);
carry=((A[i]&carry)|(B[i]&carry))|(A[i]&B[i]);
}
printf("Hasil penjumlahan Biner : ");
for (i=0; i<8;i++){
printf("%d",result[i]);
}
add=bitdes(result);
printf("\nHasil Desimal : %d",add);
y=~y+1;
for(i=0;i<8;i++){
C[i]=getbit(y,i);
}
for(i=0;i<8;i++){
result[i]=bitXOR(bitXOR(A[i],C[i]),carry);
carry=((A[i]&carry)|(C[i]&carry))|(A[i]&C[i]);
}