#32323232
...嗯,那個,價值32323232
。但是您試圖將它應用到4個BYTE字符,並將其加載爲32位(LONG)值,這意味着每個字符佔用它自己的8位,就像在MOVE.L USERID,D0
之後D0
是$41424344
,其中$41 == 65 == 'A', $42 == 66 == 'B', $43 == 67 == 'C', $44 == 68 == 'D'
一樣。
在十六進制格式的每個字母(8位)具有正好兩個十六進制數字,因爲1十六進制位爲值從0
到15
和這正是4位可以在總編碼,所以它的完美轉換的4位< => 1十六進制數字。
但是,如果您將該值取$41424344
並將其從十六進制轉換爲十進制,則將獲得1094861636
。它仍然是一樣的價值,但突然間,字母不再容易「看得見」了。它們作爲65*256*256*256 + 66*256*256 + 67*256 + 68 = 1094861636
被隱藏,因爲8位可以編碼256
不同的值,所以通過乘以256
的功率,可以將十進制值放在特別是BYTE的LONG中。因此,例如66*256*256
表示「長整數中的第三個最低有效字節」,或者從技術上來說,它意味着將十進制值66
「向左移動16位」。實際上,如果您將66
加載到D1
中,並且執行LSL.L #16,D1
,則您將計算66*256*256 == 66*65536 == (66<<16)
而不使用乘法指令。
這是關於數字「基本N格式化」是如何工作的,即你有M位數字(0到N-1)的值,每個數字代表N的第i次冪的倍數,取決於它在數字中的位置。 IE瀏覽器。值爲123
的十進制格式(基數10)格式化爲「123」,其中「1」表示值的數量爲10 「2」表示10 「3」表示10 值。
請注意,書面的「123」表格不是編號123
。數字123
是純粹的抽象實體,用於在這裏寫下來的十進制格式如「123」實際上是數值本身的不完美鏡像,對此格式的十進制格式強加的限制很少,而不是實際值。可能是「基本N」格式的這些缺陷的最簡單示例:值123
具有十進制秒有效形式:122.99999..
具有無限量的「9」分數。它仍然是完全相同的值123
,但寫法不同(並且不像實際上那樣,有限短的「123」變體)。
所以回到你的32323232
......你確實想把每個32
放在特定的BYTE中,但是這需要你使用32*256*256*256 + 32*256*256 + 32*256 + 32 = 538976288
十進制值。哪個是PITA要計算的頭。
如果你想知道「爲什麼彙編源程序充滿了那些煩人的十六進制數?」,這裏就是這個冗長的答案和所有這些數字練習的要點。
32
是$20
(你應該能夠在你的腦海中迅速轉換兩個冪)。如果你想在特定的字節位置放置$20
,你必須編寫#$20202020
(當然它仍然是538976288
)。沒有計算器,這當然是可以管理的,而在寫源代碼的時候,對吧?所以這就是答案,爲什麼十六進制格式在彙編程序員中非常流行,它允許您立即看到什麼是字/長值的特定字節值。
只是爲了好奇,你的32323232
值分裂成$01ED36A0
(你現在可以看到它們嗎?每個字節是8位=兩個4位,4位=單個十六進制數字)的字節。
而且,馬克指出,您需要添加。所以,解決您的源:
MOVE.L USERID,D0
ADDI.L #$20202020,D0
MOVE.L D0,result
這確實會顯示在地址result
($101E
)在內存中 「ABCD」。
關於"bit manipulation":如果你看看用十六進制格式的ASCII表,你會看到大/小寫字母有除第6位,這是明顯的大寫字母相同的值,並設置爲小寫。
所以通過這樣做ORI.L #$20202020,D0
您將設置每個字節的第6位打包在D0
長,有效地爲字母ASCII值「小寫」。
ANDI.L #~$20202020,D0
(~$20202020
是$DFDFDFDF
,反轉$20
位模式)將對ASCII字母做「大寫」。
XORI.L #$20202020,D0
對於ASCII字母,會將上部翻到下部和下部到大寫。
所有這些將毫無意義地破壞其他ASCII字符,如數字和符號,所以這些位技巧只有當你知道你的值只包含字母時纔可用(「垃圾進入,垃圾出」)。
使用位掩碼可能會好得多。當除了大寫字符之外還有其他內容時,減法32可能會出現意想不到的行爲......就像小寫字母。 –
這是32位十進制數,而不是十六進制 - 重複4次的十進制數本質上將減去一個隨機數。使用十六進制附:要從大寫變成更小,您需要添加不減。 –
@大衛Hoelzer:謝謝,你是什麼意思的位掩碼,對不起我是新的程序員在68K – nas2016