• Appendix A
  • High Level Language 的部分是 pseudo-code
    • 僅能代表大概相同的邏輯
    • 不保證這段 code 編譯成組合語言會和範例完全一樣

判斷 format 的方法

  • Relative Addressing: 必為 format 3
  • Immediate Addressing: 看常數大小
    • 因為 format 3 的 disp 欄位有 12 bits,僅能表示 212-2^{12} ~ 21212^{12}-1
  • Memory Access: 通常是 format 3
  • Operation 前有加號:通常是 format 4

判斷是否存取記憶體的方法

  • 在語法描述中, m 表記憶體位置, (m) 是此位置的資料
    • 所以如果描述中有 (m) 表示有 memory access

# 1.2 Simple Data Movement

  • There are no memory-to-memory move instructions
  • All data movement must be done using registers.
    • 先用 Load 指令把資料從某段記憶體寫入 register
    • 再用 Store 指令把資料從 register 寫入目標記憶體位置
  • There are four different ways of defining storage for data items in the SIC assembler language: WORD , RESW , BYTE , RESB

# SIC

	LDA 	FIVE
	STA 	ALPHA
	LDCH	CHARZ
	STCH	C1
	 .
	 .
	 .
ALPHA	RESW	1	//宣告變數,長度沒有限制
FIVE	WORD	5	//宣告常數
CHARZ	BYTE	C'Z'	//宣告byte
C1	RESB	1
  • Memory usage: // 記憶體使用多少 byte (空間)
    • Data: 2 words + 2 bytes = 6 + 2 bytes = 8 bytes
    • Instruction: 4 * 3(24 bits) = 12 bytes
    • Total: 8 + 12 bytes = 20 bytes
  • # of memory access: // 記憶體存取幾次 (速度)
    • Data Access: 4
    • Instruction Fetch: 4
    • Total: 8

# SIC/XE

	LDA	 #5
	STA	 ALPHA
	LDA	 #90
	STCH	 C1
	 .
	 .
	 .
ALPHA	RESW	1
C1	RESB	1
  • Memory usage:
    • Data: 1 word + 1 bytes = 3 + 1 bytes = 4 bytes
    • Instruction: 3 + 3 + 3 + 3 = 12 bytes
    • Total: 16 bytes
  • # of memory access:
    • Data Access: 2
    • Instruction Fetch: 4
    • Total: 6

# High Level Language

int ALPHA;
char C1;
ALPHA = 5;
C1 = 'Z';

# 1.3 Simple Arithmetic Operation

# SIC

	LDA	ALPHA
	ADD	INCR
	SUB 	ONE
	STA	BETA
	LDA	GAMMA
	ADD 	INCR
	SUB	ONE
	STA	DELTA
	 .
	 .
	 .
ONE	WORD	1
         .
ALPHA	RESW	1
BETA	RESW	1
GAMMA	RESW	1
DELTA	RESW	1
INCR	RESW	1 
  • Memory usage:
    • Data: 6 words(3 bytes) = 18 bytes
    • Instruction: 8 * 3 = 24 bytes
    • Total: 42 bytes
  • # of memory access:
    • Data Access: 8
    • Instruction Fetch: 8
    • Total: 16

# SIC/XE

  • ADDR is used to avoid having to fetch INCR from memory each time it is used in a calculation, which may make the program more efficient.
	LDS	 INCR
	LDA	 ALPHA
	ADDR	 S,A
	SUB	 #1
	STA 	 BETA
	LDA	 GAMMA
	ADDR	 S,A
	SUB	 #1
	STA	 DELTA
	 .
	 .
	 .
	 .
ALPHA	RESW	1
BETA	RESW	1
GAMMA	RESW	1
DELTA	RESW	1
INCR	RESW	1 

Q: LDSLDA load 兩個變數存進 register 有沒有好處?

