您的位置:首页 > 其它

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

2012-03-12 19:02 1091 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  存储 语言 汇编 c