Laman

Senin, 22 April 2013

Entry Point (Titik Masuk)

Sekarang ke dalam subroutine. Alamat pertama dari subroutine ini disimbolkan dengn nama fact. Tentu saja nama fact hanyalah simbol yang dipakai oleh assembler, kenyataannya symbol ini akan diterjemahkan oleh assembler menjadi suatu letak atau alamat yang  berada di main storage runtime. Alamat ini ditentukan oleh assembler, linker dan loader.

#  int fact( int n )
#  {
#    if ( n<=1)
#      return 1;
#    else
#      return n*fact(n-1);
#  }
         .text
         .globl  fact
fact:
                                  # prolog        
         sub     $sp,$sp,4        #   1. Push return address
         sw      $ra,($sp)
         sub     $sp,$sp,4        #   2. Push caller's frame pointer
         sw      $fp,($sp)
         sub     $sp,$sp,4        #   3. Push register $s1
         sw      $s1,($sp)
         sub     $fp,$sp,0        #   4. $fp = $sp - space_for_variables (==0)
         move    $sp,$fp          #   5. $sp = $fp
         
                                  # body of subroutine
        . . . . . .
                            
epilog:                           # epilog
                                  #   1. Return value is already in $v0        
         add     $sp,$fp,0        #   2. $sp = $fp + space_for_variables (==0)
         lw      $s1,($sp)        #   3. Pop register $s1
         add     $sp,$sp,4        #          
         lw      $fp,($sp)        #   4. Pop $fp
         add     $sp,$sp,4        #           
         lw      $ra,($sp)        #   5. Pop $ra
         add     $sp,$sp,4        #            
         jr      $ra              #   6. return to caller 

Simbol fact adalah simbol global (juga disebut simbol eksternal) sehingga assembler, linker dan loader bisa menggunakan simbol tersebut untuk menunjuk tempat yang sama di main memory.

Sebuah lokasi samacam fact ini yang mejadi target sebuah pemanggilan subroutine, disebut entry point. Kadang kala sebuah subroutine mempunyai beberap entri point, tiap-tiapnya berkaitan dengan fungsi yang berbeda-beda.

Quest 24: Apakah simbol global selalu meunjuk ke sebuah entry point?
Jawab: Tidak, bisa juga simbol global menunjuk ke suatu data yang diperlukan untuk operasi.

Komplit main()

Kembali ke contoh program yang kita buat.

#  main()
#  {
#    int a, b;    // a: 0($fp),  b: 4($fp)
#    write("enter an int:")
#    read( a );
#    b = fact( a );
#    write("factorial is:")
#    print( b );
#  }
         .text
         .globl  main
main:
                                  # prolog        
         sub     $sp,$sp,4        #   1. Push return address
         sw      $ra,($sp)
         sub     $sp,$sp,4        #   2. Push caller's frame pointer
         sw      $fp,($sp)
                                  #   3. No S registers to push
         sub     $fp,$sp,8        #   4. $fp = $sp - space_for_variables
         move    $sp,$fp          #   5. $sp = $fp

                                  # write("enter an int:")
         li     $v0,4             #   print string service
         la     $a0,prompt1       #   address of prompt
         syscall
                                  # read( a )
         li     $v0,5             #   read integer service
         syscall                  #   $v0 gets the integer
         sw     $v0,0($fp)        #   save in variable a
                        
                                  # subroutine call
                                  #   1. No T registers to push
         lw      $a0,0($fp)       #   2. Put argument into $a0
         jal     fact             #   3. Jump and link to subroutine
         
                                  # return from subroutine 
                                  #   1. No T registers to restore
                                  
         sw     $v0,4($fp)        # b = fact( a )
        
                                  # write("factorial is:")
         li     $v0,4             #   print string service
         la     $a0,prompt2       #   address of prompt
         syscall
                                  # print( b )
         lw     $a0,4($fp)        # load a into $a0
         li     $v0,1             # print integer service
         syscall                                  

                                  # end the print line
         li     $v0,4             #   print string service
         la     $a0,lf            #   address of line feed
         syscall
                                  # epilog
                                  #   1. No return value         
         add     $sp,$fp,8        #   2. $sp = $fp + space_for_variables       
                                  #   3. No S registers to pop      
         lw      $fp,($sp)        #   4. Pop $fp
         add     $sp,$sp,4        #           
         lw      $ra,($sp)        #   5. Pop $ra
         add     $sp,$sp,4        #                                    
         jr      $ra              # return to OS 

         .data
prompt1: .asciiz "enter an int:"
prompt2: .asciiz "factorial is:"
lf:      .asciiz "\n"

Quest 23: Subroutine apa yang dipanggil oleh main()?

Kelas Storage

Ada 3 tempat di dalam memory yang bisa kita letakkan data: di data section (dideklarasikan dengan .data dalam bahasa assembly), di runtime-stack, dan di heap.

Subroutine boleh memiliki data yang tersimpan di section .data. Di bahasa pemrograman tingkat tinggi, seperti C, type penyimpanan ini disebut static.

Variabel yang disimpan dengan cara mengalokasikan run-time stack, biasanya disebut dengan variabel otomatis. Ini karena mereka secara otomatis di push dan di pop ketika subroutine masuk dan keluar. Biasanya kalau orang bilang "variabel" bisa mengacu ke "variabel otomatis".

Variabel yang tempat penyimpanannya ada di heap biasa disebut variabel dinamik. Bab 33 dari kuliah ini akan membahas tentang heap. Heap adalah tempat memory bagi object (menggunakan instruksi new kalau di Java atau C++). Di bahasa C memory dinamik dialokasikan menggunakan operasi malloc (atau sejenisnya).

Heap ada di atas data segment. Kalau variabel dinamik dialokasikan maka data segment akan tumbuh ke atas ke arah stack.

Quest 22: (mengulang) apa yang akan terjadi jika stack dan heap semakin membesar dan membesar?