汇编LDR指令
接下来是LDR,⾸先要说的是有两个家伙,他们都叫LDR。
⼀个是LDR伪指令,⼀个是LDR指令,名字相同却不是⼀个东西。
区分的⽅法就是看第⼆个参数,如果有等号,就是伪指令。
LDR指令:
例1: ldr r0, 0x12345678 // 就是把0x12345678这个地址中的值存放到r0中。⽽mov不能⼲这个活,mov只能在寄存器之间移动数据,或者把⽴即数移动到寄存器中。
例2:ldr r0,r1 //表⽰把r1寄存器中的值放⼊r0
例3:ldr r0,[r1] // [r1]表⽰r1中值对应内存的地址,所以是把r1中的数当作⼀个地址,把这个地址中的值放⼊r0.
LDR伪指令:
例1(⽴即数): ldr r0, =0x12345678
这样,就把0x12345678这个地址写到r0中了。所以,ldr伪指令和mov是⽐较相似的。只不过mov指令限制了⽴即数的长度为8位,也就是不能超过512。⽽ldr伪指令没有这个限制。如果使⽤ldr伪指令时,后⾯跟的⽴即数没有超过8位,那么在实际汇编的时候该ldr伪指令是被转换为mov指令的。
例2(标号): ldr r0, =_start :将指定标号的值赋给r0
这⾥取得的是标号 _start 的绝对地址,这个绝对地址(链接地址)是在链接的时候确定的。它要占⽤ 2 个 32bit的空间,⼀条是指令,另⼀条是⽂字池中存放_start 的绝对地址。
这⾥对⽐⼀下,adr r0, _start,和 ldr r0, =_start
汇编指令汇总它们的⽬的是⼀样的,想把标签的地址给r0,区别是⼀个是相对地址,⼀个是绝对地址。⽬的⼀样,但是得到的结果不⼀定相同。结果是否相同,就要看这个PC的值,是否和链接地址相同了。
转载:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论