Laman

Senin, 08 April 2013

Rotasi Pola-pola BIt

Dengan menggunakan instruksi geser kiri, bit yang ada di paling kiri akan jatuh dan mengisi bit yang paling kanan dengan zero.

Dengan menggunakan intruksi rotate kiri, maka bit yang paling kiri akan mengisi ke bit paling kanan.

Pada gambar bisa diilustrasikan dari bit yang bernilai  10100111 kemudian dirotasi 1 langkah sehingga menjadi 01001111. Jika dirotasi sekali lagi maka nilainya akan menjadi 10011110. Tentu saja bit tadi hanyalah contoh jika digunakan pada register tentunya jumlah bitnya ada 32.

Begitu juga dengan rotasi kanan, cara yang sama juga berlaku.

Quest 14: Rotasikan pola bit berikut ini dua langkah ke kanan 10001100
Jawab: 00100011

Program Komplit

Program sudah selesai dan boleh kamu copy untuk dijalankan di komputermu. Ingat bahwa program ini membutuhkan pseudo instruksi dan load trap handler file.

## rest.asm
##
## Total restaurant bill calculator
##
## Register Use:
##
##    $s0 meal cost
##    $s1 tip rate
##    $s2 tax rate
##    $s3 total rate
##    $s4 tax+tip dollars
##    $s5 total bill

        .globl  main

        # Get meal cost
main:   li      $v0,4            # print prompt
        la      $a0,prompt  
        syscall
        li      $v0,5            # input meal cost
        syscall
        move    $s0,$v0          # save it in $s0

        # Calculations
        lw      $s1,tip          # get tip rate
        lw      $s2,tax          # get tax rate
        addu    $s3,$s1,$s2      # (tax + tip) in percent
        mul     $s4,$s0,$s3      # mealcost*(total rate)
        div     $s4,$s4,100      # mealcost*(total rate)/100
        addu    $s5,$s0,$s4      # total bill

        # Output
        li      $v0,4            # print string
        la      $a0,head1        # "tax plus tip"
        syscall

        move    $a0,$s4          # get tax+tip
        li      $v0,1            # print integer
        syscall                  #

        li      $v0,4            # print string
        la      $a0,head2        # "total cost"
        syscall

        move    $a0,$s5          # get total
        li      $v0,1            # print integer
        syscall                  #

        li      $v0,10           # exit
        syscall

        .data
tip:    .word   15               # tip rate in percent
tax:    .word    8               # tax rate in percent

prompt: .asciiz "Enter food cost: "
head1 : .asciiz "   Tax plus tip: "
head2 : .asciiz "\n     Total cost: "



Quest 13:
apa yang terjadi dengan $t1 jika instruksinya seperti ini

li   $t0,0x12345678
sll  $t1,$t0,8

Jawab: 0x34567800

Mencetak Hasilnya

Bagian terakhir dari program adalah mencetak hasilnya ke layar monitor

## Register Use:
##
##    $s0 meal cost 
##    $s1 tip rate
##    $s2 tax rate
##    $s3 total rate
##    $s4 tax+tip dollars
##    $s5 total bill

        # Output

            $v0,4            # print string

            $a0,head1        # "tax plus tip"
        syscall

            $a0,$s4          # get tax+tip
        li      $v0,1                # print integer
        syscall                      # 

            $v0,4            # print string

            $a0,head2        # "total cost"
        syscall

            $a0,$s5          # get total

            $v0,1            # print integer
        syscall                      # 

        li      $v0,10               # exit
        syscall

        .data
tip:    .word   15                   # tip rate in percent
tax:    .word    8                   # tax rate in percent

prompt: .asciiz "Enter food cost: "
head1 : .asciiz "   Tax plus tip: "
head2 : .asciiz "\n     Total cost: "


Quest 12: fill in the blank

Bagian Penghitungan

Setelah membaca harga makanan, maka program selanjutnya bisa langsung melakukan perhitungan. Ini seperti melakukan semuanya langsung dalam sekali dan kemudian mencetak hasilnya

## rest.asm
##
## Total restaurant bill calculator
##
## Register Use:
##
##    $s0 meal cost 
##    $s1 tip rate
##    $s2 tax rate
##    $s3 total rate
##    $s4 tax+tip dollars
##    $s5 total bill

        .globl  main

        # Get meal cost
