Laman

Rabu, 03 April 2013

Tambahkan Element ke Penjumlahan


Terletak di bawah loop, count tumbuh dengan 1 nilai, sendangkan pointer tumbuh sebanyak 4 nilai. Sekarang masuk ke body loop. Ambil nilai dari entry dan jumlahkan ke dalam sum semua integer.

## Registers:
##  $8 -- count                     
##  $9 -- pointer to the array entry
## $10 -- current array entry       
## $11 -- sum of all integers       
## $12 -- sum of negative integers
## $13 -- sum of positive integers
## $14 -- pos. or neg. flag
## $15 -- SIZE of the array

main:    ori      $8,$0,0        #  count = 0
         ori      $11,$0,0       #  sum = 0
         ori      $12,$0,0       #  neg = 0
         ori      $13,$0,0       #  pos = 0
         lui      $9,0x1000      #  point at SIZE

         lw       $15,0($9)      #  get SIZE
         addiu    $9,$9,4        #  point to first entry

# while  count < SIZE do

loop:    beq      $8,$15,done 
         sll      $0,$0,0        #  branch delay


# get entry, add to sum

         lw       $10,($)  #  get entry
         

         sll      $0,$0,0             #  load delay

         addu     $11,$,$  #  add to sum
         

         addiu    $8,$8,1        # count++
         addiu    $9,$9,4        # point at next entry
         j        loop
         sll      $0,$0,0        #  branch delay

done:    sll      $0,$0,0        #  target for branch

        .data
size:   .word  17
array:  .word  12, -1, 8, 0, 6, 85, -74, 23, 99, -30, 30, 95, 4, 7, 10, 28, 14



Quest 12: fill in the blank

Bikin Loop nya


 Bisa jadi kamu menambah 1 angka daripada 4. Base register $19 membutuhkan naik empat angka karena integer tersebut menempati full word dalam hal ini naik 4 alamat memory. Instruksi beq di sini berfungsi untuk mengakhiri loop jika perhitungan telah mencapai akhir array.

## Registers:
##  $8 -- count                     
##  $9 -- pointer to the array entry
## $10 -- current array entry       
## $11 -- sum of all integers       
## $12 -- sum of negative integers
## $13 -- sum of positive integers
## $14 -- pos. or neg. flag
## $15 -- SIZE of the array

main:    ori      $8,$0,0        #  count = 0
         ori      $11,$0,0       #  sum = 0
         ori      $12,$0,0       #  neg = 0
         ori      $13,$0,0       #  pos = 0
         lui      $9,0x1000      #  point at SIZE

         lw       $15,0($9)      #  get SIZE
         addiu    $9,$9,4        #  point to first array entry

# while  count <  SIZE do

loop:    beq      $,$,done 

         sll      $0,$0,0        #  branch delay

         . . . . .               #  middle of loop body
         
         
         addiu    $8,$8,     # count++
         
         addiu    $9,$9,     # point at next entry
         
         j        loop
         sll      $0,$0,0        #  branch delay

done:    sll      $0,$0,0        #  target for branch

        .data
size:   .word  17
array:  .word  12, -1, 8, 0, 6, 85, -74, 23, 99, -30, 30, 95, 4, 7, 10, 28, 14


Di bagian paling bawah loop, count tumbuh dan base register bergerak menuju entry selanjutnya.

Quest 11: fill in the blank

Meload Ukuran Array


Sekarang yang perlu kamu lakukan adalah mendapatkan ukuran atau panjang dari array tersebut. Informasi ini tersimpan di dalam word pertama dari section data. Ingat lagi bahwa section data dimulai dari alamat 0x10000000. Load kepala address nya ke dalam base register kemudian load nilai dari word yang berada di alamat ini (ukuran array) ke dalam register $15.

Setelah itu arahkan base register untuk menunjuk ke entry pertama dari array.

