使用的是16位微程序設計,指令爲TEC-2000 16位教學計算機的指令系統
要實現的功能:通過鍵盤鍵入一個數字,接收之後顯示出來,然後自動補上*號,接着再次鍵入一個數字,然後自動補上=號,接着輸出運算結果。
本文章實現的,子程序:兩個一位數的乘法子程序,將R1和R2中的一位數相乘,最後的結果會在R0中。
本程序要使用R1和R2寄存器,同時會改變R3和R0寄存器的值
代碼功能簡介
彙編語言指令 | 彙編指令功能 |
---|---|
MVRD DR,DATA | DATA -> DR 或 DR = DATA 給寄存器DR賦值 |
DEC DR | DR - 1 -> DR 實現DR的自減功能 |
ADD DR,SR | DR + SR -> DR |
SHR DR | DR/2 -> DR,C 將寄存器DR的值向右移動一位,移出的位存入C中 |
SHL DR | DR*2 -> DR,C 將DR左移一位,移出的位存到C中 |
JR ADR | 無條件跳轉到ADR地址上 |
JRNC ADR | C = 0 時跳轉到地址ADR處繼續執行程序 |
JRZ ADR | Z = 1 時跳轉到地址ADR處的位置繼續執行程序 |
RET | 表示程序結束,類似於return |
注:DATA表示十六位進制的一個具體的數字
DR、SR表示寄存器
ADR表示地址,絕對地址
CZVS:C表示進位位,Z表示是否爲0,V表示是否溢出,S表示符號位。(具體含義請自行學習)
關鍵字解釋
GOTO:並不是標準彙編語言,因爲跳轉的話需要寫上絕對地址,而絕對地址並不是每一次都一樣,但是又要將代碼表達出來,則使用這種方式,表示要跳轉的位置。
代碼塊功能介紹
代碼塊1
MVRD R3,0005
DEC R3
JRZ GOTO:RET //如果已經執行四次,則結束程序
SHR R2 //將R2中的二進制右移一位
JRNC GOTO:SHL R1 //如果移出的位爲0,則移動到將R1移位的地方
ADD R0,R1
SHL R1 //將R1中的二進制數左移一位
JR GOTO:DEC R3 //回到DEC那兒,重複執行,實現循環
本代碼塊實現兩個一位數的乘法,本質上可以實現兩個0-15之間的數的乘法。
首先解釋這個算法的原理
兩個一位數,比如8和9
在寄存器中他們的保存格式爲二進制
所以兩個數在計算機看來就是,1000和1001。(十進制與二進制的轉化請自行學習)
現在,R1存儲8,即R1 1000;R2存儲9,即 R2 1001
首先,右移R2,R2變成 0100,這個時候遺失的位就是1,那麼C 就是 1
因爲C爲1,所以程序到JRNC處不會跳轉,會繼續執行
這個時候就執行R0 = R0 + R1,即R0爲1000
然後將R1左移一位,R1 1 0000
因爲R2爲0100,右移一位C爲0,所以R0值不變
這個時候R1要再一次左移,變爲 10 0000
接着R2爲0010,右移一位C依舊爲0,所以R0的值還是不變
這時R1繼續左移,變爲100 0000
接着第四次將R1右移的時候,移出的位爲1,
那麼將執行R0 = R0 + R1,R0 1000 R1 100 0000
那麼R0的值會變成 100 1000。
因爲是第四次執行,所以程序就結束了
將0100 1000轉化爲十進制後,值就是72了。
因爲此程序實現的是一位數的乘法,所以,最多隻要右移四次,就可以將一個數的四個位都遍歷一遍了。
至於爲什麼要將R3寄存器的值初始化爲0005,而不是0004,大家可以簡單的思考一下
代碼總覽
//兩個一位數的乘法子程序,要將兩個數分別存入R1和R2中,最後的結果會在R0中,同時會改變R3的值
MUL
MVRD R0,0000
MVRD R3,0005
DEC R3
JRZ GOTO:RET //如果已經執行四次,則結束程序
SHR R2 //將R2中的二進制右移一位
JRNC GOTO:SHL R1 //如果移出的位爲0,則移動到將R1移位的地方
ADD R0,R1
SHL R1 //將R1中的二進制數左移一位
JR GOTO:DEC R3 //回到DEC那兒,重複執行,實現循環
RET
注:此代碼不是標準的彙編語言代碼,直接使用會報錯
TEC-2000 16位教學計算機彙編語言代碼截圖
我們先把R1寄存器和R2寄存器的值更改爲0008和0009,將R0的值置爲無關的一個值
接着運行剛剛寫的程序,會發現,R0的值已經變成了48,48就是72的十六進制值
雖然寄存器中存儲的值都是16位進制的,但是因爲0008和0009都是一位數,所以在寫法上不會有什麼區別。