如何在ARM中使用MOV指令,并使用立即数作为第二个操作数

Sum*_*Tea 16 assembly arm

我刚开始研究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.汇编程序可能会为您执行此转换.