## Registers:
##  $8 -- count                     
##  $9 -- pointer to the array entry
## $10 -- current array entry       
## $11 -- sum of all integers       
## $12 -- sum of negative integers
## $13 -- sum of positive integers
## $14 -- pos. or neg. flag
## $15 -- SIZE of the array

## Initialize
main:    ori      $8,$0,0        #  count = 0
         ori      $11,$0,0       #  sum = 0
         ori      $12,$0,0       #  neg = 0
         ori      $13,$0,0       #  pos = 0

              $9,0x1000     #  point at SIZE
         
              $15,0($9)     #  get SIZE
         
         addiu    $9,$9,    #  point to first entry
         

# while  count < SIZE do
loop: 
         . . . .
   
         j        loop
         sll      $0,$0,0        #  branch delay

        .data
size:   .word  17
array:  .word  12, -1, 8, 0, 6, 85, -74, 23, 99, -30, 30, 95, 4, 7, 10, 28, 14

Quest 10: fill in the blank

Flowchart

Flowchart bisa berguna untuk bermacam bahasa. Ditail bahasanya sendiri adalah rumusan dari disain ini. Gambar di bawah ini adalah flowchart yang terstruktur.

Satu entry di dalam array disebut juga element array.


 Berikut adalah sekilas dari programnya, program di bawah mengimplementasikan box pertama dari chart dan sebagian dari loop. Data dari array telah dideklarasikan.

## addIntArray.asm
##
## Sum all integers, the positive integers,
## and the negative integers in an array.

## Registers:
##  $8 -- count
##  $9 -- pointer to the array entry
## $10 -- current array entry
## $11 -- sum of all integers
## $12 -- sum of negative integers
## $13 -- sum of positive integers
## $14 -- pos. or neg. flag
## $15 -- SIZE of the array

         .text
         .globl  main
         
# Initialize
main:    
         ori      $,$0,0       #  count = 0

         ori      $,$0,0       #  sum = 0

         ori      $,$0,0       #  neg = 0

         ori      $,$0,0       #  pos = 0

# while  count < SIZE do
loop:     
         . . . .
   
         j        loop
         sll      $0,$0,0        #  branch delay

        .data
size:   .word  17
array:  .word  12, -1, 8, 0, 6, 85, -74, 23, 99, -30, 30, 95, 4, 7, 10, 28, 14

SPIM menginisialisasi register menjadi zero, tapi lebih baik kita menginisialisasi sendiri register yang akan kita gunakan untuk menjadi zero

Quest 9: fill in the blank

Contoh Program: jumlah dari sebuah array

Kadangkala programmer berusaha membuat sebuah ending untuk array dengan pola yang dia anggap tidak akan muncul di dalam data, seperti 0x00000000. Hal ini bisa mengundang bugs. Pola tersebut mungkin jarang keluar di data tapi tetap saja data tersebut adalah sah jadi programmu harus mengikuti aturan ini.

Contoh program selanjutnya akan menggunakan array integer. Panjang dari array ini sudah ditetapkan. Programnya akan menghitung 3 bentuk penjumlahan:
  • Menjumlahkan seluruh integer di dalam array
  • Menjumlahkan interger yang positif saja
  • Menjumlahkan integer yang negatif saja
Kamu mungkin pernah melihat contoh seperti ini sebelumnya di Java atau C.

Array Integer

Sebuah array integer adalah sekelompok integer yang berada di baris memory. Informasi dari panjang array ini juga tersimpan di dalam memory sebagai integer.

Di dalam bahasa assembly, sebuah array integer dideklarasikan dengan menggunakan directive .word dilanjutkan dengan barisan integer yang dipisah koma.

 .data
size:   .word  17
array:  .word  12, -1, 8, 0, 6, 85, -74, 23, 99, -30, 30, 95, 4, 7, 10, 28, 14
 
Directive .word meletakkan data ke dalam lokasi yang berbentuk per word

Quest 7: kenapa array tidak bisa diakhiri dengan null word?
jawab : karena null word sama dengan zero integer

Program Komplit

