4.1 basic macro processor functions
Macro Processor為copy code facility複製程式碼的工具,並且與機器無關。
宣告:MACRO
, ENDM
- macro definition
- Macro Expansion
- x86的
LOCAL
指令: 避免展開的時候重複定義產生。
LOCAL START.DONE ; START 和 DONE兩個symbol
- 或者透過依序編號的方式避免重複定義,從0累加
REPT
/ENDM
指令用於展開重複的指令
REPT 4
MOVS STR2, STR1
ENDM
; 會自動展開成4個MOVS
- Macro instructions defines macro: 在macro 內部定義macro,可以透過堆疊處理
- Macro call within Macro: 遞迴巨集呼叫,如遞迴巨集呼叫,必須定義停止條件。
4.2 Macro processor implementation
如何實做Macro processor
步驟
- 辨識macro definitions
- 保存definitions
- 辨識macro call
- 展開macro call
如何辨識macro call
不是executable institution或pseudocode的指令當成Macro call
資料結構
Macro Name Table (NAMTAB)
: 保存名稱、macro的起始與結束位置Macro Definition Table (DEFTAB)
Arguments Table (ARGTAB)
: 保存傳入的參數,並且進行代換,可以用#1
之類的方式來指定特定編號的參數
問題
- 問: Macro是one pass或two passes?
- 答: 因為Macro需要在called之前定義,因此可以透過one pass處理
4.3 Macro instructions defines macro
Macro內部出現Macro定義(並非Macro call)的話,將內部的Macro定義到 Name Table,之後就可以對此Macro進行呼叫。
處理
- 遇到Macro定義只處理最外層
- 對外層Macro進行呼叫僅展開一層,Macro Define不會展開,
並且保存內部Macro define到
NAMTAB
,之後內部Macro就可以呼叫。 透過堆疊處理多層Macro,僅需要找到最外層的Macro起始與結束位置即可
4.4 Macro call within Macro
Macro內部進行Macro Call時展開內部的Macro,透過stack下去保存args(ARGTab), 堆疊結構保存指令位置與arg以及堆疊深度,指令位置為當前正在展開的 指令位置並且展開完成後遞增,而arg則是當前macro的args, 堆疊深度為前一個Macro call的深度。
4.5 Macro processor within language translator
前處理與組譯順序
src -> Macro (one pass) -> assembler -> obj
或
src -> Macro & Asm pass1 -> assembler pass2 -> obj
Macro processor不處理forward reference
pass數量
- Macro無向前參考: 1次
- Macro有向前參考: 2次
- Macro有向前參考與Asm: 3次
- macro define
- macro展開與asm pass 1
- asm pass 2
- Macro無向前參考與Asm: 2次
- macro define, macro展開, asm pass 1
- asm pass 2
System Program