[SP]系統程式筆記4

4.1 basic macro processor functions

Macro Processor為copy code facility複製程式碼的工具,並且與機器無關。

宣告:MACRO, ENDM

  1. macro definition
  2. Macro Expansion
  3. x86的LOCAL指令: 避免展開的時候重複定義產生。
LOCAL START.DONE       ; START 和 DONE兩個symbol
  1. 或者透過依序編號的方式避免重複定義,從0累加
  2. REPT/ENDM指令用於展開重複的指令
REPT 4
MOVS STR2, STR1
ENDM
; 會自動展開成4個MOVS
  1. Macro instructions defines macro: 在macro 內部定義macro,可以透過堆疊處理
  2. Macro call within Macro: 遞迴巨集呼叫,如遞迴巨集呼叫,必須定義停止條件。

4.2 Macro processor implementation

如何實做Macro processor

步驟

  1. 辨識macro definitions
  2. 保存definitions
  3. 辨識macro call
  4. 展開macro call

如何辨識macro call

不是executable institution或pseudocode的指令當成Macro call

資料結構

  1. Macro Name Table (NAMTAB): 保存名稱、macro的起始結束位置
  2. Macro Definition Table (DEFTAB)
  3. Arguments Table (ARGTAB): 保存傳入的參數,並且進行代換,可以用#1之類的方式來指定特定編號的參數

問題

4.3 Macro instructions defines macro

Macro內部出現Macro定義(並非Macro call)的話,將內部的Macro定義到 Name Table,之後就可以對此Macro進行呼叫。

處理

  1. 遇到Macro定義只處理最外層
  2. 對外層Macro進行呼叫僅展開一層,Macro Define不會展開, 並且保存內部Macro define到NAMTAB,之後內部Macro就可以呼叫。
  3. 透過堆疊處理多層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數量


System Program