A: 是有的,因為 INCR 在整個程式中使用超過一次,所以先 load 到 register 裡面可以減少 memory access 的次數

  • Memory usage:
    • Data: 5 words = 15 bytes
    • Instruction: 2 byte( ADDR ) * 2 + 3 * 7 = 25 bytes
    • Total: 40 bytes
  • # of memory access:
    • Data Access: 5
    • Instruction Fetch: 9
    • Total: 14

# High Level Language

int BETA = ALPHA + INCR - 1;
int DELTA = GAMMA + INCR - 1;

# 1.4 Simple Looping and Indexing Operations

# SIC

	LDX	ZERO
MOVECH	LDCH	STR1,X
	STCH	STR2,X
	TIX	ELEVEN
	JLT	MOVECH
	 .
	 .
	 .
STR1	BYTE	C'TEST STRING'
STR2 	RESB	11
.
ZERO	WORD	0
ELEVEN	WORD	11
  • Memory usage:
    • Data: 2 words + 11 * 2 bytes = 6 + 22 bytes = 28 bytes
    • Instruction: 3 * 5 = 15 bytes
    • Total: 43 bytes
  • # of memory access:
    • Data Access: 1 + 3 * 11 = 34
    • Instruction Fetch: 1 + 4 * 11 = 45
    • Total: 79

# SIC/XE

  • TIXR makes the loop more efficient
  • Because the value does not have to be fetched from memory each time the loop is executed.
	LDT	#11
	LDX	#0
MOVECH	LDCH	STR1,X
	STCH	STR2,X
	TIXR	T
	JLT	MOVECH
	 .
	 .
	 .
STR1	BYTE	C'TEST STRING'
STR2 	RESB	11
  • Memory usage:
    • Data: 11 * 2 bytes = 22 bytes
    • Instruction: 2 ( TIXR ) + 5 * 3 bytes= 17 bytes
    • Total: 39 bytes
  • # of memory access:
    • Data Access: 2 * 11 = 2 + 22 = 24
    • Instruction Fetch: 4 * 11 = 44
    • Total: 68

# High Level Language

char STR1 = "TEST STRING";
char STR2[11];
int X = 0;
do{
    STR2[X] = STR1[X]; 
    X++;
}while(X < 11);

# 1.5 Sample Indexing and Looping Operations

  • The value in the index register must be incremented by 3 for each iteration of this loop
    • Because each iteration processes a 3-byte element of the arrays

# SIC

  • The TIX instruction always adds 1 to register X, so it is not suitable for this program fragment.

  • 因為一個 word 占用 3bytes,所以 X 每次要跳三個位置 (X 每次加 3),才能正確的讀取每一個 word

	LDA	ZERO
	STA	INDEX
ADDLP	LDX	INDEX
	LDA	ALPHA,X
	ADD	BETA,X
	STA	GAMMA,X
	LDA	INDEX
	ADD	THREE
	STA	INDEX
	COMP	K300
	JLT	ADDLP
	 .
	 .
	 .
INDEX	RESW	1
	 .
ALPHA	RESW	100
BETA	RESW	100
GAMMA	RESW	100
	 .
ZERO	WORD	0
K300	WORD	300
THREE	WORD	3

Q: 為什麼程式碼 7 ~ 10 不用 TIX ?

A: 因為這裡的變數宣告是 word,而不是 byte,要找到下一個資料位置,要加 3 bytes (one word),而 TIX 裡面的內容是,加 1 並比較。

  • Memory usage:
    • Data: 1 + 100*3 + 3 words = 304 words = 912 bytes
    • Instruction: 11 * 3 = 33 bytes
    • Total: 945 bytes
  • # of memory access:
    • Data Access: 2 + 8 * 100 = 802
    • Instruction Fetch: 2 + 9 * 100 = 902
    • Total: 1704

# SIC/XE

	LDS	#3
	LDT	#300
	LDX	#0
ADDLP	LDA	ALPHA,X
	ADD	BETA,X
	STA	GAMMA,X
	ADDR	S,X
	COMPR 	X,T
	JLT	ADDLP
	 .
	 .
	 .
	 .
