#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