使用的是16位微程序設計,指令爲TEC-2000 16位教學計算機的指令系統
要實現的功能:通過鍵盤鍵入一個數字,接收之後顯示出來,然後自動補上*號,接着再次鍵入一個數字,然後自動補上=號,接着輸出運算結果。
本文章實現的是,子程序:獲得輸入的一個數字的值,將該輸入的值存放到R0寄存器中,如果按下的按鍵不是一個數字,則繼續等待輸入,直到鍵入的值爲數字時,才結束程序。
這個子程序會使用R0寄存器存放鍵入的按鍵對應的數值,同時會改變R2和R3寄存器的值
代碼功能簡介
彙編語言指令 | 彙編指令的功能 |
---|---|
MVRD DR,DATA | DATA -> DR 或 DR = DATA 給寄存器DR賦值 |
IN PORT | [PORT] -> R0 從外界設備輸入 |
OUT PORT | R0 -> [PORT] 將R0的值往外界設備輸出 |
SHR DR | DR/2 -> DR,C 將寄存器DR的值向右移動一位,移出的位存入C中 |
AND DR,SR | DR and SR -> DR 將DR與SR的值做‘’且‘’操作 |
SUB DR,SR | DR - SR -> DR 將DR - SR的值存入DR中 |
CMP DR,SR | DR - SR (解釋在文章稍後位置) |
JRNC ADR | C = 0 時跳轉到地址ADR處繼續執行程序 |
JRC ADR | C = 1 時跳轉到地址ADR處的位置繼續執行程序 |
RET | 表示程序結束,類似於return |
注:DATA表示十六位進制的一個具體的數字
DR、SR表示寄存器
PORT爲串行端口號
ADR表示地址,絕對地址
CZVS:C表示進位位,Z表示是否爲0,V表示是否溢出,S表示符號位。(具體含義請自行學習)
關鍵字解釋
GOTO:並不是標準彙編語言,因爲跳轉的話需要寫上絕對地址,而絕對地址並不是每一次都一樣,但是又要將代碼表達出來,則使用這種方式,表示要跳轉的位置。
代碼塊功能介紹
代碼塊1:
IN 81 //檢查串行輸入口是否有按鍵被按下
SHR R0
SHR R0
JRNC GOTO:IN 81 //如果沒有按鍵被按下的話,就向上回到IN 81那兒,循環檢查是否有按鍵被按下
IN 80 //將串行輸入口的數據,存入R0寄存器
此代碼塊實現從鍵盤接收一個按鍵的ASCII碼的值。先由IN 81,將81串口的信息接收到R0,再通過SHR將R0的二進制值向右移動兩位。*因爲將二進制數整體向右移動,左邊高位補0,而原二進制數的最低位將被遺失,這個遺失的值在彙編語言中會保存在C中。*通過判斷第二次移動,所遺失的值,來得到鍵盤上是否有按鍵被按下。
如果第二次移動所遺失的值,爲0,則表示沒有按鍵被按下,這時候就跳轉回IN 81的位置,繼續等待按鍵按下。
如果遺失的值爲1,則程序會繼續向下執行,那麼就會從80串口接收鍵盤按下的值,然後存到R0中,這個時候存入的值,是那個按鍵所對應的ASCII碼的值,詳情參見ASCII碼錶。
代碼塊2
MVRD R2,0030 //定義輸入的下界 ASCII 0
MVRD R3,003A //定義輸入的上界 ASCII 9之後的那一個
CMP R0,R2
JRNC GOTO:IN 81 //如果輸入的字符的ASCII碼比0小,就回到IN 81那兒,重新等待輸入
CMP R0,R3
JRC GOTO:IN 81 //如果輸入的字符的ASCII碼比9大,就回到IN 81那兒,重新等待輸入
CMP DR,SR 指令表示進行運算 DR-SR,不會改變寄存器的值,而會改變C的值,而JRNC與JRC皆是根據C的值來進行操作的。如果DR>=SR,那麼C的值就是1,如果DR<SR,那麼C的值就是0。
這個代碼塊用來判斷鍵入的值是否爲數字的ASCII碼,如果不是則重新等待鍵入,如果是則程序繼續向下執行。
因爲CMP只能判斷大於等於和小於兩種狀態,所以下屆用0,上界用9之後的那一個
代碼總覽
//獲得輸入的一個數字值的子程序,將獲得的值存放在R0中,會改變R2和R3的值
CIN //因爲此程序爲子程序,之後要在主程序中調用,所以人爲的給一個名字
MVRD R0,0000
IN 81 //檢查串行輸入口是否有按鍵被按下
SHR R0
SHR R0
JRNC GOTO:IN 81 //如果沒有按鍵被按下的話,就向上回去IN 81那兒,循環檢查按鍵
IN 80 //將串行輸入口的數據,存入R0
//可省略
MVRD R2,00FF
AND R0,R2 //清空R0中高八位的字節內容
MVRD R2,0030 //定義輸入的下界 ASCII 0,0030爲48的十六位進製表示法
MVRD R3,003A //定義輸入的上界 ASCII 9之後的那一個
CMP R0,R2
JRNC GOTO:IN 81 //如果輸入的字符的ASCII碼比0小,就回到IN 81那兒,重新等待輸入
CMP R0,R3
JRC GOTO:IN 81 //如果輸入的字符的ASCII碼比9大,就回到IN 81那兒,重新輸入
OUT 80 //輸出讀入的字符
SUB R0,R2 //將讀入的字符ASCII碼值換算成具體數值
RET
注:此代碼不是標準的彙編語言代碼,直接使用會報錯
彙編語言在TEC-2000機上的代碼截圖展示