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

使用的是16位微程序設計,指令爲TEC-2000 16位教學計算機的指令系統

要實現的功能:通過鍵盤鍵入一個數字,接收之後顯示出來,然後自動補上*號,接着再次鍵入一個數字,然後自動補上=號,接着輸出運算結果。

本文章實現,子程序:將一個兩位數以內的數(兩位數或者一位數),轉化爲兩個一位數(十位數和個位數),其中要轉換的數是R0,轉換之後的十位數爲R1,個位數爲R2。

本程序會使用到,R0、R1、R2、R3寄存器

代碼功能簡介

彙編語言指令 彙編指令的功能
MVRD DR,DATA DATA -> DR 或 DR = DATA 給寄存器DR賦值
MVRR DR,SR SR -> DR 將寄存器SR中的值賦給DR寄存器
SUB DR,SR DR - SR -> DR 將DR - SR的值存入DR中
INC DR DR +1 -> DR 實現DR的自增
CMP DR,SR DR - SR (解釋在文章稍後位置)
JR ADR 無條件跳轉到ADR地址上
JRNC ADR C = 0 時跳轉到地址ADR處繼續執行程序
JRC ADR C = 1 時跳轉到地址ADR處的位置繼續執行程序
RET 表示程序結束,類似於return

CMP DR,SR 指令表示進行運算 DR-SR,不會改變寄存器的值,而會改變C的值,而JRNC與JRC皆是根據C的值來進行操作的。如果DR>=SR,那麼C的值就是1,如果DR<SR,那麼C的值就是0。

CZVS:C表示進位位,Z表示是否爲0,V表示是否溢出,S表示符號位。(具體含義請自行學習)

關鍵字解釋

GOTO:並不是標準彙編語言,因爲跳轉的話需要寫上絕對地址,而絕對地址並不是每一次都一樣,但是又要將代碼表達出來,則使用這種方式,表示要跳轉的位置。



代碼塊功能介紹

代碼塊1
MVRD R3,000A	//將R3的值設置爲10,用來區分一位數和兩位數
MVRD R1,0000	//將記錄十位數值的寄存器初始化
CMP R0,R3	//比較R0與R3,看看R0是否爲兩位數
JRNC GOTO:MVRR R2,R0	//如果R0是一位數,則直接轉移到下面的MVRR R2,R0
SUB R0,R3	//如果R0爲兩位數,則減去10
INC R1		//將記錄R0十位數值的寄存器加一
JR GOTO:CMP  R0,R3	//跳回CMP,看看R0減過10之後,是否還是兩位數
MVRR R2,R0	//此時R0已經是一位數,直接將R0的值給R2即可

此代碼塊實現,將一個兩位數或者一位數,拆分爲十位數和個位數。要拆分的數存入R0中,拆分之後的十位數存入R1,個位數存入R2。

例如,R0當前爲25
首先判斷其是否大於10
結果爲真,所以將其減去10,得到R0爲15
接着會將R1自增,R1爲1
然後程序會跳回CMP R0,R3;繼續比較大小
得到R0還是大於R3,則再將其值減去10,得到R0爲5
然後R1自增,爲2
再一次判斷的時候,R0不大於R3,即R0已經是一位數了,那麼程序就會跳到MVRR R2,R0
將R0的值賦給R2,這個時候R2就是5

這樣最後的時候,R1中就是2,R2中就是5,實現拆分。

代碼總覽

//將R0中的兩位數(十進制),拆分,轉化爲R1中十位數,R2中個位數;會改變R3的值
SPLIT
MVRD R3,000A	//將R3的值設置爲10,用來區分一位數和兩位數
MVRD R1,0000	//將記錄十位數值的寄存器初始化
CMP R0,R3	//比較R0與R3,看看R0是否爲兩位數
JRNC GOTO:MVRR R2,R0 	//如果R0是一位數,則直接轉移到下面的MVRR
SUB R0,R3	//如果R0爲兩位數,則減去10
INC R1		//將記錄R0十位數值的寄存器加一
JR GOTO:CMP R0,R3	//跳回CMP,看看R0減過10之後,是否還是兩位數
MVRR R2,R0	//此時R0已經是一位數,直接將R0的值給R2即可
RET

注:此代碼不是標準的彙編語言代碼,直接使用會報錯

兩位數拆分
可以看到,將R0的值初始化爲000F,即十六進制的15,R1和R2置無關值
然後執行感剛剛編好的程序,就成功的將這個數拆分爲兩個數,R1爲十位數,R2爲個位數。

在這裏插入圖片描述

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