2017-01-20 197 views
0

我想从大写转换为小写。 这是我编写的代码,但仍然没有得到错误在哪里。我知道从上到下隐蔽我已经减去32,以便尝试去做它。但是,在我运行该程序后,它不会以小写显示结果。 感谢您的帮助。68K中的大写字母小写

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

使用位掩码可能会好得多。当除了大写字符之外还有其他内容时,减法32可能会出现意想不到的行为......就像小写字母。 –

+2

这是32位十进制数,而不是十六进制 - 重复4次的十进制数本质上将减去一个随机数。使用十六进制附:要从大写变成更小,您需要添加不减。 –

+0

@大卫Hoelzer:谢谢,你是什么意思的位掩码,对不起我是新的程序员在68K – nas2016

回答

1

#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十六进制位为值从015和这正是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字符,如数字和符号,所以这些位技巧只有当你知道你的值只包含字母时才可用(“垃圾进入,垃​​圾出”)。

+0

非常感谢你的工作,并且我从你所解释的内容中了解得更多 – nas2016