組合語言與系統分析 SIC程式教學
SIC/XE Instruction Set – Appendix A
SIC/XE Instruction Set – Appendix A
SIC程式教學
記憶體 記憶體是由長度為8 bits的byte所組成 連續3 bytes組合為一個word Ex. 010010112= 4B16 記憶體用十六進位顯示 連續3 bytes組合為一個word Ex. A0124C
變數宣告 變數宣告有兩種類型 宣告變數並設定初始值 格式: 變數名稱 型態 初始值 WORD Ex. NUMBER WORD 45 撰寫程式時,初始值為十進位 當執行時,會將其轉為十六進位表示儲存在記憶體中 4510= 2D16,記憶體內容為2D
變數宣告 BYTE Ex. STR1 BYTE C’TEST’ C代表char(字元) 會以ASCII code方式轉換成十六進位碼儲存在記憶體當中 TEST在記憶體中顯示為54455354 Ex. STR2 BYTE X’D3’ X代表十六進位 記憶體中顯示為D3
變數宣告 宣告變數保留空間 格式: 變數名稱 型態 保留空間數 RESW RESB Ex. TEMP1 RESW 2 Ex. TEMP2 RESB 1
暫存器 一個暫存器的長度為1 word (3 bytes) SIC可用的暫存器有五個 A : Accumulator;算術運算使用 X : Index register;可用於定址 L : Linkage register;當跳到副程式,將返回位址 存在此暫存器中,以供返回原程式 PC : Program counter;下一個執行的指令 位址 SW : Status word;包含各種資訊和條件碼(CC)
Load指令 將所指定的記憶體內容Load到暫存器中 LDA m A (m..m+2) 是將記憶體位置m開始的一個word內容,放到暫存器A中 Ex. LDA STR1 STR1 BYTE X’C1B235’ 暫存器A內容為C1B235
Load指令 LDCH m A [rightmost byte] (m) 其他指令:LDL、LDX CH代表char,所以是只抓一個byte,放到暫存器A最後一個byte(最右邊的byte) Ex. LDCH STR1 STR1 BYTE X’C1B235’ 暫存器A內容為FFFFC1 暫存器A預設值為FFFFFF,前兩個bytes沒有load內容,仍維持預設值 其他指令:LDL、LDX
Store指令 將暫存器內容Store到所指定的記憶體中 STA m m..m+2 (A) 將暫存器A的內容,放到記憶體位置m開始的一個word中 Ex. LDA STR1 STA STR2 STR1 BYTE X’C1B235’ STR2 RESW 1 STR2這個word內容為C1B235
Store指令 STCH m m (A) [rightmost byte] 其他指令: STL、STSW、STX 將暫存器A的最後一個byte (最右邊的byte)內容,放到記憶體m開始的一個byte中 Ex. LDA STR1 STCH STR2 STR1 BYTE X’C1B235’ STR2 RESW 1 STR2這個word內容為35FFFF 暫存器A最右邊的byte為35,將其放到STR2開始第一個位置,變成35FFFF 記憶體預設值為FFFFFF,後兩個bytes沒有load內容,仍維持預設值 其他指令: STL、STSW、STX
基本算數、邏輯運算指令 暫存器A和所指定的記憶體內容做運算,結果存在暫存器A中 ADD m A (A) + (m..m+2) 將”暫存器A的內容”與”記憶體位置m開始的一個word內容”相加,並將結果存在暫存器A中 Ex. LDA ONE ADD TWO ONE WORD 1 TWO WORD 2 暫存器A內容為000003 其他指令: SUB 、 MUL 、 DIV 、 AND 、 OR
程式練習1 計算1+2+3 將結果存放在變數SUM中
比較指令 比較暫存器A和所指定的記憶體內容,並設定條件碼CC結果為(<,=,或>) COMP m (A) : (m..m+2) 將暫存器A和記憶體位置m開始的一個word內容進行比較,並設定CC Ex. LDA ONE COMP ONE ONE WORD 1 CC設定為EQ 可與下頁的條件式跳躍指令共用
條件式跳躍指令 測試條件碼CC的值,並做適當的跳躍 JEQ m PC m if CC set to = 其他指令: JGT 、 JLT 測試CC的值,當值為EQ時,跳到記憶體位置m PC存放下一個執行的指令位置,所以當PC設定為m,下一個執行的指令位址即為m Ex. THIS LDA ONE COMP ONE JEQ THIS ONE WORD 1 CC為EQ,跳到THIS執行 其他指令: JGT 、 JLT
程式練習2 利用程式練習1 比較SUM和4,若SUM>4,跳到THIS THIS執行: SUM-4 計算1+2+3
跳躍指令 跳躍到指定的位置 J m PC m 跳到記憶體位置m
TIX指令 TIX m X (X)+1; (X):(m..m+2) 先加1到暫存器X的內容值 再比較暫存器X中的新值,和運算元的值 Ex. THIS LDA ONE TIX SEVEN JLT THIS
程式練習3 利用TIX指令 計算1+2+3
輸入和輸出 輸出和輸入都是一次以一個byte傳出或傳入暫存器A的最右邊byte(以ASCII code方式) TD m Test device specified by (m) 測試要進行輸出或輸入的device是否準備好可以傳送或接收,結果儲存在CC “<“表示準備好傳送或接收,”=”表示不能傳送或接收
輸入和輸出 RD m A [rightmost byte] data from device specified by (m) 從指定的device讀取一個字元,根據ASCII code轉換成其十六進位表示,儲存到暫存器A的最右邊byte WD m Device specified by (m) (A) [rightmost byte] 將暫存器A最右邊的byte(十六進位表示),根據ASCII code轉換成相對應的字元,寫到所指定的device中
輸入和輸出 Ex. RLOOP TD INDEV JEQ RLOOP RD INDEV INDEV BYTE X’F3’ 先測試deviceF3是否準備好傳送,若準 備好就從device F3讀取一個字元,放到 暫存器A的最右邊一個byte 若device F3內容為1,執行後,暫存器 A的內容為FFFF31
輸入和輸出 --Input file & Output file DEVF3:Input device 要輸入程式的input data DEV04、DEV05、DEV06:output device 程式要輸出的output data
程式練習4 從device F3輸入一個字元(ex. A) 再輸出到device 04
與副程式連結指令 JSUB m L (PC); PC m RSUB PC (L) 跳到副程式,並把返回位址放在暫存器L中 Ex. JSUB THIS LDA TWO … THIS LDA ONE
與副程式連結指令 Ex. JSUB THIS 跳到THIS副程式 LDA TWO . THIS LDA ONE RSUB 返回原程式
程式練習5 1.在主程式中 2.副程式 3.回到主程式 將暫存器A歸零 從device F3輸入一個字元(ex. A)