Base register mengalami kenaikan nilai akibat dari berlanjutnya alamat-alamat tiap-tiap character. Secara 1 karakter = 1 byte, dan 1 byte = 1 address, maka pointer dari base register akan bergerak 1 langkah. Konsep ini adalah penting di dalam program tersebut.

## strlen.asm
##
## Count the characters in a string
##
## Registers:
##  $8 -- count
##  $9 -- pointer to the char
## $10 -- the char (in low order byte)

         .text
         .globl  main
   
# Initialize
main:    ori      $8,$0,0        #  count = 0
         lui      $9,0x1000      #  point at first char

# while not ch==null do
loop:    lbu      $10,0($9)      # get the char
         sll      $0,$0,0        # branch delay
           
         beq      $10,$0,done    # exit loop if char == null
         sll      $0,$0,0        # branch delay

         addiu    $8,$8,1        # count++
         addiu    $9,$9,1        # point at the next char

         j        loop
         sll      $0,$0,0        # branch delay slot

# finish
done:    sll      $0,$0,0        # target for branch

         .data
string:  .asciiz  "Time is the ghost of space."


Program di atas sangat dekat dengan saudaranya di standar library C function int strlen(char*). Program assembly ini setelah ditulis hanya akan memiliki datanya sendiri dan tidak bisa sebagai function yang bisa dipanggil, kita nanti akan menulis program function yang bisa dipanggil dan memiliki parameter.

Badan Loop

Address dari byte yang diload menggunakan instruksi lbu adalah nilai dari $9 + . Secara $9 adalah sebagai base register yang menunjukkan character pertama maka nilai yg digunakan adalah $9 + 0 untuk character pertama dan $9 + ... untuk character selanjutnya sesuai urutan. Isi dari byte yang berada pada alamat tersebut kemudian diload ke $10 menggunakan instruksi lbu . 3 byte teratas akan berisi zero. Instruksi beq berfungsi untuk mengetes apakah byte tersbut null atau tidak, jika null maka penghitungan selesai.

  

## strlen.asm
##
## Count the characters in a string
##
## Registers:
##  $8 -- count
##  $9 -- pointer to the char
## $10 -- the char (in low order byte)

        .text
        .globl  main
  
# Initialize
main:    ori      $8,$0,0       #  count = 0
         lui      $9,0x1000     #  point at first char

# while not ch==null do
loop:    lbu   $10,0($9)        # get the char
         sll   $0,$0,0          # load delay
           
         beq   $10,$0,done      # exit loop if char == null
         sll   $0,$0,0          # branch delay

         addiu    ,,   # count++

         addiu    ,,   # point at the next char

         j       loop
         sll   $0,$0,0          # branch delay slot
         
# finish
done:    sll   $0,$0,0           # target for branch

         .data
string:  .asciiz  "Time is the ghost of space."

Selanjutnya program akan mengincrement count, kemudian menggerakkan base register agar menunjuk alamat character berikutnya.

Quest 5: fill in the blank

Program dilanjutkan

Tapi untuk sekarang ingatlah kalau data section dimulai dari address 0x10000000. Half word atas adalah 0x1000. Nilai ini diload kedalam base register menggunakan lui



## strlen.asm 
## 
## Count the characters in a string 
## 
## Registers: 
##  $8 -- count 
##  $9 -- pointer to the char 
## $10 -- the char (in low order byte) 

.text 
.globl main 

# Initialize 

main: 
      ori $8,$0,0           # count = 0 
      lui $9,0x1000         # point at first char 
  
# while not ch==null do 
  
loop: 
       lbu $10,($9)    # get the char 
       
       sll   $0,$0,0        # load delay slot

        $10,$0,done    # exit loop if char == null 
       
       sll   $0,$0,0        # branch delay slot
   
       . . .
   
       j loop               # finish 
       sll   $0,$0,0        # branch delay slot

done:  sll $0,$0,0          # target for branch 

.data 
string: .asciiz "Time is the ghost of space." 

Quest 4: fill in the blank