一位數乘法的彙編語言實現(一)

使用的是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機上的代碼截圖展示
一位數輸入

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章