68K以上到小写

时间:2017-01-20 02:18:22

标签: assembly

我想从大写转换为小写。 这是我写的代码,但仍然没有得到错误的地方。我知道要从上到下隐蔽我减去32以便尝试做到这一点。但是,在我运行程序后,它不会以小写形式显示结果。 谢谢你的帮助。

START       ORG    $1000
            MOVE.L USERID,D0
            SUBI.L   #32323232,D0          
            MOVE.L  D0,result            
            SIMHALT 
USERID      DC.L    'ABCD1234'           
result      DS.L    1
            END     START  

1 个答案:

答案 0 :(得分:1)

#32323232是......好吧,价值32323232。但是你试图将它应用于加载为32位(LONG)值的4个BYTE字符,这意味着每个字符占用它自己的8位,就像MOVE.L USERID,D0之后D0$41424344,其中$41 == 65 == 'A', $42 == 66 == 'B', $43 == 67 == 'C', $44 == 68 == 'D'

在十六进制格式中,每个字母(8位)恰好有两个十六进制数字,因为1个十六进制数字是从015的值,而这正是4位可以编码的总数,所以它是完美的转换4位< => 1个十六进制数字。

但是如果您将该值$41424344并将其从十六进制转换为十进制,您将获得1094861636。它仍然是相同的值,但突然间,字母不再容易“可见”了。它们隐藏在那里65*256*256*256 + 66*256*256 + 67*256 + 68 = 1094861636,因为8位可以编码256个不同的值,因此通过乘以256的幂,您可以将十进制值放在特定的LONG的BYTE中。因此,例如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浏览器。十进制(基数10)格式中的值123写为“123”,其中“1”表示值10 2 ,“2”表示10 1 < / sup>,“3”表示10 0 值。

请注意,书面的“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位=单个十六进制数字)。 / p>

正如马克所说,你需要补充一下。所以修复你的来源:

        MOVE.L   USERID,D0
        ADDI.L   #$20202020,D0
        MOVE.L   D0,result

这确实会在地址result$101E)的内存中显示“abcd”。

关于"bit manipulation":如果您要查看带有十六进制格式的ASCII表,您会看到大写/小写字母除了第6位之外具有相同的值,对于大写字母是明确的,并设置小写。

通过执行ORI.L #$20202020,D0,您将在D0长的每个字节中设置第6位,有效地为字母ASCII值执行“小写”。

ANDI.L #~$20202020,D0~$20202020$DFDFDFDF,倒置$20位模式)将为ASCII字母做“大写”。

对于ASCII字母,

XORI.L #$20202020,D0将从上到下翻转到大写。

所有这些都将毫无意义地破坏其他ASCII字符,如数字和符号,因此只有当您知道您的值仅包含字母(“垃圾输入,垃圾输出”)时,这些位技巧才可用。