Laman

Selasa, 09 April 2013

Tabel untuk Instruksi Set

Berikut adalah sebuah tabel untuk kumpulan instruksi set. Kebanyakan dari mereka adalah pseudo instruksi. Operand t boleh immediate operand, tapi operand imm haruslah immediate operand.

Keluaran dari assembler extended adalah bergantung dari mnemonik dan operandnya. Kadangkala ada instruksi yang memnggunakan operand two komplemen, ada juga yang menggunakan operand unsigned, dan juga ada yang tidak mempermasalahkan jenis operandnya.
MnemonicOperandsDescriptionsigned or
unsigned?
seqd,s,tset d if s==t
sged,s,tset d if s>=tsigned
sgeud,s,tset d if s>=tunsigned
sgtd,s,tset d if s> tsigned
sgtud,s,tset d if s> tunsigned
sled,s,tset d if s<=tsigned
sleud,s,tset d if s<=tunsigned
sltd,s,tset d if s< tsigned
sltid,s,Immset d if s< Immsigned
sltud,s,tset d if s< tunsigned
sltiud,s,Immset d if s< Immunsigned
sned,s,tset d if s != t

Quest 10: Menurutmu apakah instruksi di bawah ini diterjemahkan kedalam basic instruksi yang sama?
sltu $t4,$v0,45dansltui $t4,$v0,45

Set jika kurang dari

Misal kita masukkan nilai 1 atau 0 ke dalam register flag untuk sebagai true atau false. Di bawah ini adalah slt dari bab 18, tapi sekarang menjadi lebih berguna dengan assembler extended.

    #  $s and t contain   
                   #  two's comp. integers
                   #
slt   d,s,t        #  if ( $s < $t )
                   #    d <— 1
                   #  else
                   #    d <— 0
                   #
                   #  t can be a register 
                   #  (basic instruction)
                   #  or an immediate operand
                   #  (pseudoinstruction)

Dengan assembler extended operand t boleh merupakan immediate.

Quest 9: Apakah di bawah ini benar?
slt   $t5,$v0,87        #  if ( $v0 < 87 ) $t5 <— 1
Jawab: Yes

Blank Terisi

Program sudah dikomplitkan di bawah ini

main:   
        li    $v1,0            # zero the sum
loop:
        . . . .                # prompt the user for input
        li    $v0,5            # read the integer
        syscall                # into $v0

        beq   $v0,-999,done    # while ( $v0 =/= -999 )
        blt   $v0,-32,out         # less than -32
        bgt   $v0,32,out          # greather than 32

        addu  $v1,$v1,$v0         # if in range add           
                                  # else skip
out:    b     loop        

done:   . . . .                # write out result

Quest 8: (tes memori) Apakah yang dimaksud dengan instruksi set?
Jawab: Instruksi set adalah mengeset dengan nilai 1 atau 0 dengan cara membandingkan dua nilai

Contoh Program

Mari kita membuat program yang bekerja membaca integer dari user kemudian mengakumulasikan jika integer tersebut di dalam range -32 <= x <= +32 dan membuang jika tidak sesuai range. Program akan berhenti jika user memasukkan angka -999. Berikut adalah gambaran dasarnya:

main:   
        li    $v1,0            # zero the sum
loop:
        . . . .                # prompt the user for input
        li    $v0,5            # read the integer
        syscall                # into $v0

        ____ $v0,____,done    # while ( $v0 != -999 )

        ____ $v0,____,out          # less than -32
        
        ____ $v0,____,out          # greater than 32
               
        addu  $v1,$v1,$v0          # if in range add           
                                   # else skip
out:    b     loop        
        
done:   . . . .                # write out result

Quest 7: Fill in the blank

Immediate Operand di dalam Branch

Jika instruksi branch mempunyai dua operand, maka dia bisa berupa register operand atau immediate operand. Contoh kita ambil dari tabel:
bges,t,labelbranch if s>=tsigned

Berikut adalah contohnya

bge    $t1,$t2,spot     # if ( $t1 >= $t2 ) goto spot

bge    $t1,23,spot      # if ( $t1 >= 23  ) goto spot

bge    $t1,-98,spot     # if ( $t1 >= -98 ) goto spot

bge    12,$t1,oops      # WRONG: first op must be a register

bge    $t1,value,oops   # WRONG: second op can't be a symbolic address

Quest 6: Apakah instruksi di bawah ini adalah benar?
bge     $t1,-67,spot     # if ( $t1 >= -67 ) goto spot
Jawab: Yes
Jawaban yang benar: Yes

Struktur If-else umum

Ketika kamu instruksi branch untuk membuat statement if-else. Intruksi yang mengikuti branch adalah statemen yang false, sementara ini berlawanan dengan bahasa tingkat tinggi yang mana instruksi biasanya diikuti dengan kondisi true. Cermati hal ini dengan hati-hati saat kamu mengkoding.