main:       $v0,4       # print a prompt (code 4 put in $v0)
            $a0,prompt  # address of prompt put in $a0
        syscall

            $v0,5       # input an integer  (code 5 put in $v0)
        syscall             # 32-bit result returned in $v0
          $s3,$v0     # save it in $s3

        # Calculations
        lw      $s1,        # get tip rate

        lw      $s2,        # get tax rate

        addu    $s3,$s1,$s2      # total rate in percent

           $s4,$s0,$s3      # mealcost*(total rate)

           $s4,$s4,100      # mealcost*(total rate)/100  

           $s5,$s0,$s4      # total bill

       . . . . .

        .data
tip:    .word   15          # tip rate in percent
tax:    .word    8          # tax rate in percent

prompt: .asciiz "Enter food cost: "
head1 : .asciiz "   Tax plus tip: "
head2 : .asciiz "     Total cost: "


Quset 11: fill in the blank untuk menyempurnakan program
jawaban:

 # Calculations
        lw      $s1,tip          # get tip rate
        lw      $s2,tax          # get tax rate
        addu    $s3,$s1,$s2      # total rate
        mul     $s4,$s0,$s3      # mealcost*(total rate)
        div     $s4,$s4,100      # mealcost*(total rate)/100 
        addu    $s5,$s0,$s4      # total bill

Contoh Program

Tulislah sebuah program yang menghitung biaya total dengan parameter biaya + 8% pajak + 15%tips. Biaya awal adalah nilai yang diinputkan oleh user. Rate pajak dan tips harus tetap Berikut adalah contoh hasil outputnya:

Enter food cost: 25
   Tax plus tip:  5
     Total cost: 30

Dan berikut adalah programnya:

## rest.asm
##
## Total restaurant bill calculator
##
## Register Use:
##
## $s0 tip+tax 
## $s1 tip rate
## $s2 tax rate
## $s3 meal cost
## $a0 tax+tip dollars

        .globl  main

        # Get meal cost
main:   li      $v0,4       # print a prompt (code 4 put in $v0)
        la      $a0,prompt  # address of prompt put in $a0
        syscall

        li      $v0,5       # input an integer  (code 5 put in $v0)
        syscall             # 32-bit result returned in $v0
        move    $s3,$v0     # save it in $s3 
        
        . . . . .

        .data
tip:    .word   15          # tip rate in percent
tax:    .word    8          # tax rate in percent

prompt: .asciiz "Enter food cost: "
head1 : .asciiz "   Tax plus tip: "
head2 : .asciiz "     Total cost: "

Informasi yang hanya perlu diketahui oleh pelayan adalah biaya makanannya. Nilai ini akan diinputkan melalui keyboard dan dikonversi oleh exeption handler menjadi integer two complement. SPIM exeption handler menganggap bahwa service code ada di register $v0. Argumen dilewatkan maupun dikembalikan dari service menggunakan variase register, lihat appendix G.

Quest 10: dengan menggunakan stabilo, coba kamu tandai yang mana pseudo instruksi dari program di atas

remu (Pseudo instruksi)

Setelah devide integer 32bit, hasil baginya berada di lo dan sisa baginya berada di hi. Pseudo instruksi di bawah ini menggunakan beberapa basic instruksi untuk mengkomputasi bit sisa bagi.

remu d,s,t # divide $s by $t. Put the
           # remainder in $d. Operands are
           # unsigned.
           # (pseudoinstruction)

Berikut adalah pseudo instruks yang menghitung nilai absolut sebuah integer.

Quest 9:
Berapa total yang harus diberikan oleh pelayan, jika tagihan adalah $25 pajaknya 8% dan tips 15%?
jawaban yang benar: total = 25 + (25*(8+15))/100 = 25 + (25*23)/100 = 25 + 575/100 = 30

Pseudo instruksi div dan divu

Extended assemble SPIM mempunyai intruksi

div  d,s,t # divide $s by $t. Put the
           # quotient in $d. Operands are
           # two's complement.
           # (pseudoinstruction)

dan

divu d,s,t # divide $s by $t. Put the
           # quotient in $d. Operands are
           # unsigned.
           # (pseudoinstruction)



Quest 8:
Apakah sisa bagi dari integer berguna?
jawab: yes
jawaban yang benar: tentu

Pseudo instruksi mul

Pseudo instruksi mul, membuat seakan-akan bahwa hasil dari perkalian adalah 32bit panjang.

mul  d,s,t # multiply $s by $t. put the
           # result in $d
           # (pseudoinstruction)

Di sini dia tidak melakukan pengecekan overflow. Bit-bit hi tidak diperiksa maupun disimpan. Ada pseudo instruksi lain yang mengerjakan pengecekan hi maupun melakukan overflow, tapi kita tidak menggunakannya dulu untuk saat ini.

