PR Liburan Arsikom

PR Arsitektur Sistem Komputer selalu menggelitik otak seperti biasa. Yah, meskipun kali ini dikasih gampang dan petunjuknya udah lumayan banyak sih😀

Jadi soalnya kayak gini:

Anda baru mulai bekerja pada suatu perusahaan. Perusahaan tersebut mengimplementasikan suatu kumpulan prosedur untuk mengoperasikan data pada suatu struktur data. Pada struktur data tersebut empat buah bilangan signed 8-bit disatukan menjadi suatu word unsigned 32-bit, seperti pada gambar.


Byte-byte pada word diberi nomor dari 0 (LSB) hingga 3 (MSB). Anda diberi tugas untuk mengimplementasikan suatu fungsi menggunakan two’s complement arithmetic dan arithmetic right shift menggunakan prototype sebagai berikut:

/* Declaration of data type where 4 bytes are packed into a unsigned */
typedef unsigned packed_t;
/* Extract byte from word. Return as signed integer */
int xbyte(packed_t word, int bytenum);

Fungsi ini akan mengekstrak byte yang ditunjuk dan melakukan ektensi tanda agar menjadi integer 32-
bit. Pendahulu anda (yang telah diberhentikan karena ketidakmampuannya) menulis kode sebagai
berikut:

/* Failed attempt at xbyte */
int xbyte(packed_t word, int bytenum)
{
return (word >> (bytenum << 3)) & 0xFF;
}

PERTANYAAN:
A. Ada masalah apa dengan kode tersebut?
B. Perbaiki kode pada fungsi tersebut agar memberikan hasil yang benar. Gunakan instruksi shift
dan sebuah substraksi (pengurangan).
C. Buat program menggunakan bahasa C, untuk membuktikan jawaban anda.

PETUNJUK:
1. Empat buah data byte bertipe signed (w, x, y, z) disatukan menjadi word 32-bit unsigned
packed_t word w x y z
[3] [2] [1] [0]
2. Byte_num 0 akan mengekstrak z dari word, byte_num 1 akan mengekstrak y dari word dan
seterusnya.
3. (byte_num << 3) sama dengan (bytenum * 8)
4. Tujuannya adalah mengekstrak nilai (value)-nya, bukan deretan bit-nya. Hal ini supaya nilai x
sebelum di-packed sama dengan nilai x setelah di-packed dan diekstrak kembali dari word
5. Ingat kembali bahwa operasi right shift pada signed adalah arithmetic right shift, sedangkan pada
unsigned adalah logical right shift
6. Pertimbangkan bahwa word merupakan unsigned dan xbyte adalah signed
7. 0x0000abcd – 0x00010000 = 0x1111abcd
8. Pada mesin 32 bit 0xff = 0x000000ff

Ehem, jadi pertama kita lihat dulu bagaimana fungsi xbyte nya bekerja. Jadi xbyte menerima satu buah integer (word) yang terdiri dari 4 buah byte, kemudian digunakan untuk mengambil salah satu dari keempat byte tersebut dengan posisi byte sesuai dengan parameter bytenum. Caranya adalah dengan menggeser word ke kanan sehingga didapat byte yang diinginkan di posisi paling kanan, kemudian menghilangkan 3 byte lainnya di kiri dengan melakukan operasi binary and terhadap 0xff.

Terus apa yang salah dengan fungsi ini? Hmm perhatikan baik-baik bahwa yang diminta adalah nilai byte dalam bentuk signed, sementara apabila menggunakan fungsi ini maka hasil byte yang didapat adalah dalam bentuk unsigned karena fungsi ini akan mengembalikan nilai integer 0x000000##, sehingga informasi apakah bilangan ini negatif atau tidak yang terkandung dalam MSB tidak terbaca oleh komputer.

Karena itu, dengan mengikuti petunjuk, kita melakukan sedikit modifikasi, yaitu apabila nilai byte yang diambil memiliki MSB 1, kita melakukan operasi di petunjuk nomer 7 untuk mendapatkan nilai unsigned. Cukup modifikasi program sehingga menjadi seperti berikut:

int xbyte(packed_t word, int bytenum)
{
int result;
result = (word >> (bytenum << 3)) & 0xFF;
if(result >= 128)
result = result – 0x100; //ini yang dimodifikasi
return result;
}

Sekian, gampang kan😀

ayo #pkmceria

2 thoughts on “PR Liburan Arsikom

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s