Berikut adalah contoh bagian program yang yang menjumlahkan nilai $t0 ke ($t2 jika $t0 genap) dan ke ($t1 jika $t0 adalah ganjil)

 lw    $t0,val          # $t0 has the value
        andi  $t8,$t0,1        # one's place is zero or one
        ____  $t8,odd          # if even
        addu  $t2,$t2,$t0      #     add to even sum
        b     endif
odd:                           # else
        addu  $t1,$t1,$t0      #     add to odd sum
endif:

Instruksi branch takberkondisi digunakan di bawah statemen true dari if-else

Di bab ini simulator sim diset aganr tidak ada delay branch dan loading delay jadi no-op tidak digunakan di sini.

Quest 5: fill in the blank dengan memilih branch yang sesuai.

Tabel intruksi Branch

Berikut adalah tabel untuk instruksi Branch. Ada instruksi branch tambahan untuk digunakan sebagai subroutine linkage yang telah dihilangkan. Beberapa instruksi ada yang menggunakan two komplemen dan beberapa ada yang unsigned, dan ada juga yang tidak menggunakan format data.

Operand pertama s musti register, operand kedua t bisa register atau immediate (assembler extended akan secara otomatis melakukan konversi bergantung dengan data yang kamu pakai). Destinasi address yang bisa dijangkau oleh branch ini merupakan 18bit operand immediate (16bit yang di shift 2) sehingga jangkauannya adalah sekitar 128K dari asal branch.

Beberapa pseudo instruksi ada yang menggunakan register $at atau ($1)sebagai alat resouce nya

MnemonicOperandsDescriptionsigned or
unsigned?
blabelbranch 
beqs,t,labelbranch if s==t 
beqzs,labelbranch if s==0 
bges,t,labelbranch if s>=tsigned
bgeus,t,labelbranch if s>=tunsigned
bgezs,labelbranch if s>=0signed
bgts,t,labelbranch if s>tsigned
bgtus,t,labelbranch if s>tunsigned
bgtzs,labelbranch if s>0signed
MnemonicOperandsDescriptionsigned or
unsigned?
bles,t,labelbranch if s<=tsigned
bleus,t,labelbranch if s<=tunsigned
blezs,labelbranch if s<=0signed
blts,t,labelbranch if s<tsigned
bltus,t,labelbranch if s<tunsigned
bltzs,labelbranch if s<0signed
bnes,t,labelbranch if s=/=t 
bnezs,labelbranch if s=/=0 








































Instruksi Branch yang takberkondisi

Pseudo instruksi mempunyai instruksi yang selalu menyebabkan branch. Mnemoniknya adalah b:

Intruksi ini berfungsi seperti jump. Secara tidak berkondisi dia merubah PC menjadi address untuk label. 32bit addressnya menggunakan 16bit offset dan nilai dari PC.

Branch jika sama dengan Zero

Assembler extended mengimplementasi instruksi branch menggunakan beberapa intruksi basic. Sebagai contoh:

beqz     s,label          # branch to label if register  s == 0
                          # (pseudoinstruction)

MIPS tidak mempunyai hardware untuk instruksi tersebut, tetapi dia mempunya register $zero dan beq instruksi

BAB 24 ― Pseudo Instruksi Percabangan dan Perbandingan

Hardware MIPS mempunyai beberapa instruksi untuk percabangan maupun perulangan. Instruksi dasar ini digunakan untuk menciptakan banyak pseudo instruksi yang membuat programmer lebih fleksibel.

Topik:

  • Instruksi Branch
  • Operand immediate di Branch Instruksi
  • Instruksi set
  • Pengalamatan yang terindex
  • Array Byte
  • Array Integer
Quest 1: Apa itu conditional branch?
Jawab: conditional branch adalah pelompatan address instruksi dengan cara membandingkan register

Instruksi Rotasi

Kedua intruksi rotasi di bawah ini merupakan pseudo instruksi. Satu intruksi ini memerlukan 4 buah basic instruksi agar bisa berjalan. Nilai yang dirotasi bisa merupakan register maupun operand immediate.
rol d,s,t    # d <—s rotated left by t
             # (pseudoinstruction)
ror d,s,t    # d <— s  rotated right by t
             # (pseudoinstruction)
Immediate operand negatif tidak diperbolehkan. Bagaimanapun jika ternyata operandnya merupakan integer negatif maka rotasi akan berputar kebalikan.

Quest 15: periksa berikut ini
li  $t2,-2
li  $t1,4
ror $t0,$t1,$t2
apa yang ada di $t0 setelah dieksekusi?
Jawab: 0000 0000 0000 0000 0000 0000 0001 0000
karena berputar ke kanan sejauh negatif 2 artinya = berputar ke kiri sejauh 2