Begitu juga untuk instruksi pembagian. Instruksi basic div s,t dan divu s,t meletakkan hasil mereka ke dalam register hi dan lo. Hasil bagi diletakkan ke register lo, dan sisa bagi diletakkan ke register hi. Untuk mengeluarkan hasilnya ini menggunakan mflo dan mfhi.


QUESTION 7:

Selesaikan penerjemahan. Operand registernya $s1 dan $s2, Destinasi register $t0.
div $t0,$s1,$s2
Diterjemahkan menjadi
div   , 

mflo   

Perkalian

Instruksi mult dan multu seperti yang telah kamu ketahui, meletakkan hasil perkaliannya ke dalam register hi dan lo, hasilnya baru bisa dikeluarkan menggunakan instruksi mfhi dan mflo.

Ketiga operand yang ada di pseudo instruksi mul d,s,t menggunakan instruksi basic mflo jika hasil dari perkalian adalah sesuai 32bit panjang.

Quest 6:
Selesaikan terjemahan
mul $v2,$s3,$t0
diterjemahkan menjadi
mult   , 

mflo     
(gunakan nama menemonik)

Subtraksi (pengurangan)

Instruksi li adalah pseudo instruksi. Assembler extended akan menerjemahkannya mennjadi basic instruksi.

Ada juga di assembler extended intruksi pengurangan, subu d,s,x yang mana operandnya bisa berupa register, 16bit atau 32bit. instruksi akan subu d,s,x diterjemahkan menjadi pseudo instruksi addu d,s,-x (yang kemudian baru diterjemahkan menjadi basic instruksi)

Instruksi negu d,s berfungsi untuk menegatifkan nilai yang ada di register s kemudian menyimpannya menuju register d

negu d,s   # d = -s
           # (pseudoinstruction)

Quest 5:

Terjemahkan instruksi ini
negu $v2,$s3 
menjadi basic instruksi
sub  ,$0,

Pseudo Instruksi Aritmetik

Jika tidak menggunakan assembler extended, ada dua buah instruksi addu d,s,t yang mana d, s, dan t adalah register. Kemudian ada juga addiu d,s,imm yang mana imm adalah immediate operand.

Jika menggunakan assembler extended maka instruksi addu d,s,x akan diterjemahkan menjadi basic instruksi yang berbeda bergantung dari x yang dimaksud. x bisa saja sebuah register, immediate 16bit atau immediate 32bit.

Cermati contoh berikut ini (untuk assembler extended):
addu $t0,$s0,40000
Nilai desimal 40000 tidak muat jika direpresentasikan sebagai 16bit (secara jangkauan integer 16bit adalah -32768 sampai +32767). Jadi instruksi di atas tidak bisa memakai terjemahan addiu instruksi basic. dua instruksi musti digunakan yaitu sebagai meload integer ke register temporer dan kemudian menjumlahkannya sebagai operand register.


Quest 4: terjemahkan berikut ini
addu $s1,$s0,40000
menjadi basic assembly
li   ,40000    # use pseudoinstruction li
addu $s1,$s0,  # perform 32-bit addition

Immediate Operand Implicit

Beberapa pseudo instruksi diterjemahkan menjadi berbeda bergantung dengan jenis operandnya. Pseudo instruksi yang menggunakan operand immediate akan diterjemahkan secara berbeda dengan pseudo instruksi yang menggunakan operand register.

Kadang kala mnemonik yang sama digunakan baik sebagai pseudo instruksi atau basic instruksi. sebagai contoh, kamu bisa menggunakan instruksi or untuk digunakan sebagai or dengan immediate operand atau or dengan operand register.

 or $s0,$s1,0x00ff translates into: ori $s0,$s1,0x00ff

Di sini, extended assembler akan memperhatikan bahwa operand yang dipakai adalah operand immediate, maka dia menerjemahkannya ke dalam instruksi ori basic. Hasil dari terjemahannya adalah 32 bit instruksi ori. Bagaimanapun di bawah ini adalah basic instruksi:

or $s0,$s1,$t1 

Instruksi basic di atas tidaklah berubah, karena dia merupakan instruksi basic asli.

Mnemonik and juga sama, dia bisa disebut sebagai and biasa atau andi atau basic instruksi yang lain benrgantung dengan operandnya.

Quest 3: Apakah ada dua instuksi basic baik add atau addi?
jawab: ya
jawaban yang benar: yes