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

使用的是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都是一位數,所以在寫法上不會有什麼區別。

在這裏插入圖片描述

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