[英]upper to lower case in 68K
我想从大写转换为小写。 这是我编写的代码,但仍然无法得到错误所在。 我知道从上到下隐蔽地我要减去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
#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个十六进制数字是从0
到15
值,而这恰好是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次幂的倍数,具体取决于数字在数字中的位置。 就是 十进制(以10为基数)格式的值123
被写为“ 123”,其中“ 1”代表10 2的值量,“ 2”代表10 1的值 ,“ 3”代表10 0的值。
请注意,书面的“ 123”格式不是123
。 数字123
纯粹是抽象的实体,用于在此处写下它的十进制格式(如“ 123”)实际上是值本身的不完美镜像,十进制格式对此格式(而不是对实际值)施加的限制很少。 可能是“基数N”格式的这些不完美之处的最简单示例:值123
以十进制秒的有效形式表示: 122.99999..
具有无限数量的“ 9”分数。 确切地来说,它仍然是相同的值123
,但是写的方式不同(实际上不像有限短的“ 123”变体那样)。
回到32323232
...您确实想将每个32
放在LONG中的特定BYTE上,但这将要求您使用32*256*256*256 + 32*256*256 + 32*256 + 32 = 538976288
十进制值。 首先要计算的是PITA。
如果您想知道“为什么汇编源中充满了那些烦人的十六进制数字?” ,这是冗长的答案和所有这些数字练习的重点。
32
是$20
(您应该可以即时转换两个幂)。 而且,如果要将$20
放在特定的字节位置,则必须编写#$20202020
(当然还是538976288
)。 不用计算器,写源代码当然可以解决,对吗? 因此,这就是答案,为什么十六进制格式在Assembly程序员中如此流行,它使您可以立即查看word / long值中特定字节的值是什么。
出于好奇,您的32323232
值会拆分为$01ED36A0
字节(您现在可以看到它们吗?每个字节为8位=两个4位,而4位=单个十六进制数字)。
并且如Mark所述,您需要添加。 因此,请修复您的来源:
MOVE.L USERID,D0
ADDI.L #$20202020,D0
MOVE.L D0,result
这确实会在地址result
( $101E
)的内存中显示“ abcd”。
关于“位操作” :如果您看一下采用十六进制格式的ASCII表,您将看到大写/小写字母具有相同的值,但第6位除外(第6位可用于大写字母,而可设置为小写)。
因此,通过执行ORI.L #$20202020,D0
您将在D0
长的每个字节中设置第6位,有效地对字母ASCII值执行“小写”操作。
ANDI.L #~$20202020,D0
( ~$20202020
是$DFDFDFDF
,倒置的$20
位模式)将对ASCII字母“大写”。
XORI.L #$20202020,D0
将上下翻转,并降低到大写,以表示ASCII字母。
所有这些都将无意义地破坏其他ASCII字符,例如数字和符号,因此,仅当您知道您的值仅包含字母( “垃圾回收,垃圾回收” )时,这些位技巧才可用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.