Anda di halaman 1dari 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

1 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: Program Data


a. dan b segment segment

Pop R1 ; R1=b
b
Pop R2 ; R2=x
x
Mul R2 ; R1=bx
c
Pop R2 ; R2=c
x
Add R2 ; R1=c+bx
d
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

2 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 Decimal Binary A Binary B Binary Over-


A B (A-B) 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;
}

3 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

4 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

5 dari 5

Anda mungkin juga menyukai