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

如果大家將我前面寫的代碼直接在TEC-2000 16位教學機真機上運行,就會發現和我所展示的東西不相符合。但是如果仔細查看,可以看出,在執行G 2060之後,寄存器R1與R2中的數值是沒錯的,也就是數據沒錯,但是輸出的結果出了問題。
這個問題是因爲真機在執行out輸出指令的時候,並不是一瞬間就完成輸出的,而是有延時的,如果你的代碼在真機out輸出延時的時候又有了一個out的輸出函數,那麼就會導致新的out輸出函數將原本的out輸出的值替換掉,導致輸出方面的缺失。
所以在真機上所運行的程序,都要在out輸出函數之後加上這樣一個代碼段

OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81

這段代碼的意思就是,將R0中的內容,輸出到屏幕上,然後通過IN 81獲取當前系統的一些狀態,將這個狀態存入R0中,接着使用SHR將R0右移一位,這被移出的一位存入到C中,然後判斷C的值,若爲0,則繼續獲取當前系統狀態。一直到從81接口讀取的值的第一位爲1時,繼續執行程序。

也就是說,通過81接口獲取的系統狀態,從低位往高位看,第一位表示是否完成輸出操作,第二位表示是否有鍵盤的按鍵按下,即輸入緩衝區中是否有字符,因爲程序若想要接收到鍵盤的信息,系統要先從鍵盤接收到信息,然後存入到緩衝區中,然後程序再去獲取。

所以要給原代碼的所有OUT輸出函數之後加上如上代碼段。

這裏有個小坑,就是如果單純的在OUT輸出函數之後加上那段代碼段,執行操作,輸出沒問題,但是最後的結果會不一樣,這是因爲在第一個函數2000中,這個函數實現了從鍵盤上接收一個數字鍵值所對應的數字值,並將這個數字值存入到R0中。接着要輸出這個值。如果這個時候加上了如上代碼段,會導致R0中的內容發生改變,從而讀不到正確的值。

可以先將R0的值放到R3中,然後使用如上代碼段之後,再將值還給R0即可。

如下是更改之後的2000位置的函數CIN代碼
補

而主函數中的內容就大同小異。

還有一個小bug就是,無論你最後算出的值是多少,最後輸出的時候都一定是兩位數,即使是3X2=06,或者0X6=00,這種情況。這樣的情況也容易消除,就是在主函數要輸出最後結果的時候,判斷一下R1中的值是否爲0,若爲零則直接跳到輸出個位數的地方。
這一小段代碼可以這樣實現

MVRR R0,R1
MVRD R3,0030
SUB R1,R3
JRZ GOTO:MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面緊接着的IN 81
MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面緊接着的IN 81

或者使用這種方式

MVRR R0,R1
SHR R1
JRNC GOTO:MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面緊接着的IN 81
MVRR R0,R2
OUT 80
IN 81
SHR R0
JRNC GOTO:IN 81		//返回上面緊接着的IN 81
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章