正文 第四章 彙編語言程序設計(二)(2 / 3)

校正的原理是:二進製除2,隻要右移一位。但若是編製的十進製數除2,右移一位後,要加以校正,結果才正確。

【例5】二進製數轉換成十進製數

假定二進製數和轉換完的十進製數(以800碼表示)均存在存儲器內。轉換開始,先將存放十進製數(結果)的存儲單元清,再將二進製數左移一位,最高位移入進位。然後,數以十進製方法加倍並加入進位。如此連續移位、校正,一直到所有二進製的數碼向左移完為止,則轉換結束。

假設將3字節的二進製數轉換成4字節的30:0碼表示的十進製數。二進製數存在27029到27000存儲單元;準備將轉換完畢的碼表示的十進製數存在2706~2703(高位在27069),用2寄存器作為8數字節計數器,用寄存器作為二進製字節計數器。

手算是這樣進行的,先檢查一位乘數,若被查的位為1則將被乘數(0101)置於部分積中若為0,則將置於部分積中。放入的位置是使它的最低位與乘數當時被查位對齊,因為上例中乘數是四位,所以,需要檢查四次。同理,若乘數是八位需要檢查八次,十六位要檢查十六次,以此類推。左邊的手算式是由乘數的最低位開始檢查,而右邊則由最高位開始檢查,兩種方式產生的結果都是一樣的。最後將部分積累加起來,兩種方法結果相等。

用計算機進行乘法運算,可以效彷手算,但計算機的累加器有累加功能,所以,不用設存儲器來存放部分積,隻要在累加器中累加就可以。為實現對位,手算是對每次加入的部分積項進行移位,而計算機中是采用對累加器的內容進行移位。效果是一樣的。實現8位無符號乘法,運算第一方案二個入位無號數相乘,結果是16位,所以,用寄存器對當作計算部分積的累加器。因此,最後的結果在中,設2寄存器存放被乘數,X存放乘數,

(1)循環計數初值等於乘數的位數擴充到16位加清乘積單元清乘積單元乘積左移一位乘數左移一位從乘數來的進位是1嗎?是,將被乘數加到乘積上循環到最後一次了嗎?

(2)實現8位無符號數乘法運算第二方案

上例中實現乘法運算的方法是采用乘數和部分積左移,即從乘積的最高位開始檢查,決定是否將被乘數累加入部分積。而在第二個方案中,我們采用將被乘數左移,乘數右移。即從乘數的最低位開始檢查。效仿手算式中左邊的算法,乘數右移,采用邏輯右移指令,每移一位最高位補0。因此,移位後,立即檢查乘數寄存器是否為0,若為0就結束。因為,若乘數為0,則乘法運算就完成了,這樣可以去掉不必要的循環,提高運算速度。第一方案循環次數是乘數位數,是采用計數器來控製循環的第二方案采用按問題給定條件來控製循環。

Z80微型機的字長是8位,為保證運算精度要采用多字節運算,本例介紹多字節乘法運算子程序和除法運算子程序。

①多字節乘法運算子程序子程序

功能:完成指定字節長度的二進製無符號數相乘。

入口:乘數最低字節從存儲單元2250隻起存放,被乘數最低字節從22709起存放出口:乘積最低字節從22909起存放所用寄存器。

②多字節除法運算程序

功能:完成指定字節長度的二進製無符號數除法運算。

入口:被除數、除數存中,本例假定除數最低字節從2200隻存放起,被除數最低字節從2240存放。

將寄存器對的內容開平方,求到小數點以下8位。答案整數部分在0寄存器中,小數部分在5寄存器中。

五、調用子程序

上麵介紹了一些常用的子程序。在編製程序時,遇到與子程序相同的操作,例如求字符串長,代碼變換或算術運算,隻要用調用指令去調用相應的子程序就可以了。

主程序調用子程序要解決如下幾個問題

1.在主程序裏安排相應的指令,為子程序提供入口的數據。

2.在主程序中不希望被子程序更改的寄存器,在調用前用指令將其推入堆棧。子程序執行完畢,返回主程序時,再用口指令將其彈回原處,有時,也可以采用交換指令保護現場。

在主程序中,安排相應的指令來處理子程序提供的出口數據。下麵舉幾個實例說明。

【例1】確定一串碼字符的長度。字符串從存儲單元2041隻開始存放,字符串的結束用一個回車符來標誌。求出的字符串長度(不包括回車)存放在存儲單元2040隻中。

4.3 浮點數四則運算程序

4.3-1 在 Z80機上使用程序實現浮點數運算

Z80是定點機,它處理的數據,小數點都是固定的。小數點可以指定在符號位與最高數位之間,如以一字節表示一個數,可以認為小數點就在7與0之間。數可以是正數、負數,是純小數,否則就會溢出一出錯;也可以指定小數點放在數的最末位之後,這時參加運算的數都認為是整數。如果參加運算的數不是純小數或整數,則編製程序時要采用比例因子對參加運算的數進行處理,使它能滿是要求。小數點不固定的數稱為浮點數。當機器字長一樣時,采用浮點數表示數的範圍比采用定點數表示數的範圍大。但是定點機結構比浮點機簡單,因此,8位微型機一般都是定點機。當然在定點機上也能進行浮點數的運算。