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
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?
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.
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 main() {
int a = 1970;
int b = 1066;
int c;
c = gcd(a,b);
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
sub esp, 8
popa
mov eax, 0 ; return back to C
leave
ret
gcd:
push ebp
mov ebp, esp
while:
cmp ecx, 0
jne notzero
jmp zero
notzero:
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
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