### Basic Assembler Functions
**Assembler directives(不會占memory空間)**
* START
- 幫程式命名並且標註一個起始位置
* END
- 標註程式的結束位置且記住程式的第一個instruction
* BASE
```antlr4=
Line Loc Source statement Object code
5 1000 COPY START 1000
10 1000 FIRST STL RETADR 141033
255 END FIRST
```
## SIC Assembler
**Assembler在作業系統中的位置**

> 圖片來源: https://www.spreered.com/compiler_for_dummies/
Assembler會將組合語言轉成Object code(機器語言)
<h3 style="color:orange;">Forward refrence問題(必考)</h3>
問題:
* 在source還沒宣告前,無法產生Object code
解決方式:
* 把程式先看一遍,紀錄所有source的位置(two passes)
## Object code
**生成流程**
1. 透過Hash function建立Hashtable
2. PASS1 建立symbol table,生成一個中介檔(intermidiate file)
3. PASS2 透過intermidiate file生成object code

**n, i bit**
如果變數前面有`@`或`#`:
* `@`: indirect addressing mode
- n = 1, i = 0
* `#`: imeediate addressing mode
- n = 0, i = 1
* 如果沒有上述符號
- n = 1, i = 1
**x bit**
如果變數含有`,`,為indexing mode
* x = 1
沒有的話則為Direct mode
* x = 0
**b, p bit**
預設使用**program-counter relative**:
* disp = TA - (PC)
* b = 0, p = 1
如果上述方法不行則用**base relative**:
* disp = TA - (B)
* b = 1, p = 0
如果上述方法都不行則:
* b = 0, p = 0

**e bit**
如果指令前面有`+`,為**Format 4**
* e = 1
沒有的話則為
* e = 0

## Figure 2.10 Program
```antlr4=
Line Loc Source statement Object code
5 0000 COPY START 0
10 0000 FIRST STL RETADR 17202D
13 0003 LDB #LENGTH 69202D
14 BASE LENGTH
15 0006 CLOOP +JSUB RDREC 4B101036
20 OOOA LDA LENGTH 032026
25 OOOD COMP #0 290000
30 0010 JEQ ENDFIL 332007
35 0013 +JSUB WRREC 4B10105D
40 0017 J CLOOP 3F2FEC
45 00lA ENDFIL LDA =C'EOF' 032010
50 001D STA BUFFER 0F2016
55 0020 LDA #3 010003
60 0023 STA LENGTH 0F200D
65 0026 +JSUB WRREC 4B10l05D
70 002A J @RETADR 3E2003
93 LTORG
002D * =C'EOF' 454F46
95 0030 RETADR RESW 1
100 0033 LENGTH RESW 1
105 0036 BUFFER RESB 4096
106 1036 BUFEND EQU *
107 1000 MAXLEN EQU BUFEND-BUFFER
110 .
115 . SUBROUTINE TO READ RECORD INTO BUFFER
120 .
125 1036 RDREC CLEAR X B410
130 1038 CLEAR A B400
132 103A CLEAR S B440
133 103C +LDT #MAXLEN 75101000
135 1040 RLOOP TD INPUT E32019
140 1043 JEQ RLOOP 332FFA
145 1046 RD INPUT DB2013
150 1049 COMPR A,S A004
155 104B JEQ EXIT 332008
160 104E STCH BUFFER,X 57C003
165 1051 TIXR T B850
170 1053 JLT RLOOP 3B2FEA
175 1056 EXIT STX LENGTH 134000
180 1059 RSUB 4F0000
185 105C INPUT BYTE X'F1' F1
195 .
200 . SUBROUTINE TO WRITE RECORD FROM BUFFER
205 .
210 105D WRREC CLEAR X B410
212 105F LDT LENGTH 774000
215 1062 WLOOP TD =X'05' E32011
220 106S JEQ WLOOP 332FFA
22S 1068 LDCH BUFFER, X 53C003
230 106B WD =X'OS' DF2008
235 106E TIXR T B850
240 1070 JLT WLOOP 3B2FEF
245 1073 RSUB 4F0000
255 END FIRST
1076 * =X'05' 05
```
## Program Relocation
當程式有記憶體存取或者使用direct addresses會需要進行Relocation
* SIC/XE Format 4
* SIC
**Object program Modification record**
```an=
Line Loc Source statement Object code
5 0000 COPY START 0
15 0006 CLOOP +JSUB RDREC 4B101036
Modification record: M00000705
```
* bit 1: M
* bit 2-7: 需要修改的位址(相對於起點)
* bit 8-9: 需要修改的範圍(單位為half-bytes)
## Literals
系統自動分配了一個記憶體空間並存放常數的值,並且指令中指向該常數記憶體位址
* 使用`=`開頭
* 把Literals集中在Literal pools,變數名稱為`*`
* 如果使用relative addressing mode,也會需要 Modification record
<a style="color:orange">**LTORG 必考**</a>
* 告訴系統將Literals宣告在底下
```an=
Line Loc Source statement Object code
45 00lA ENDFIL LDA =C'EOF' 032010
.
.
93 LTORG
002D * =C'EOF' 454F46
```
**LITTAB**
我們需要一個新的資料結構來儲存Literals型態,概念類似專門給Literals的symbol table
* Literal name(常數本身)
* 常數的值以及長度
* 記憶體位址
LITTAB會在Pass1時被辨識
在Pass2時,將變數的記憶體位置找出來
<h3 style="color:orange">Literals vs immediate operand 必考</h3>
**immediate operand**
* immediate addressing, the operand value is assembled as part of the machine instruction.
**Literals**
* With a literal, the assembler generates the specified value as a constant at some other memory location.
## Symbol-Defining Statements
<h3 style="color:orange">EQU 必考</h3>
類似於C的`#define`,用於定義字串和數值的關係
EQU也可用於給予暫存器(Register)的值
**優點**
* 常用於建立符號型的名稱,**增加程式可讀性**
* 不佔用記憶體空間
* 不用memory access
**ORG**
* 可以更動location counter的值
## Expressions
<h3 style="color:orange">absolute term vs relative terms 必考</h3>
在symbol table裡會有flag來標示該值為absolute或者relative term
**absolute term 必考**
* 常數(Constant)
**relative terms**
* Labels on instructions and data areas, and references to the location counter value, are relative terms.

```antlr4=
Line Loc Source statement Object code
95 0030 RETADR RESW 1
100 0033 LENGTH RESW 1
105 0036 BUFFER RESB 4096
106 1036 BUFEND EQU *
107 1000 MAXLEN EQU BUFEND-BUFFER
```