NAMA:Alfanata Tambunan
NIM : 14S17054
Kelas:13TE2
representasi dari source register pertama. rt:
1. Jelaskan bagaimana MIPS32® melakukan representasi dari source register kedua, sering
eksekusi sebuah instruksi dan jelaskan format tiga disebut register target. rd: representasi dari
instruksi dasar yang dapat dieksekusi oleh MIPS32® destination register. Shift/Shamt: representasi dari
beserta penjelasannya untuk setiap bit instruksi! jumlah penggeseran/perputaran bit dari rs. Funct:
Berikan pula masing-masing lima contoh representasi dari operasi yang spesifik dari opcode,
penggunaan instruksi untuk masing-masing format karena beberapa operasi pada R-Type memiliki nilai
instruksi dasar! Ada lima tahap yang dilakukan opcode yang serupa.
MIPS32® ketika melakukan eksekusi: add $t1, $t2, $t3 # $t1 = $t2 + $t3
• Instruction Fetch (IF): Mengatur aliran instruksi sub $t1, $t2, $t3 # $t1 = $t2 + $t3
yang akan diolah pada tahap berikutnya. Instruksi and $t1, $t2, $t3 # $t1 = $t2 & $t3
dari memory disimpan dan dipisah menjadi dua or $t1, $t2, $t3 # $t1 = $t2 | $t3
bagian: instruction memory yang berfungsi slt $t1, $t2, $t3 # jika ($t2 < $t3), maka $t1
menyimpan instruksi-instruksi yang akan dieksekusi = 1; else $t1 = 0
dan data memory yang berfungsi untuk menyimpan • I-Type (untuk immediate) I-Type digunakan jika
data untuk menghindari structural hazard. instruksi harus mengoperasikan nilai immediate
• Instruction Decode (ID): Memecah instruksi dan nilai pada register. Immediate adalah data
sesuai format instruksi yang digunakan (R-, I-, atau yang bukan disimpan di lokasi memori maupun
J-type) register, melainkan disimpan sebagai bagian dari
• Execute / Address Calculation (EX): instruksi itu sendiri. Format: OP rt, IMM(rs) / OP
Mengoperasikan aritmatika dan logika pada ALU. rt, rs, imm / OP rt, imm / OP rs, rt, label (khusus
Terdapat tempat untuk meneruskan alamat register beq)
kembali ke tahap ID sebagai deteksi hazard.
• Data Memory (MEM): Menyimpan data dan/atau
diambil dari data memory. Data memory dapat
disimpan atau dibaca jika ada sinyal MemRead Opcode: representasi dari operasi sebuah
dan/atau MemWrite yang sesuai instruksi, nilai ini yang menentukan format dari
• Write Back (WB): Mengalirkan data dari data instruksi. rs: representasi dari source register
memory atau hasil perhitungan Arithmetic and pertama. rt: representasi dari source register
Logical Unit (ALU) ke register untuk dapat kedua, sering disebut register target. IMM:
menjalankan instruksi selanjutnya. Ada tiga format Menentukan nilai konstanta yang menunjukkan
instruksi dasar pada MIPS32®: operand yang konstan atau address.
• R-Type atau Arithmetic-Logical Instructions (untuk Contoh:
register) R-Type digunakan jika seluruh data yang addi $t1, $t2, 100 # $t1 = $t2 + 100
digunakan oleh instruksi disimpan di dalam register. beq $t1, $t2, 25 # Jika ($t1 == $t2) pergi ke PC
R-Type membaca kedua register, mengoperasikan + 4 + 100 lbu $t1,20($t2)
operasi ALU terhadap isi register, lalu menuliskan lui $t1,100 # $t1 = 100 * 216
hasilnya di register. Format: OP rd, rs, rt sw $t1,20($t2) # Memory[$t2 + 20] = $t1
• J-Type R-Type digunakan jika operasi jump ingin
digunakan. Format: OP label
Opcode: representasi dari operasi sebuah instruksi,
nilai ini yang menentukan format dari instruksi. rs:
Opcode: representasi dari operasi sebuah instruksi pout: .asciiz " Pounds\n"
ozout: .asciiz " Ounces\n"
jump yang spesifik. Address: 26 bit address dari .text
alamat tujuan pada instruction memory yang akan .globl main
main: addu $s0, $ra, $0 # simpan $31
dieksekusi setelahnya. dalam $16
Contoh (hanya ada dua): li $v0,4 # tampilkan perintah
la $a0,prompt
j 2500 # pergi ke lokasi 10000 (langsung ke syscall
address) li $v0,5 # baca input pengguna
syscall
jal 2500 # pergi ke lokasi 10000 (untuk li $t1,16 # 1 pound = 16 ounce
pemanggilan prosedur) divu $v0,$t1
mflo $a0
2. li $v0,1 T # tampilkan nilai pound
entukan nilai opcode dan funct dalam biner, tipe syscall
li $v0,4 # tampilkan str "pounds"
instruksi, dan arti instruksi dari instruksiinstruksi di la $a0,pout
bawah ini. syscall
mfhi $a0 # tampilkan nilai ounce
li $v0,1
syscall
li $v0,4 # tampilkan str "ounces"
la $a0,ozout
syscall
addu $ra, $0, $s0 jr $ra
# akhir dari program
a. Simulasikan program tersebut dalam PCSpim
lalu screenshot hasil yang ditampilkan dalam
console!.Perhatikan bahwa PCSpim perlu
dikonfigurasi untuk melakukan simulasi
menggunakan pseudoinstruction dengan
memilih menu Simulator lalu submenu
settings. Aktifkan allow pseudo instruction lalu
nonaktifkan pilihan bare machine.
b. Konversi kode bahasa assembly tersebut ke
dalam bahasa C dan lakukan kompilasi
[Link] program dalam bahasa assembly untuk menggunakan GCC untuk kemudian dijalankan
dieksekusi dalam MIPS32® dalam komputer Anda. Screenshot hasil yang
Program ini meminta pengguna untuk memasukkan ditampilkan dalam console!
nilai dalam ounce lalu melakukan konversi dari
#include <stdio.h>
ounce ke pound dan ounce dan menampilkan hasil #include <stdlib.h>
konversinya. Gunakan teks editor Notepad++ #include <math.h>
untuk menyalin program ini dan menyimpannya void main() {
int massa, pounds, ounces;
dalam file contoh_ounces.asm printf("Masukkan massa dalam
# contoh_ounces.asm ounces: ");
# Konversi dari ounces ke pounds dan scanf("%d", &massa);
ounce. pounds = massa/16;
.data ounces = massa%16;
prompt: .asciiz "Masukkan massa
printf("%d Pounds\n", pounds);
dalam ounces: "
printf("%d Ounces\n", ounces); call _printf
} movl 24(%esp), %eax
movl %eax, 4(%esp)
movl $LC3, (%esp)
call _printf
leave
ret
.ident "GCC: (tdm-1) 4.9.2"
.def _printf; .scl 2; .type32;
[Link] bahasa assembly program untuk .endef
dieksekusi pada mikroprosesor MIPS32® dan .def _scanf; .scl 2; .type32;
.endef
bahasa assembly hasil kompilasi oleh GCC untuk
dieksekusi pada mikroprosesor Intel®x86.
Bahasa assembly MIPS32® disebut juga
.file"contoh_ounces.c" bahasa assembly RISC (Reduced Instruction
.def ___main; .scl 2; .type Set Computer), berarti
32; .endef
set instruksinya memang terdiri dari
.section .rdata,"dr"
LC0: serangkaian instruksi yang sudah
.ascii "Masukkan massa dalam disederhanakan (reduced instruction
ounces: \0"
LC1: set) dan seluruh instruksi akan
.ascii "%d\0" diimplementasikan pada hardware.
LC2: Sedangkan bahasa assembly Intel®x86 (atau
.ascii "%d Pounds\12\0"
LC3: x86 lainnya) disebut juga assembly CISC
.ascii "%d Ounces\12\0" (Complex Instruction
.text Set Computer), berarti set instruksinya
.globl _main
.def _main; .scl 2; .type memang terdiri dari serangkaian instruksi dan
32; .endef memiliki karakteristik
_main:
pushl%ebp
khusus yang tidak diimplementasikan pada
movl %esp, %ebp hardware sehingga instruksinya lebih panjang
andl $-16, %esp
subl $32, %esp [Link] program dalam bahasa assembly
call ___main
untuk dieksekusi dalam mikroprosesor
movl $LC0, (%esp)
call _printf MIPS32®. Program ini menerima input berupa
leal 20(%esp), %eax total bahan bakar yang dikonsumsi oleh mobil
movl %eax, 4(%esp)
movl $LC1, (%esp) dalam satuan liter dan total jarak yang
call _scanf ditempuh oleh mobil dalam satuan kilometer
call _scanf dengan jumlah bahan bakar tersebut. Kemudian
movl 20(%esp), %eax
leal 15(%eax), %edx program melakukan perhitungan untuk rata-
testl%eax, %eax rata konsumsi bahan bakar per kilometer serta
cmovs%edx, %eax jarak yang dapat ditempuh dalam satuan
sarl $4, %eax
movl %eax, 28(%esp) kilometer menggunakan 1 liter bahan bakar.
movl 20(%esp), %eax Sertakan kode bahasa assembly Anda dan
cltd
screenshot hasil yang ditampilkan pada console
shrl $28, %edx
addl %edx, %eax
andl $15, %eax .data
subl %edx, %eax TBB: .asciiz "Masukkan total bahan
movl %eax, 24(%esp) bakar yang digunakan (liter): "
movl 28(%esp), %eax TJ: .asciiz "Masukkan total jarak
movl %eax, 4(%esp) yang ditempuh(km): "
movl $LC2, (%esp) RBB: .asciiz "Rata-rata konsumsi
bahan bakar per km (liter/km): " .text
JT: .asciiz "\nJarak yang ditempuh .globl main
per 1 liter bahan bakar (km/liter): main:
" li $v0, 4
.text la $a0, JumlahLoop
.globl main syscall
main: li $v0, 5
la $a0, TBB #output teks TBB syscall
li $v0, 4 move $t0, $v0 #variabel p
syscall li $t2, 0
li $v0, 7 #input TBB li $t4, 1
syscall while:
mov.d $f2, $f0 #variabel TBB bne $t2, $t0, loop #jika t2!=p,
la $a0, TJ #output teks TJ masuk loop
li $v0, 4 j finishloop #else, masuk
syscall finishloop
li $v0, 7 #input TJ loop:
syscall mul $t4, $t4, 2
mov.d $f4, $f0 #variabel TJ addi $t2, $t2, 1
la $a0, RBB #output teks RBB j while
li $v0, 4 finishloop:
syscall li $v0, 4
div.d $f10,$f2,$f4 #bagi liter la $a0, Iterasi
dengan km syscall
mov.d $f12,$f10 #hasil RBB li $v0, 1
li $v0, 3 add $a0, $t4, $zero #output t4 ke
syscall a0 untuk diprint
la $a0, JT #output teks JT syscall
li $v0, 4 li $v0,10
syscall syscall
div.d $f10,$f4,$f2 #bagi KM dengan
liter
mov.d $f12,$f10 #hasil JT
li $v0, 3
syscall
li $v0, 10
syscall
5. Buatlah program dalam bahasa assembly
untuk dieksekusi dalam MIPS32® dengan
fungsionalitas yang sama dengan program
dalam bahasa C berikut ini. Simulasikan
program
ini dalam PCSpim dan screenshot hasil yang
ditampilkan dalam console. (Petunjuk: gunakan
bne,
beq, atau j untuk merealisasikan loop.
.data
JumlahLoop:.asciiz "Masukan Jumlah
Loop: "
Iterasi:.asciiz "\nHasil Iterasi: "