2016-08-16 25 views
0

我正在通過Knuth的工作計算機編程的藝術,我對MIX彙編語言,特別是DIV運算符有疑問。MIX DIV運算符和打包字節數的轉換編號

在第133頁上,他給出了DIV操作符如何影響累加器和擴展寄存器(給定這些寄存器的特定狀態)和輸入存儲單元的示例。在這個堆棧溢出帖子中描述了這個問題(並回答了我的觀點):How does division work in MIX?

我的問題是,應答者將存儲在rAX(寄存器A和X)中的10字節字的值轉換爲單號,使用的方法,我不明白:

如果你做手工的劃分,通過轉換字節爲單一 數量,您將得到-210,501,825(如果您使用的是最小的一種的 字節 - 它是Knuths書中的6位(!))

有人可以通過此轉換步行嗎?

感謝, 山姆

回答

0

這取決於你使用的字節大小。 Knuth故意留下未定義的字節的底層實現 - 每個字節可以支持64到100個底層值,但最低爲64,這是大多數實現似乎使用的。

假設每個字節保存64個值,並說你有以下寄存器的內容在RA:

+ 01 02 03 04 05 

最低顯著字節是在右手邊。因此,整個的rA寄存器的 「整體」 的價值將是:

= (1 * 64^4) + (2 * 64^3) + (3 * 64^2) + (2 * 64^1) + (1 * 64^0) 
= (1 * 16777216) + (2 * 262144) + (3 * 4096) + (2 * 64) + (1 * 1) 
= 17314053 

這正是GNU MDK會給你:

MIX> weval 1(1:1),2(2:2),3(3:3),4(4:4),5(5:5) 
+ 01 02 03 04 05 (0017314053) 

對於獺兔(Ra和RX視爲一個寄存器)除了你把rA放在rX的左邊,它是一樣的想法。所以,如果您有:

rA = + 01 02 03 04 05 
rX = + 06 07 08 09 10 

的整體價值將是:

(1 * 64^9) + (2 * 64^8) + (3 * 64^7) + (4 * 64^6) + (5 * 64^5) + 
(6 * 64^4) + (7 * 64^3) + (8 * 64^2) + (9 * 64^1) + (10 * 64^0) 

對於小數實現,你只需用100取代64爲基數。所以在最初的例子中,你最終會得到:

= (1 * 100^4) + (2 * 100^3) + (3 * 100^2) + (4 * 100^1) + (5 * 100^0) 
= 102030405 

希望有幫助。

相關問題