以下是引用wfhao666在2013/1/17 14:11:40的发言:
有谁能告诉我,为什么经过MOVW之后,输出的数值变成40了?
这就是地址混合使用的典型~~~~~
10378转换为2进制为 0010 1000 1000 1010 从AIW中写入VW1时,由于VW1又VB1与VB2组成,VB2是VW1的低字节,VB1是VW1的高字节,至此,VW1的值仍然是10378
接下来楼主执行了VW向VD的转换,此时问题来了:
VW1中的10378被扩展到了32位,也就是其二进制已经变成了0000 0000 0000 0000 0010 1000 1000 1010了,此时的结果没有变化,被存入了VD0,就在存入的瞬间,魔法开始了。
VD0包含了VW0以及VW2,也就是说,VD0由VB0,VB1,VB2,VB3组成,而VW1由VB1,VB2组成,因此此时的VW1中的值实际上由VB1,VB2中组成,也就是说,此时的VW1的值是0000 0000 0010 1000,而这不正是10进制的40了么。
而因为监视值需要保持值得一致性,因此你才会在前面MOV-W指令中看到VW1的值为40。
总结:这是典型的程序员地址混用的错误!!!!!!!!!!!!!!!!!!!!!!!!!!正如我在你的令一贴中的结论一样。
专业的回答是成为CVLSAM马甲的重要因素。
Good Luck~