ARM指令 LDR、LDR伪指令、MOV的区别

ARM体系中,数据从内存到CPU寄存器之间移动只能使用LDR/STR(此处LDR不是伪指令),MOV只用于寄存器之间移动数据或者把有限制的立即数赋给寄存器。例如下面的语句:

    COUNT EQU 0x40003100

    LDR R1,=COUNT

    MOV R0,#0

    STR R0,[R1]

COUNT是定义的变量;LDR源操作数前有=号则为伪指令,含义是把COUNT值或一个常值赋给R1。LDR指令的源操作数前如果没有=号,则不是伪指令,类似指针操作,把COUNT这个值所代表的地址即0x40003100地址中的值赋给R1。这么说可能不太好理解,再举个例子:

    LDR R0,UARTLCON0,意思是将UARTLCON0寄存器的内容存入R1,类似C语言中的指针*UARTLCON0,取地址UARTLCON0指向的值;

    LDR R0,=UARTLCON0,意思是是将UARTLCON0寄存器的地址存入R1,类似C语言中的指针本身值UARTLCON0,即是一个地址值;

MOV语句只能把8bit连续有效位通过偶数次移位后的数赋给目的寄存器,如果想不受限制赋值,则推荐使用LDR,汇编器分析LDR伪指令语句根据=号后面的常值,如果常值能通过8bit常数加4bit移位数(乘2得循环移位数)获取到,则转换为MOV语句,否则转为LDR Rn [PC,#offset],即先把常值存放到PC+offset地址处,再赋值(因为ARM是32位指令系统,一个32位指令不能即包括指令又包括一个32位的数)。PC+offset地址位于LTORG伪操作声明的文字缓冲池(literal pool)内,缓冲池以LTORG开始,以END结束,也可只有LTORG,代表只有一个32bit空间。LTORG伪操作一般位于无条件跳转指令之后,或者子程序返回指令之后,如果不声明LTORG,系统把缓冲池放在所有程序之后(但是ARM指令要求偏移值到当前PC小于4KB,THUMB要求1KB),这样处理器不会错误的将缓冲池中的数据当做指令来执行;

STR语句是把R0的值存放到以R1中的值为地址的存储单元中。

另外,LDR R0, [R1], #-4命令:读取R1地址上的存储器单元内容,然后R1=R1-4;STRCC r0, [r1], #4命令:把R0寄存器内容存储到地址为R1的存储单元上,然后R1=R1+4。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值