270 likes | 584 Views
Macro Processor Fungsi Dasar Fitur Berorientasi Mesin Pilihan Rancangan Contoh Implementasi. Instruksi macro. Instruksi macro (macro) Merupakan kemudahan notasi bagi programer untuk menulis versi steno sebuah program.
E N D
Macro ProcessorFungsi DasarFitur Berorientasi MesinPilihan RancanganContoh Implementasi
Instruksi macro • Instruksi macro (macro) • Merupakan kemudahan notasi bagi programer untuk menulis versi steno sebuah program. • Merepresentasikan kelompok statements yang umum digunakan pada source program. • Digantikan oleh macro processor dengan kelompok statement bahasa sumber yang berhubungan. Operasi ini dinamakan “expanding the macro” • Contoh: • Misalnya perlu dilakukan saving isi semua register sebelum memanggil subrutin. • Ini memerlukan serangkaian instruksi. • Kita dapat mendefisikan dan menggunakan macro, SAVEREGS, untuk merepresentasikan rangkaian instruksi ini.
Macro Processor • Macro processor • Fungsinya terutama melibatkan substitusi satu kelompok karakter atau baris dengan yang lainnya. • Biasanya, ia tidak melakukan analisis teks yang ditanganinya. • Ia tidak peduli terhadap arti statement yang terlibat pada saat macro expansion. • Dengan demikian, perancangan macro processor pada umumnya tidak berorientasi mesin. • Macro processor digunakan pada • bahasa assembly • bahasa pemrograman tingkat tinggi, misalnya, C or C++ • command language Sistem Operasi • tujuan umum
Fungsi DasarDefinition macroInvokasi macro Ekspansi macroOne-Pass AlgorithmStruktur Data
Definisi Macro • Dua assembler directive yang baru digunakan pada definisi macro: • MACRO: mengidentifikasi awal definisi macro • MEND: mengidentifikasi akhir definisi macro • Prototype (pattern) untuk macro: • Setiap parameter dimulai dengan ‘&’ label op operands name MACRO parameter : body : MEND • Body: statement yang akan dibangkitkan sebagai ekspansi macro.
Contoh Definisi Macro Definisi Macro Macro tidak memiliki label
Contoh Definisi Macro Definisi macro Macro tidak memiliki label
Invokasi Macro • Statement invokasi macro (macro call) memberi nama instruksi macro yang dipanggil dan argument pada ekspansi macro. • Proses invokasi macro invocation pemanggilan subrutin sangat berbeda. • Statement macro body di-ekspan setiap kali macro dipanggil. • Statement subrutin hanya muncul sekali, tidak bergantung dari berapa kali subrutin tersebut dipanggil.
Contoh Invokasi Macro Invokasi macro
Ekspansi Macro • Setiap statement invokasi macro akan di-ekspan menjadi statement-statement yang membentuk body macro tersebut. • Argumen dari invokasi macro disubstitusi untuk parameter pada prototipe macro. • Argumen dan parameter berhubungan satu sama lain menurut posisi mereka. • Argumen pertama pada invokasi macro berhubungan dengan parameter pertama pada prototipe macro, dst.
Ekspansi Macro • Comment line di dalam macro body telah dihapus, tetapi comment untuk statement individual tetap ada. • Statement invokasi macro itu sendiri dimasukkan sebagai comment line. • Label statement invokasi macro CLOOP tetap ada sebagai label statement pertama yangg dibangkitkan pada ekspansi macro. • Ini memungkinkan programmer memakai instruksi macro dengan cara yang sama seperti mnemonic bahasa assembler.
Tidak Ada Label pada Macro • Masalah label di body macro: • Akan ada label yang duplikat, yang akan dianggap sebagai error oleh assembler, jika macro yang sama di-ekspan berkali-kali pada beberapa tempat di program program. • Solusi: • Mudahnya, jangan gunakan label pada macro. Melainkan, gunakan PC-relative addressing secara eksplisit. • Contoh, pada macro RDBUFF dan WRBUFF, JEQ * +11 JLT *-14 • Cara ini tidak memudahkan dan cenderung menyebabkan error. • Solusi lain yang lebih baik?
Two-Pass Macro Processor • Two-pass macro processor • Pass 1: • Memproses definisi macro • Pass 2: • Expand semua statement invokasi macro • Masalah • Macro processor jenis ini tidak memungkinkan definisi macro rekursif, yaitu, body macro berisi definisi macro yang lain (karena semua macro harus didefinisikan pada saat pass pertama sebelum invokasi macro di-ekspan).
Contoh Definisi Macro Recursif • MACROS (untuk SIC) • berisi definisi RDBUFF dan WRBUFF yang ditulis dalam instruksi SIC. • MACROX (for SIC/XE) • berisi definisi RDBUFF dan WRBUFF yang ditulis dalam instruksi SIC/XE. • Program yang akan dijalankan pada SIC system dapat memanggil MACROS sementara program yang akan dijalankan pada SIC/XE dapat memanggil MACROX. • Mendefinisikan MACROS atau MACROX tidak berarti mendefinsikan RDBUFF dan WRBUFF. Definisi ini hanya diolah ketika invokasi MACROS atau MACROX di-ekspan. The same macro name
One-Pass Macro Processor • One-pass macro processor yang berulang-alik antara definisi macro definition dan ekspansi macro dengan cara yang recursif dapat menangani definisi macro recursif. • Karena struktur one-pass structure, definisi macro harus muncul pada source program sebelum statement yang memanggil macro tersebut.
Struktur Data • DEFTAB (tabel definisi) • Menyimpan definisi macro, termasuk • macro prototype • macro body • Comment lines dihilangkan. • Referensi ke parameter instruksi macro dikonversi ke notasi posisi untuk efisiensi dalam substitusi argumen. • NAMTAB • Menyimpan nama macro • Brfungsi sebagai indeks untuk DEFTAB • pointer ke awal dan akhir definisi macro • ARGTAB • Menyimpan argumen invokasi macro invocation menurut posisi pada list argumen • Sementara macro di-ekspan, argumen dari ARGTAB disubstitusikan untuk parameter yang berhubungan pada macro body.
Algoritma • Prosedur MAIN procedure • iterasi • GETLINE • PROCESSLINE • Prosedur PROCESSLINE • DEFINE • EXPAND • output source line • Prosedur DEFINE • memasukkan entry yang sesuai ke DEFTAB dan NAMTAB • Prosedur EXPAND • menetapkan nilai argumen pada ARGTAB • expand statement invokasi macro (seperti pada prosedur MAIN) • iterasi • GETLINE • PROCESSLINE • Prosedur GETLINE • Mendapatkan baris berikutnya yang akan diproses dari • input file • DEFTAB
Menangani Definisi Macro Recursif • Pada prosedur DEFINE • Ketika definisi macro sedang dimasukkan ke DEFTAB, pendekatan yang normal adalah meneruskan sampai directive MEND ditemukan. • Cara ini tida bisa dipakai pada definisi macro recursif karena MEND pertama yang ditemui pada macro sebelah dalam macro akan mengakhiri seluruh proses definisi macro. • Untuk memecahkan masalah ini, counter LEVEL digunakan untuk mencatat level definisi macro. • Menaikkan LEVEL sebesar 1 setiap kali directive MACRO terbaca. • Menurunkan LEVEL sebesar 1 setiap kali directive MEND terbaca. • MEND hanya dapat mengakhiri seluruh proses definisi macro ketika LEVEL mencapai 0. • Proses ini hampir sama dengan menyesuaikan jumlah tanda kurung kiri dan kanan ketika scan ekspresi aritmatik.