大戰系統程式 - SIC/XE 指令分析
系統程式這門課應該是所有資工系必修的課,這門課連我自己都覺得有點硬,我會這麼說是因為網路上的資料真的不多,而且連 GenAI 也常常給出錯的答案。因此我決定寫個筆記,給我自己也給未來的大二生看。
如果你不知道這門課在學什麼,簡單來說就是跟組合語言有關的東西,像編譯、組譯、連結等等,而這些都有非常多的細節,理解後非常有趣。
下方的內容如果有錯誤,歡迎來信更正!
基礎指令分析
下方的題目取自席家年教授的練習題,如有侵權請來信告知!
針對每條指令我們要處理的問題如下:
- 助憶碼
- 指令格式
- Target Address
- 被改變的目標
- 內容值
分析最重要的就是這張資料表,放在這方便對照:
9080
第一題我們來分析最簡單的指令,雖然說是最簡單的但是如果其它題目熟悉之後,反而常常會忘掉這種指令要怎麼解。
先拆成二進位,我們可以從得到 1001 0000 1000 0000。我們馬上可以發現到長度是 16 位元,再看到上方提供的資料可以知道是格式二。
按照我提供的資料表可以發現到前六碼是運算碼,接著四碼是 r1 再接著四碼是 r2。
前六碼為 1001 00,需要注意如果只有六個位元,則我們要補到八個位元,補完後為 1001 0000,可以得到十六進位的 90。然後再看到 SIC/XE 部分指令那邊,使用 opcode 去對,就可以得到 ADDR r1, r2 這個助憶碼。
而 r1 和 r2 分別是多少呢?把 r1 換成十進位得到 8,r2 得到 0,有了這兩個之後再去剛剛的部分指令表下方的暫存器區,使用編號去對應就可以知道 r1 是 PC,而 r2 是 A。
現在我們可以來回答問題了:
- 助憶碼就是上方的 ADDR r1, r2
- 指令格式是 2
- 被改變的目標可以在 SIC/XE 部分指令表的 Effect 發現是 r2,也就是 A
- 內容值就是把 r1 跟 r2 加在一起,也就是
12345A+003000,可以得到12645A
032600
同樣的先換成二進位 0000 0011 0010 0110 0000 0000,得到長度是 24,而 24 對應到的格式有兩種,可能是 SIC 或格式三。
那我們要怎麼知道是哪一種?我們可以直接去看第七跟第八個位元,如果是 00 則是 SIC 指令,而這裡是 11,因此確定是格式三。
確定了之後就看著表格,取出前六位分析,得到十六進位的 00,助憶碼就是 LDA m。
這題可以發現到在運算碼之後還有一個六位元的 nixbpe,而這裡就是最麻煩的地方,在看的時候要分成 ni 和 xbp 去看,而 e 我們先不管它,這個只有在組譯的時候會用到,這篇用不到。
ni 有三種可能,分別如下:
10indirect 間接定址11direct 直接定址01immediate 立即定址
這裡是 11,可以知道是直接定址。
xbp 和我們最後計算出來的 Target Address(TA)有關,算法如下
- 假設 x 為 1,則我們就先把 X 暫存器的值記起來
- b 和 x 做法相同
- p 和 x 的做法也相同,但這裡的 P 指的是 PC 暫存器
現在我們先把 PC 的值計起來,得到 003000。
接著還有一位 e,那個直接不理它跳過就好。
現在和上題一樣,把剩下的 12 位元轉換成十六進位得到 600,再把 600 跟 003000 加起來就是 TA。
而我們還有一個內容值要看,這裡和定址模式有關:
- 間接定址代表我們要在記憶體 dereference 兩次,換句話說就是我們要先用位址去找到值,再拿值當位址找一次。
- 直接定址代表我們直接去位址找值
- 立即定址代表算出來的 TA 就是值,不用找
現在我們可以來回答問題了:
- 助憶碼就是上方的 LDA m
- 指令格式是 3
- TA 為
003600 - 定址模式為直接定址
- 被改變的目標是 A,可以參考 SIC/XE 部分指令表
- 內容值可以在
003600這格記憶體找到,答案為103000
03C300
接下來的題目除非有比較特別的地方,不然都跟前面那題的解法相同。
這題和上題比較不同的是 xbp 的地方,可以發現到是 110,因此我們可以知道要把 x 和 b 的值加起來,之後再拿後 12 位換成十六進位之後加上去,TA 可以得到 6390。
答案:
- 助憶碼 LDA m
- 指令格式是 3
- TA 為
6390 - 定址模式為直接定址
- 被改變的目標是 A
- 內容值可以在
6390這格記憶體找到,答案為C303
022030
ni 可以發現到是 10,可以發現到是間接定址。
內容值要拿兩次,TA 在計算過後可以得到 3030,先看一次 3030 的值為 003600,之後再對位址看一次得到內容值 103000。
答案:
- 助憶碼 LDA m
- 指令格式是 3
- TA 為
3030 - 定址模式為間接定址
- 被改變的目標是 A
- 內容值為
103000
010030
ni 可以發現到是 01,發現到是立即定址。
內容值就是 TA,也就是 30
答案:
- 助憶碼 LDA m
- 指令格式是 3
- TA 為
30 - 定址模式為立即定址
- 被改變的目標是 A
- 內容值為
30
003600
這題可以發現到 ni 是 00,也就是說這題是一種 SIC 指令。
如果 x 為 1 則稱為索引定址,但這張練習卷沒有這種模式,處理方法就是 TA 要再加上 X 暫存器的值。而像這題的 X 為 0,就直接當成前面講過的直接定址即可。
答案:
- 助憶碼 LDA m
- 指令格式是 SIC
- TA 為
3600 - 定址模式為直接定址
- 被改變的目標是 A
- 內容值為
103000
0310C303
這題換成二進位之後發現到長度有 32 碼,是格式四的指令。
答案:
- 助憶碼 LDA m
- 指令格式是 4
- TA 為
C303 - 定址模式為直接定址
- 被改變的目標是 A
- 內容值為
003030
012FFE
這題可以發現到最後的 12 位是 1111 1111 1110,需要注意如果開頭是 1,像這題的情況就需要做負數處理。
做法是先把這個數字做一次二的補數,之後再把數字加上負號,其於的步驟都相同,只是最後的 12 位位址是負的。
這題的 TA 計算為 3000 + (-2),得到 2FFE。
答案:
- 助憶碼 LDA m
- 指令格式是 3
- TA 為
2FFE - 定址模式為立即定址
- 被改變的目標是 A
- 內容值為
2FFE
6BC300
這題其實如果有照我前面的指示應該不會有問題,但是最一開始的助憶碼要記得補兩個零,不然就會發現到找不到指令。
前六碼是 0110 10,如果你直接換成十六進位會發現找不到指令,因為要補零變成 0110 1000 得到 68,對應到的助憶碼為 LDB m
答案:
- 助憶碼 LDB m
- 指令格式是 3
- TA 為
6390 - 定址模式為直接
- 被改變的目標是 B
- 內容值為
C303