ALPHA	RESW	100
BETA	RESW	100
GAMMA	RESW	100
  • Memory usage:
    • Data: 3 * 100 words = 300 words = 900 bytes
    • Instruction: 2( ADDR ) + 2( COMPR ) + 7 * 3 = 25
    • Total: 925 bytes
  • # of memory access:
    • Data Access: 3 * 100 = 300
    • Instruction Fetch: 3 + 6 * 100 = 603
    • Total: 903

# High Level Language

int ALPHA[100];
int BETA[100];
int GAMMA[100];
for (X = 0; X < 100; X++) {
    GAMMA[X] = ALPHA[X] + BETA[X];
}

# 1.6 Simple I/O Operations

# SIC

INLOOP	 TD 	INDEV
	 JEQ	INLOOP
	 RD	INDEV
	 STCH	DATA
	  .
	  .
	  .
OUTLP	 TD	OUTDEV
	 JEQ	OUTLP
	 LDCH	DATA
	 WD	OUTDEV
	  .
	  .
	  .
INDEV	 BYTE	X'F1'	// X 代表使用16進位, 'F1' 是給此裝置的編號
OUTDEV	 BYTE	X'05'
DATA	 RESB	1
  • Memory usage:
    • Data: 3 bytes
    • Instruction: (4 + 4) * 3 = 24 bytes
    • Total: 27 bytes

國展表示這邊 access 不用算 //TD RD WD

  • # of memory access:
    • Data Access: 2
    • Instruction Fetch: 2n + 2m + 4 (n, m: 測試 device 的次數)
    • Total: 2n + 2m + 6

# High Level Language

Device INDEV = Device("F1");
Device OUTDEV = Device("05");
char DATA;
// 不能使用就繼續測試
while (! INDEV.isReady()) {
}
DATA = INDEV.read();
    .
    .
    .
while (! OUTDEV.isReady()) {
}
OUTDEV.write(DATA);

# 1.7 Sample Subroutine Call and Record Input Operations

# SIC

	JSUB	READ
	 .
	 .
	 .
READ	LDX	ZERO
RLOOP	TD	INDEV
	JEQ	RLOOP
	RD	INDEV
	STCH	RECORD,X
	TIX	K100
	JLT	RLOOP
	RSUB
	 .
	 .	
	 .
INDEV	BYTE	X'F1'
RECORD	RESB	100
	 .	
ZERO	WORD	0
K100	WORD	100
  • Memory usage:
    • Data: (1 + 100) bytes + 2 words = 107 bytes
    • Instruction: 9 * 3 = 27 bytes
    • Total: 134 bytes

國展表示這邊 access 不用算 //TD RD WD

  • # of memory access:
    • Data Access: 1 + 2 * 100 = 201
    • Instruction Fetch: 1 + 1 + 2n + 5 * 100 + 1 (n: 測試 device 的次數)
    • Total: 2n + 704

# SIC/XE

	JSUB	READ
	 .
	 .
	 .
READ	LDX	#0
	LDT	#100
RLOOP	TD	 INDEV
	JEQ	 RLOOP
	RD	 INDEV
	STCH	 RECORD,X
	TIXR	 T
	JLT	 RLOOP
	RSUB
	 .
	 .
	 .
INDEV	BYTE	X'F1'
RECORD	RESB	100
  • Memory usage:
    • Data: (1 + 100) bytes = 101 bytes
    • Instruction: 2( TIXR ) + 3 * 9 = 29 bytes
    • Total: 130 bytes

國展表示這邊 access 不用算 //TD RD WD

  • Memory Access

# High Level Language

Device INDEV = Device("F1");
char RECORD[100];
READ();
void READ() {
    for(X = 0; X < 100; X++) {
        while (! INDEV.isReady()) {
        }
        RECORD[X] = INDEV.read();
    }
}