arm中这条指令是啥意思?arm ldr strr1,[pc,#212] ; @0x000005A8

LDR/STR和MOV有什么区别?ARM中的汇编指令貌似比51单片机的复杂啊_百度知道
LDR/STR和MOV有什么区别?ARM中的汇编指令貌似比51单片机的复杂啊
看书得出以下结论,不知对不对LDR
Rd ,Rd←[addressing](load)STR Rd ,[addressing]←Rd (store)MOV Rd ,operand2 ; Rd←operand2LDR可以装载32Wie立即数,而MOV只能装载8位图立即数貌似STR可实现地址偏移(是不是所谓前索引偏移?那么有后索引偏移么?)避免重复装载地址操作。
提问者采纳
MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的这个立即数要符合一个8位数循环右移偶数位的取值原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数可以看出,并不是所有数都可以表示成一个8bit数循环右移偶数位的LDR和STR用来存取内存,关于&索引偏移&,你是不是指pre-indexed addressing和post-indexed addressingpre-indexed addressing是指地址经过运算不写回基址寄存器post-indexed addressing则回写到基址寄存器比如pre-indexed addressing:mov r1,#0STR r0, [r1, #0x10]r1+0x10这个是所用的实际地址值,但是不回写入r1,在此句之后,r1=0post-indexed addressing:STR r0, [r1], #0x10r1+0x10这个是所用的实际地址值,这个值回写入r1,此句之后,r1=0x10还有一点是关于ldr的,其实ldr可以装载一个32bit立即数的说法并不确切,因为实际上并不是这一条语句装载了一个32bit立即数,比如ldr r1, =0x其实真正的汇编代码是将某个地址的值传递给r1,就是说需要一个地址存放0x这个立即数,实际上可以看作是一条伪指令而且如果这个立即数可以用mov指令的形式来表达,会被编译器实际用mov来代替比如:ldr r1,=0x10会变成mov r1,#0x10
提问者评价
非常感谢,希望能跟您做朋友
参考资料:
ARM ArchitectureReference Manual
为您推荐:
其他2条回答
LDR/STR 跟mov最大都差别是LDR/STR就是用来读跟写数据的,而mov是可以送数和读写数据...ARM的指令比较多,比51复杂,但是用C来写就差不多,就是寄存器多一点
ARM是哈佛结构的只用LDR和STR等访问内存指令
您可能关注的推广
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁ARM中ldrlo pc, [pc, al, ls1#2]是什么意思_百度知道
ARM中ldrlo pc, [pc, al, ls1#2]是什么意思
前面是一句比较语句,我理解是小于时执行该ldr语句,但该指令下的内存地址处的 [pc, al, ls1#2]是什么意思呢。这句语句下应该是代表什么的地址呢。
提问者采纳
这个是间接步长寻址吧al左移2位加到当前pc的地址,再把这个地址的指令装载到pc中来。即pc = pc + al && 2
提问者评价
来自团队:
其他类似问题
为您推荐:
arm的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁ARM指令集中,LDR通常都是作加载指令,但是它也可以作伪指令。初学者一般不会注意到它们的区别,其实在嵌入式开发过程中,这两条指令时非常常用的!我们应该了解他们的区别。
LDR伪指令的形式是&LDR Rn,=expr&。作用是装在一个32bit常数和一个地址到寄存器。下面举一个例子来说明它的用法。
COUNT EQU&&&&&& 0xLDR&&&&&& R1,=COUNTMOV&&&&&& R0,#0STR&&&&&& R0,[R1]
COUNT是我们定义的一个变量,地址为0x。
LDR&&&&&& R1,=COUNT&&是将COUNT这个变量的地址,也就是0x放到R1中。MOV&&&&& R0,#0是将立即数0放到R0中。
STR&&&R0,[R1]&&是一个典型的存储指令,将R0中的值放到以R1中的值为地址的存储单元去。实际就是将0放到地址为0x的存储单元中去。可见这三条指令是为了完成对变量COUNT赋值。
再举一个例子LDR&&&&&& R1,=COUNT&&&;这条伪指令,是将COUNT的地址赋给R1LDR&&&&&& R0,[R1]&&&;将COUNT的值赋给R0&ARM是RISC结构,数据从内存到CPU之间的移动只能通过LDR/STR指令来完成。&比如想把数据从内存中某处读取到寄存器中,只能使用ldr&比如:&ldr r0, 0x ;就是把0x这个地址中的值存放到r0中。
而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方。&x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中。&MOV是从一个寄存器或者移位的寄存器或者立即数的值传递到另外一个寄存器。从本质上是寄存器到寄存器的传递,为什么会有立即数,其实也是有限制的立即数,不是所有立即数都可以传递的这个立即数要符合一个8位数循环右移偶数位的取值。原因是,MOV本身就是一条32bit指令,除了指令码本身,它不可能再带一个可以表示32bit的数字,所以用了其中的12bit来表示立即数,其中4bit表示移位的位数(循环右移,且数值x2),8bit用来表示要移位的一个基数。
另外还有一个就是ldr伪指令,虽然ldr伪指令和ARM的ldr指令很像,但是作用不太一样。ldr伪指令可以在立即数前加上=,以表示把一个地址写到某寄存器中,比如:&ldr r0, =0x&这样,就把0x这个地址写到r0中了。所以,ldr伪指令和mov是比较相似的。只不过mov指令限制了立即数的长度为8位,也就是不能超过512。而ldr伪指令没有这个限制。如果使用ldr伪指令时,后面跟的立即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为 mov指令的。
阅读(...) 评论()ARM汇编指令请教 ldr r1,=0x中等号到底怎么用?_百度知道
ARM汇编指令请教 ldr r1,=0x中等号到底怎么用?
ldr r1,=0x 在百度中查过相关的提问,这个指令的功能是将0x的地址赋给R1,但是在我代码中,ldr r0,=GPGCON
ldr r1,=0x
str r1,[r0]那么就是将0x这个地址的数据到GPGCON,而实际却不是,而是将0x这个数据给GPGCON,到底怎么回事,哪位大侠能解释下,非常感谢!我是新手;
提问者采纳
如果label是立即数,就把数值赋给r0, 如果lable是标识符,就把label地址的值赋给r0
提问者评价
其他类似问题
为您推荐:
您可能关注的推广
汇编指令的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁1460人阅读
当中断或异常发生的时候,CPU自动将PC指向一个特定的地址,这个地址就是中断向量表。
在32位ARM系统中,一般都是在中断向量表中放置一条分支指令或PC寄存器加载指令,实现程序跳转到中
断服务例程的功能。例如:&
IRQEntry B HandleIRQ ;跳转范围较小&
LDR PC,=HandleFIQ& & &
;LDR伪指令等效生成1条存储读取指令和1条32位常数定义指令。32位常数存储在LDR指令四周的存储单元
中,相对偏移小于4KB。该32位数据就是要跳转到的中断服务程序入口地址。&
之所以使用LDR伪指令,是因为ARM的RISC指令为单字指令,不能装载32位的立即数 (常数),无法直接
把一个32位常数数据或地址数据装载到寄存器中。所以我们一般将中断向量按如下方式设置中断向量表
PC, Reset_Addr
PC, Undefined_Addr
PC, SWI_Addr
PC, Prefetch_Addr
PC, Abort_Addr
Reserved vector must be remained
PC, IRQ_Addr
PC, FIQ_Addr
Vector_Addr_Table
Reset_Addr
Reset_Handler
Undefined_Addr DCD
UndefinedHandler
SWIHandler
Prefetch_Addr
PrefetchAbortHandler
Abort_Addr
DataAbortHandler
IRQHandler
FIQHandler
上面中断向量表的第9行就是从地址0X开始分配一个字的空间(也就是4字节),这4个字节的内容就是Reset_Handler函数的地址0X。Reset_Addr的值就是这4个字节的首地址0X。
DCD是ARM的伪指令。作用是分配一个字的空间。功能类似于C51里定义一个数组并初始化。
Unsigned char Reset_Addr[4]={0x00,0x00,0x10,0x00};
对比一下就明白了。
再分析第1行。LDR只能在当前PC的4KB范围内跳转,B命令只能在当前PC的32MB范围内调转。
Reset_Handler的地址是0X,已经超出了当前PC的4K范围,所以不能用
LDR&&&& PC,&
这里不好理解,涉及到ARM的寻址方式。
LDR Rn,语句标号
这种表达式里,是相对寻址,基址是程序计数器PC,偏移量是语句标号到PC处的指令条数。
LDR PC,语句标号只能在当前PC的4KB范围内跳转的原因是这条指令译码后,偏移表达式占用指令代码32位的最后12位,也就是2^12=4KB。
完整的分析下,以复位为例。地址0X开始的4字节内容是复位处理函数Reset_Handler的地址0x。Reset_Addr的地址是0X。当产生复位时,PC=0x,跳到第1行语句执行。LDR&&&& PC, Reset_Addr把处的一个字的内容送到PC,然后PC跳转到0X处开始执行。
LDR&&&& PC, Reset_Addr是间接寻址,就是把地址Reset_Addr处的一个字送给PC。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2440次
排名:千里之外}

我要回帖

更多关于 ldr伪指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信