soal uts

5

Click here to load reader

Transcript of soal uts

Page 1: soal uts

1 dari 5

Fakultas Ilmu Komputer Universitas Indonesia

Pengantar Organisasi Komputer (Kelas A) Ujian Tengah Semester

Tanggal: 9 April 2007 - Waktu: 100 menit Sifat Ujian: Open Note (1 lembar kertas a4)

1. 2. 3. 4. 5 Nama: Total: NPM: Tuliskan Nama dan NPM anda di kotak Nama dan NPM. Jawablah soal-soal berikut di kotak jawaban yang berada di bagian bawah masing-masing soal. Jika kotak jawaban tidak mencukupi, gunakan bagian kosong di belakang soal.

1. [20 point] Suatu komputer hanya memiliki 1 general purpose register 16 bits dan memori (byte addressable) sejumlah 50 bytes. Jika untuk menyimpan 1 instruksi perlu 16 bits, dapatkah komputer tersebut menyimpan dan mengeksekusi program berikut: a=bx2+cx+d ? • Jika menurut anda dapat:

a. Tuliskan program tersebut dalam bahasa assembly dan jelaskan apa yang dilakukan oleh instruksi-instruksi yang anda gunakan dalam bentuk komentar di masing-masing baris.

b. Berapa maksimal nilai a yang bisa dihitung oleh program anda? c. Berapa nilai yang ditambahkan ke PC (Program Counter) setelah 1

instruksi diambil dari memori agar PC dapat menunjuk ke instruksi berikutnya?

• Jika menurut anda tidak dapat, jelaskan alasan anda? Jawaban:

a. Load [b] ; R1=b Mul [x] ; R1=bx Mul [x] ; R1=bxx Store [a] ; a=bxx Load [c] ; R1=c Mul [x] ; R1=cx Add [d] ; R1=cx+d Add [a] ; R1=bxx+cx+d Store [a] ; a=bxx+cx+d a b c d x

b. Maksimal nilai a adalah 216 – 1 (unsigned) atau 215 – 1 (signed) c. 2

Page 2: soal uts

2 dari 5

2. [20 point] Suatu komputer hanya memiliki 2 general purpose register (R1 dan

R2) masing-masingnya 16 bits dan 1 buah stack pointer (SP) dengan memori (byte addressable) sejumlah 100 bytes. Memori tersebut dibagi menjadi 2 segmen, segmen 1 berukuran 60 bytes dan segmen 2 berukuran 40 bytes. Segmen 1, program segment, digunakan untuk menyimpan program dan diakses secara sekuensial melalui program counter (PC) dan segmen 2, data segment, digunakan untuk menyimpan data dan hanya dapat diakses dengan cara LIFO (Last In First Out) melalui stack pointer SP. Jika operasi aritmatik hanya dapat dilakukan antar register R1 dan R2, dapatkah komputer tersebut menyimpan dan mengekskusi program berikut: a=bx2+cx+d ? • Jika menurut anda dapat:

a. Tuliskan program tersebut dalam bahasa assembly dan jelaskan instruksi-instruksi yang anda gunakan dalam bentuk komentar di masing-masing baris.

b. Bagaimana program dan data disimpan di memori? Jelaskan jawaban anda dengan memberikan ilustrasi isi memori.

c. Bagaimana urutan penyimpanan data input ke memori? • Jika menurut anda tidak dapat, jelaskan alasan anda?

Jawaban:

a. dan b Pop R1 ; R1=b Pop R2 ; R2=x Mul R2 ; R1=bx Pop R2 ; R2=c Add R2 ; R1=c+bx Pop R2 ; R2=x Mul R2 ; R1=(c+bx)x Pop R2 ; R2=d Add R2 ; R1=(c+bx)x + d Push R1 ; save result

c. Read R1; read d Push R1; push d Read R1; read x Push R1; push x Mov R1,R2; copy R1 to R2 --> R2=x Read R1; read c Push R1; push c Push R2; push x Read R1; read b Push R1; push b

b x c x d

Program segment

Data segment

Page 3: soal uts

3 dari 5

3. [20 point] Ubahlah masing-masing bilangan desimal berikut menjadi 8 bit

bilangan bertanda 2’s complement. Kemudian kurangkan kedua bilangan tersebut. Tunjukkan bila terjadi overflow dengan mengisi ya/tidak di kolom overflow.

Decimal

A Decimal

B Binary A Binary B Binary

(A-B) Over-flow

100 40 01100100 00101000 00111100 tidak

-45 90 11010011 01011010 01111001 ya

95 -35 01011111 11011101 10000010 ya

-30 -75 11100010 10110101 00101101 tidak

4. [20 point] Program dalam bahasa C berikut bertujuan untuk mencari pembagi

terbesar (greatest common divisor) dua buah bilangan. Ubahlah program tersebut ke dalam program bahasa assembly intel x86 sehingga dapat diassemble menggunakan nasm. Gunakan template yang sudah disediakan.

#include "stdio.h" int gcd(int a, int b) { while (b!=0) { if (a > b) a = a-b; else b = b-a; } return a; } int main() { int a = 1970; int b = 1066; int c; c = gcd(a,b); printf("GCD is: %d¥n", c); return 1; }

Page 4: soal uts

4 dari 5

Template: %include "asm_io.inc" segment .data msg db "GCD is: ", 0 a equ 1970 b equ 1066 segment .text global asm_main _asm_main: enter 0,0 ; setup routine pusha push a ; push bilangan 1 push b ; push bilangan 2 call gcd mov ebx, eax mov eax, msg call print_string mov eax, ebx call print_int call print_nl

sub esp, 8

popa mov eax, 0 ; return back to C leave ret gcd: push ebp mov ebp, esp mov ebx, [ebp + 12] mov ecx, [ebp + 8] while: cmp ecx, 0 jne notzero jmp zero notzero: cmp ebx, ecx ja above jmp below above: sub ebx, ecx jmp while below: sub ecx, ebx jmp while zero: mov eax, ebx pop ebp ret ; jump back to caller

Page 5: soal uts

5 dari 5

5. [20 point] Lengkapilah program assembly untuk intel x86 yang memeriksa

apakah satu string merupakan palindrom. Palindrom adalah suatu string yang bacaannya sama jika dibaca dari kiri ke kanan maupun dari kanan kekiri. Contohnya “abba”, “taat” dan “sator arepo tenet opera rotas".

%include "asm_io.inc" segment .data str1 db "able was ere ere saw elba", 0 len equ $ - str1 - 1 str2 db "String is: ",0 msg1 db "This string is a palindrome", 0 msg2 db "This string is not a palindrome", 0 segment .bss segment .text global asm_main asm_main: enter 0,0 ; setup routine pusha mov eax, str2 call print_string mov eax, str1 call print_string call print_nl mov ecx, len cmp ecx, 1 je is_palindrome ; single char is always palindrome! mov edi, str1 mov esi, edi add esi, len dec esi shr ecx, 1 ; divide by 2 next_char: mov al, [edi] mov bl, [esi] cmp al, bl jne not_palindrome inc edi dec esi loop next_char is_palindrome: mov eax, msg1 call print_string call print_nl jmp stop not_palindrome: mov eax, msg2 call print_string call print_nl stop: popa mov eax, 0 ; return back to C leave ret