Skip to main content

大戰系統程式 - SIC/XE 指令分析

系統程式這門課應該是所有資工系必修的課,這門課連我自己都覺得有點硬,我會這麼說是因為網路上的資料真的不多,而且連 GenAI 也常常給出錯的答案。因此我決定寫個筆記,給我自己也給未來的大二生看。

如果你不知道這門課在學什麼,簡單來說就是跟組合語言有關的東西,像編譯、組譯、連結等等,而這些都有非常多的細節,理解後非常有趣。

下方的內容如果有錯誤,歡迎來信更正!

基礎指令分析

下方的題目取自席家年教授的練習題,如有侵權請來信告知!

題目 PDF 下載

針對每條指令我們要處理的問題如下:

  • 助憶碼
  • 指令格式
  • 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 有三種可能,分別如下:

  • 10 indirect 間接定址
  • 11 direct 直接定址
  • 01 immediate 立即定址

這裡是 11,可以知道是直接定址。

xbp 和我們最後計算出來的 Target Address(TA)有關,算法如下

  • 假設 x 為 1,則我們就先把 X 暫存器的值記起來
  • b 和 x 做法相同
  • p 和 x 的做法也相同,但這裡的 P 指的是 PC 暫存器

現在我們先把 PC 的值計起來,得到 003000

接著還有一位 e,那個直接不理它跳過就好。

現在和上題一樣,把剩下的 12 位元轉換成十六進位得到 600,再把 600003000 加起來就是 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