Ldr和bl指令】的更多相关文章

Ldr和bl在启动程序中,都是可以负责pc跳转的指令. 1)bl是地址无关指令,和什么地址无关呢?和当前的运行地址无关,链接器脚本中标明了一个运行地址,但是arm中的代码实际是从地址0开始运行的.这个时候实际的地址和运行地址是不符的,如果想让程序正常的运行,就得使用地址无关指令.比如在完成将程序复制到内存之前想要跳转到一个函数里,就得使用bl,因为bl跳转依靠的是相对地址,和运行地址无关,所以能完成跳转. 2)Ldr是地址有关指令,如果这个时候使用"ldr  pc,=函数名"来跳转,实…
arm B和BL指令浅析 B或BL指令引起处理器转移到“子程序名”处开始执行.两者的不同之处在于:(1)BL指令在转移到子程序执行之前,将其下一条指令的地址拷贝到R14(LR,链接寄存器).      由于BL指令保存了下条指令的地址,因此使用指令“MOV PC ,LR”即可实现子程序的返回.(2)B指令则无法实现子程序的返回,只能实现单纯的跳转.用户在编程的时候,可根据具体应用选用合适的子程序调用语句. AREA Init,CODE,READONLY;该伪指令定义了一个代码段,段名为Init,…
LDR(load register)指令将内存内容加载入通用寄存器 STR(store register)指令将寄存器内容存入内存空间中 #define GPJ0CON 0xE0200240 _start: ldr r0, =0x11111111 // 将立即数/非法立即数,赋值给r0 ldr r1, =GPJ0CON // 将GPJ0CON的地址赋给r1 str r0, [r1] // 寄存器间接寻址.把r0中的数写入到r1中的数为地址的内存中去 ldr r0,[r1] //将r1的值赋给r0…
ARM是RISC结构,数据从内存到CPU之间的移动只能通过L/S指令来完成,也就是ldr/str指令.比如想把数据从内存中某处读取到寄存器中,只能使用ldr比如:ldr r0, 0x12345678就是把0x12345678这个地址中的值存放到r0中.而mov不能干这个活,mov只能在寄存器之间移动数据,或者把立即数移动到寄存器中,这个和x86这种CISC架构的芯片区别最大的地方.x86中没有ldr这种指令,因为x86的mov指令可以将数据从内存中移动到寄存器中.另外还有一个就是ldr伪指令,虽…
ARM指令集中,LDR通常都是作加载指令的,但是它也可以作伪指令. LDR伪指令的形式是“LDR Rn,=expr”.下面举一个例子来说明它的用法. COUNT EQU       0x40003100 …… LDR       R1,=COUNT MOV      R0,#0 STR       R0,[R1] COUNT是我们定义的一个变量,地址为0x40003100.这中定义方法在汇编语言中是很常见的,如果使用过单片机的话,应该都熟悉这种用法. LDR       R1,=COUNT是将C…
位置无关码,即该段代码无论放在内存的哪个地址,都能正确运行.究其原因,是因为代码里没有使用绝对地址,都是相对地址.  位置相关码,即它的地址与代码处于的位置相关,是绝对地址 BL :带链接分支跳转指令,也是位置无关码(相对位置),用于调用函数用的. B:分支跳转指令,指目标不能太远,一般用于同一个文件下的目标地址跳转. LDR:通常都是作加载指令的,但是它也可以作伪指令,通常有两种不同的表示:  1)LDR pc, =MyHandleIRQ 表示将MyHandleIRQ地址放入pc寄存器中,相当…
@ 目录 为什么要有相对跳转和绝对跳转? 在程序中只有相对跳转/绝对跳转是否可以? B(BL)和LDR指令具体怎么执行的? B(BL)和LDR跳转范围是如何规定的? 为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的. 跳转执行:当指令执行到当前位置后跳转到其他位置执行.比如,在主函数中调用其他函数就是典型的跳转执行.其中跳转又分为绝对跳转和相对跳转. 绝对跳转:直接跳转到一个固定的,实实在在的地址. 相对跳转:相对于当前pc值的一个跳…
LDR/STR字和无符号字节加载/存储 1,LDR Rd,[Rn]   2, LDR Rd,[Rn,Flexoffset] 3, LDR Rd,[Rn],Flexoffset 4, LDR Rd,label ldr只能在当前PC的4KB范围内跳转 B只能在当前PC的32M范围内跳转 label标号实际上就是个地址 eg: 合法: ldr r1,[r2] ldr r1,[r2,#0x4];不能超过0xfff,否侧编译不能通过或者linker时有错 ldr r1,[r2,#label];所以这个经常…
刚开始接触uboot的时候,就一直对ldr指令很迷惑,因为这个指令有两层用法,一个是加载,一个是伪指令.今天闲着没事就来说一下这两个之间的区别. LDR伪指令的形式是"LDR Rn,=expr". LDR加载指令形式是"LDR Rn,COUNT" 其实也简单区分,"LDR Rn,=expr"是指把expr这个符号所在的地址赋值给Rn,"LDR Rn,COUNT"是指把地址为COUNT里面的内容赋值给Rn. 举个例子: COUN…
.text:00001260 A3 04 00 EB                             BL      sub_24F4 当前地址+ (偏移 << 2 + 8) = 目标地址 0x1260 + 0x4A3 * 4 + 8 = 24F4 偏移 = (目标地址 - 当前地址 - 8) >> 2 偏移 = (0x24F4 - 0x1260 - 8) / 4 = 0x4A3 假设跳转指令处的地址是A,跳转目标处的地址是B.B,BL指令保存的是偏移地址,这个地址的计算方…