我刚开始研究ARM汇编语言,并不清楚如何使用MOV将立即数转移到寄存器中.
从ARM参考手册和我的教科书中可以看出,MOV指令后的立即数范围是0-255.但是,当我在ADS 1.2 IDE中使用我自己的PC进行测试时,指令
MOV R2, #0xFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
表现很好.根据规格,数字0xFFFFFFFF不在范围之外吗?
希望有人能帮我一臂之力.
问候.
Mic*_*urr 13
请记住,ARM可以对立即值执行一组操作,作为与ARM的操作码结合的桶形移位器的一部分.
这篇小文章对ARM汇编程序可用于将大型立即数装入ARM指令的小可用空间的一些技巧进行了最清晰的解释:
本文讨论了在生成MVN操作码以加载立即值的按位补码的特定示例中可能使用的技巧.
这些类型的操作不能用所有直接值来完成,但ARM组装者应该对它非常聪明(当然C编译器也是如此).如果不能执行移位/补充技巧,则通常将从PC相对位置加载该值,或者可以通过从几个指令"建立"该值来加载该值.
Mat*_*ery 12
单个臂指令只能编码立即数,可以表示为一个8位的立即值,通过任何偏移甚至的两个电源.
但是,还有一条MVN指令,它可以MOV反转所有位.因此,虽然MOV R2, #0xFFFFFFFF不能编码为MOV指令,但它可以编码为MVN R2, #0.汇编程序可能会为您执行此转换.