ARM中LDR加载指令

CMP R1,R3
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
以上代码中,
LDRCC R2,[R0],#4
STRCC R2,[R1],#4
是做什么的?

这段是在init.s程序中常用的,用途是将R0地址上的内容全部复制到R1内容指定的地址上去,属于内存块的搬移代码。加后缀cc就是需要cmp的比较结果。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-08-11
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令。
LDR伪指令的形式是“LDR Rn,=expr”。
第2个回答  2013-11-09
CMP r1,r3 //比较寄存器r1及r3的内容,此操作影响状态寄存器中的C状态位.
LDRCC r2,[r0],#4 //如C状态位被清零则将内存(地址存在r0中)开始的四字节读入r2.
STRCC R2,[R1],#4 //同上.
第3个回答  2015-09-07
LDR伪指令的形式是“LDR Rn,=expr”。作用是装在一个32bit常数和一个地址到寄存器。
举例:
COUNT EQU 0x56000054
LDR R1,=COUNT
MOV R0,#0
STR R0,[R1]
COUNT是我们定义的一个变量,地址为0x56000054。
LDR R1,=COUNT 是将COUNT这个变量的地址,也就是0x56000054放到R1中。
MOV R0,#0是将立即数0放到R0中。
STR R0,[R1] 是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。
实际就是将0放到地址为0x56000054的存储单元中去。
可见这三条指令是为了完成对变量COUNT赋值。
x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。
MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。
从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的。
这个立即数要符合一个8位数循环右移偶数位的取值。
原因,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。
另外还有一个ldr伪指令,ldr伪指令和ARM的ldr指令很像,但作用不太一样。ldr伪指令可在立即数前加上=,以表示把一个地址写到某寄存器中,比如:
ldr r0, =0x12345678,把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是比较相似,mov指令限制了立即数的长度为8位,是不能超过512。ldr伪指令没有这个限制。如使用ldr伪指令时,后面跟的立即数没有超过8位,在实际汇编的时候该ldr伪指令是被转换为 mov指令。
相似回答