Chapter 20 Pembentukan Kode
Pembentukan Kode (Code Generation) Input : - Representasi intermediate : Representasi tiga alamat (quadrupels) Notasi posfik Representasi mesin virtual Representasi grafik ( pohon sintak dan DAG) Program sasaran (target) Bentuk : - Bahasa mesin absolut Bahasa mesin relocatable Bahasa assembly
Pembentukan Kode (Code Generation) Bahasa mesin absolut Dapat ditempatkan pada lokasi yang pasti dalam memori Dapat langsung dieksekusi Bahasa mesin relocatable Subprogram-subprogram dapat dikompilasi secara terpisah Bahasa assembly Pembentukan kode sangat mudah Instruksi simbol dapat dibuat Fasilitas makro assembler dapat dipakai
Pembentukan Kode (Code Generation) Memory management Jika kode mesin dibuat,label-label pada statement tiga alamat harus diubah menjadi address instruksi. Proses ini dikenal dengan backpatching. Pemilihan instruksi Tidak peduli efisiensi pemilihan / pemakaian instruksi sangat mudah. Masing-masing statement tiga alamat dibuatkan kodenya. Kode yang dihasikan ‘buruk’ dan tidak efusueb (tetapi, ini yang dipakai dikelas )
Pembentukan Kode (Code Generation) dapat diubah menjadi: MOV b, R0 ADD c, R0 MOV R0, a ADD e, R0 MOV R0, d Contoh : a := b+c d := a+e Kualitas kode yang terbentuk dapat ditentukan dengan jumlah dan macam instruksi yang dimiliki. Misalnya : inc a dapat menggantikan a := a+1
Pembentukan Kode (Code Generation) Alokasi Register Instruksi yang memakai register untuk operand biasanya lebih singkat dan cepat dibanding dengan operand/instrusksi yag memakai memory(dikelas kita pakai ‘memory’) Pemakaian register Alokasi register, pilih variable-variable yang akan menempati register. Register assignment, pilih register mana yang akan ditempati oleh variable
Pembentukan Kode (Code Generation) Memilih register yang optimal sulit Secara matematis : NP-Complete. Dipersulit lagi oleh keadaan hardware dan OS dimana mesin targetnya dipakai,yang memberikan syarat tentang pemakaian register. Contoh : IBM System/370 perkalian M x,y x harus diregister genap y harus diregister tunggal
Pembentukan Kode (cont) Model mesin register yang dipakai pada beberapa komputer mini address mesinnya dinyatakan dalam satuan byte, dimana satu word didefinisinikan sebagai 4 byte. punya n register, R0, R1, …, Rn-1 Punya instruksi dua-alamat / address dalam bentuk op sumber, tujuan dimana op adalah kode-op, dan sumber serta tujuan adalah field-field data.
Pembentukan Kode (cont) Kode-kode op yang dipunyai diantaranya: MOV (pindahkan sumber ke tujuan) ADD (tambahkan sumber pada tujuan) SUB (kurangkan sumber dari tujuan) Sumber dan tujuan suatu instruksi ditentukan dengan menggabungkan register serta lokasi memori dengan mode-mode address.
Pembentukan Kode (cont) Mode-mode addressnya adalah sbb:
Pembentukan Kode (cont) Contoh: MOV R0, M simpan isi dari register R0 pada lokasi memori M MOV 4(R0), M simpan nilai dari isi(4 + isi(R0)) pada lokasi memori M MOV *4(R0), M simpan nilai dari isi(isi(4 + isi(R0))) pada lokasi memori M
Pembentukan Kode (cont) Ongkos instruksi = satu + ongkos yang berkaitan dengan mode address dari sumber dan tujuan. Ongkos ini menggambarkan panjangnya suatu instruksi (dalam word). Dalam pembentukan kode ongkos harus diminimumkan
Pembentukan Kode (cont) Contoh: MOV R0, R1 punya ongkos 1 MOV R5, M punya ongkos 2 satu untuk instruksi satu untuk M ADD #1, R3 punya ongkos 2 satu untuk konstan SUB 4(R0), *12(R0) punya ongkos 3 dua untuk 4 dan 12
Pembentukan Kode (cont) Contoh beberapa macam instruksi untuk membentuk kode dari a:= b + c, dimana b, c merupakan variabel sederhana pada lokasi memori berbeda
Pembentukan Kode (cont) Jika R0, R1, R2 mengandung address dari a, b dan c, maka dapat dipakai:
Pembentukan Kode (cont) Jadi, gunakan kemampuan pengaddressan secara efisien !!!
Pengaturan Storage pada saat Run time (terutama pada saat suatu prosedur dipanggil) Beberapa statement tiga alamat untuk pemanggilan prosedur: 1. Call 2. Return 3. Halt 4. Action Asumsi, memori terbagi atas 3 bagian: 1. Kode 2. Data statis 3. Stack
Kode untuk Call Dimana: #here + 20 adalah address dari instruksi setelah goto. area_statis.proc_yg_dipanggil adalah konstan yang merupakan address dari record aktifasinya. area_kode.proc_yg_dipanggil adalah konstan yang merupakan address dari instruksi pertama proc_yg_dipanggil.
Kode untuk return Untuk alokasi record aktifasi pada saat prosedur dipanggil. SP = register yang merupakan pointer menunjuk ke awal record aktifasi (display[i] dalam tugas di kelas). Variabel dapat diakses dengan menambahkan offsetnya pada SP. Alokasi record aktifasi dilakukan dengan menaikkan SP sebanyak ‘besarnya’ record aktifasi, didealokasi dengan mengurangi / menurunkan nilai SP.
Kode untuk return (cont) Instruksi-instruksinya: Prosedur pertama menginisialisasi stack: MOV #stackstart, SP /*inisialisasi stack */ kode prosedur pertama HALT /* akhir eksekusi */ Memanggil prosedur ADD #ukuran_record_pemanggil, SP MOV #here + 16, SP /* simpan return address */ GOTO area_kode.proc_yg_dipanggil return sequence GOTO *0(SP) /*kembali ke pemanggil */ SUB #ukuran_record_pemanggil, SP /* mengembalikan sp ke tempat semula */