首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么需要在LDR指令中从label中减去1?

LDR指令是汇编语言中的一条指令,用于将指定内存地址中的数据加载到寄存器中。在LDR指令中从label中减去1的目的是为了确保正确加载目标地址的数据。

在汇编语言中,label是用来标记代码中的特定位置或标识符的。当程序执行到LDR指令时,它需要知道要加载数据的确切地址。而在汇编语言中,label所代表的地址是指向下一条指令的地址。

由于LDR指令的执行需要一定的时间,而指令的执行是按照顺序进行的,所以在执行LDR指令之前,label所代表的地址还没有被更新为下一条指令的地址。因此,如果直接使用label作为地址进行加载,将会加载到错误的数据。

为了解决这个问题,可以通过在LDR指令中从label中减去1来获取正确的地址。这是因为在汇编语言中,指令的地址是按照字节计算的,而LDR指令的长度为4个字节。所以,通过从label中减去1,可以得到正确的地址,确保加载到的是目标地址的数据。

需要注意的是,这种做法是针对特定的汇编语言和编译器的行为而设计的,不同的汇编语言和编译器可能会有不同的处理方式。在具体的开发过程中,应该根据所使用的汇编语言和编译器的规范来确定是否需要在LDR指令中从label中减去1。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 云数据库(CDB):https://cloud.tencent.com/product/cdb
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iot
  • 移动开发(移动推送、移动分析):https://cloud.tencent.com/product/mobile
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 元宇宙(Metaverse):https://cloud.tencent.com/product/metaverse
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

ARM汇编之加载寄存器

将常数加载到寄存器 只有在执行内存加载数据时,才能用单个指令将任何 32 位立即数加载到寄存器。这是因为 ARM 和 Thumb-2 指令的长度仅是 32 位。...用 LDR Rd, =const 加载 LDR : 虚拟地址取一个单个的32位值 Rd : 目的操作数,寄存器 const : 常量 LDR Rd,=const 伪指令可在单个指令构造任何 32...汇编程序通过下列方式转换 LDR r0, =label指令: 将 label 的地址放入文字池(在代码嵌入的一部分内存,用于存放常数值) 生成程序相对的 LDR 指令,以便文字池读取该地址 用一个字符串覆盖另一个字符串的...ARM 代码例程: DCB 指令定义一个或多个存储字节 LDR 和 STR 指令使用后变址寻址来更新其地址寄存器 加载和存储多个寄存器指令 ARM、Thumb 和 Thumb-2 指令集包含用于内存加载和在内存存储多个寄存器的指令...LDR r, labelLDR r, =label的区别: LDR r, =label 会把label表示的值加载到寄存器,而LDR r, label会把label当做地址,把label指向的地址的值加载到寄存器

1.1K20

嵌入式:LoadStore之单寄存器的存取指令

Store型的,即它对数据的操作是通过将数据存储器加载到片内寄存器中进行处理,处理完成后的结果经过寄存器存回到存储器,以加快对片外存储器进行数据处理的速度。...指令说明 基址寄存器加上或减去一个无符号立即数或者 寄存器偏移量构成存储器访问地址。...相对PC的形式 LDR|STR {} {B} Rd, LABEL 举例: LDR R8,[R10] ;R8←[R10] LDRNE R1,[R5,#960]!...(相对PC形式) LDR R0,[R1],R2,LSL #2 ;将地址为R1的内存单元数据读取到R0,然后R1←R1+R2*4 LDRB R0,[R2,#3] ;将内存单元(R2+3)的字节数据读到...R0,R0的高24位被设置为0 LDR R1,[R0,-R2,LSL #2] ;将R0-R2*4地址处的数据读出,保存到R1,R0,R2的值保持不变。

67320
  • 汇编指令-位置无关码(BL)与绝对位置码(LDR)(2)

    LDR:通常都是作加载指令的,但是它也可以作伪指令,通常有两种不同的表示:  1LDR pc, =MyHandleIRQ 表示将MyHandleIRQ地址放入pc寄存器,相当于PC=MyHandleIRQ...LDR r0,=label    //用于加载立即数或一个地址值到指定寄存器               //如果label是立即数: LDR r0,=0X123 ;将0X123存入r0              ...//如果name是个标识符: LDR r0,=label_1 ;将label_1所指向的地址值存入r0 2)LDR PC,MyHandleIRQ 表示将 MyHandleIRQ地址的值放入pc寄存器...例如: LDR r0,[r1]        //将R1的值存到r0 LDR r1,[r2,#16]     //将(r2+16)地址的内容存到r1 LDR r1,[r2],#4     ...注:ARM9是3级流水线,也就是PC处理时正在执行第1指令的同时对第2条指令进行译码,并将第3条指令存储器取出,如下图所示,PC总是指向第3条指令取值的地方。 ?

    2.4K70

    ARM指令

    B Label程序无条件跳转到标号Label处执行 CMP R1, #0 BEQ Label 当CPSR寄存器的Z条件码置位时,程序跳转到标号Label处执行。...BL Label 当程序无条件跳转到标号Label处执行时,同时将当前的PC值保存到R14 BX指令的格式为: BX{条件} 目标地址 BX指令跳转到指令中所指定的目标地址...SBC指令完成的功能是将操作数1减去操作数2,再减去标志位C的取反值,结果送到目的寄存器。 RSB逆向减法指令完成的功能是将操作数2减去操作数1,结果送到目的寄存器。...RSC带借位的逆向减法指令完成的功能是将操作数2减去操作数1,再减去标志位C的取反值,结果送到目的寄存器。...STR R0, [R1 , #8] ;将R0的字数据写入以R1+8为地址的存储器。 STRH指令用于源寄存器中将一个16位的半字数据传送到存储器

    72420

    第014课 Jz2400_ARM异常与中断体系详解

    1 让LR减去某个值,让后赋值给PC(PC = 某个异常LR寄存器减去 offset) 减去什么值呢? 也就是我们怎么返回去继续执行原来的程序,根据下面这个表来取值 ?...模式 * 现在, 切换到usr模式 * 设置栈 * 跳转执行 */ /*2 故意引入一条swi指令*/ /*3 在_start这里放一条swi指令*/ 查看异常向量表...: e5910000 ldr r0, [r1] 下载烧写 程序执行完全没有问题 程序备份修改代码 swi可以根据应用程序传入的val来判断为什么调用swi指令,我们的异常处理函数能不能把这个...我们得读出swi 0x123指令,这条指令保存在内存,我们得找到他的内存地址 执行完0x123指令以后,会发生一次异常,那个异常模式里的lr寄存器会保存下一条指令的地址 我们把lr寄存器的地址减去4就是.../*5*/ /* 保存现场 */ /*7 发生中断时irq返回值是R14 -4 为什么减去4,硬件结构让你怎么做就怎么做 */ /* 在irq异常处理函数中有可能会修改r0-r12,

    1.6K20

    实战操作系统 loader 编写(上) -- 进入保护模式

    1. 引言 此前的文章,我们详细介绍了引导扇区跳转到 loader 的工作: 启动扇区跳转到 loader 引导扇区的工作已经告一段落,接下来我们的工作就是编写我们的 loader 了。...,然后才能通过跳转指令,将控制权 loader 再交给 kernel。...在软盘寻找 kernel.bin 想了解更加详细的内容,参考此前引导扇区加载 loader 的代码: 启动扇区跳转到 loader 主要步骤仍然是: 循环读取根目录区的一个扇区 循环读取当前扇区内的一个条目...,然后去覆盖上述最后一步的长跳转指令操作数,这看起来是如此 treak。...附录1 — 源码 由于本文对 boot 代码、kernel 代码均没有任何修改,我们只是使用了此前已经编写、编译好的代码,所以在这部分不再贴出相应代码,Makefile 也不再包含他们的编译指令

    1K20

    什么?Arm放弃了自家的汇编语法?改投GNU了?

    语法格式: ADR{cond} register,label ADR R0, lable ADRL伪指令:将中等范围地址读取到寄存器 ADRL伪指令为中等范围地址读取伪指令。...语法格式: LDR{cond} register,=[expr|label-expr] LDR R0,=0XFFFF0000 ;mov r1,#0x12 对比一下 注意:(1ldr...伪指令ldr指令区分 下面是ldr指令ldr r1,=val @ r1 = val 是伪指令,将val标号地址赋给r1 【与MDK不一样,MDK只支持ldr r1,=val】 下面是...ldr指令ldr r2,val @ r1 = *val 是arm指令,将标号val地址里的内容给r2 val: .word 0x11223344 (2)如何利用ldr指令实现长跳转...ldr pc,=32位地址 (3)编码解决非立即数的问题 用arm伪指令ldr ldr r0,=0x999 ;0x999 不是立即数, 六、GNU汇编的编译 1.

    2.2K30

    5_LED程序涉及的编程知识

    而RISC不提供“一站式”的加法指令调用四条单CPU周期指令完成两数相加:内存a加载到寄存器,内存b加载到寄存器,两个寄存器数相加,寄存器结果存入内存a ​ ARM芯片属于精简指令集计算机(...CPU执行指令,比如: str r1, [r0] // 将r1的值写入r0所指的内存 ​ 上面例子,mov、add、ldr、str等都是汇编指令,或者说它们是“助记符”──帮助我们记忆的。...label: instruction @ comment ​ label,即标签,表示地址位置,可以通过label得到指令/数据地址 ​ instruction,即指令...指令),执行,CPU内部寄存器R1等于10 其中,机器码eb000000,BL指令各位的解析如下: ​ imm[23:0]是PC值与标签的偏移值除以4,但是此处的偏移值是0,为什么尼?...减去4后,赋值给寄存器r2 ​ 指令执行过程,如下: ​ CPU内存的addrA+4地址取机器码e2812004(即add r2, r1, #4指令),执行后,CPU内部寄存器R2等于14 ​ CPU

    54910

    汇编语言之ARM32汇编

    所有变量和标签必须顶格 一般我们将伪指令大写,变量和标签小写 内存数据的读写 内存读取数据 LDR R0,[R1] ;将内存地址为R1的字数据读入寄存器R0。...;标号即为地址 LDR R0,label ;将标号对应的内容赋值给R0 复杂格式如LDR R0,[R1],R2,LSL#2 其中 []运算优先 2....LDR指令 这个指令和内存读取指令长的一模一样,如果我们在使用的时候加个等号,那么它就是另外一个指令 ;如果不加等号 是内存读取功能 LDR R0,label ;获取标签所对应的内存数据赋给R0...;一旦加了等号,则变成了传送指令 LDR R0,=label ;将标号对应的实际物理地址值赋值给R0 此时它的作用和mov无异 LDR R0,='a' ;直接将字符数据传送给R0 实际上,加了等号的LDR...; 使用 putR0 #10 使用 语法格式 延伸 第一个$label是干嘛用的呢,由于宏的内部处理方式的替换,为了避免标签名称的冲突,增加一个标识 ;假如我要在宏匹配定义一个函数fun, 当我调用两次的时候

    3.1K60

    linux内核1-GNU汇编入门_X86-64&ARM

    内存搬运数据使用LDR和STR指令,它们把源寄存器和目的寄存器作为第一个参数,要访问的内存地址作为第二个参数。...ARM寻址模式 模式 示例 文本 LDR Rd, =0xABCD1234 绝对地址 LDR Rd, =label 寄存器间接寻址 LDR Rd, [Ra] 先索引-立即数 LDR Rd, [Ra, #4...载入地址 = r2 + r3 有时候可能需要在把计算出的地址的内容读取后,再把该地址写回到基址寄存器,这可以通过在后面添加感叹号!...LDR r1, =x LDR r2, [r1] 下面的代码展开后,将会相邻的文本池中加载x的地址,然后加载x的值,存入r2寄存器。也就是,下面的代码与上面的代码是一样的。...BX指令跳转到寄存器给定的地址处,最常用于通过跳转到lr寄存器而函数调用返回。

    4.8K20

    学 Linux 必会的 ARM 汇编指令

    (3)【减法指令】:SUB SUB 目的寄存器,操作数1,操作数2 把操作数1减去操作数2,并将结果存放到目的寄存器。...1、【LDR指令LDR 目的寄存器, LDR指令用于存储器中将一个32位的字数据传送到目的寄存器LDR R0,[R1] ;将存储器地址为R1的字数据读入寄存器R0。...LDR R0,[R1,R2] ;将存储器地址为R1+R2的字数据读入寄存器R0。 LDR R0,[R1,#8] ;将存储器地址为R1+8的字数据读入寄存器R0。...LDR R0,[R1,R2] ! ;将存储器地址为R1+R2的字数据读入寄存器R0,并将新地址R1+R2写入R1LDR R0,[R1,#8] !...2、【STR指令】 STR 源寄存器, STR指令用于源寄存器中将一个32位的字数据传送到存储器。该指令在程序设计中比较常用,且寻址方式灵活多样,使用方式可参考指令LDR

    3.9K10

    android 的hook技术,Android Native Hook技术(一)

    ] 0xe59fd02c, //4 ldr sp, [pc, #44] 0xe59f0010, //5 ldr r0, [pc, #16] 0xe59f1010, //6 ldr r1, [pc, #16...ldr sp, [pc, #44] ldr r0, [pc, #16] ldr r1, [pc, #16] ldr r2, [pc, #16] ldr r3, [pc, #16] ldr lr, [pc...因为ARM使用了ARM和Thumb两种指令集,所以代码进行区分: if (addr % 4 == 0) { /* ARM指令集 */ } else { /* Thumb指令集 */ } 这样进行判断的依据是...第二个for循环用新的跳转指令进行覆写,关键的三条指令分别保存在jump[0]-[2]: jump[0]赋值0xe59ff000,翻译成ARM汇编为 ldr pc,[pc,#0] ,由于pc寄存器读出的值是当前指令地址加...前面我们修改的是内存指令,为防止缓存的存在,使我们修改的指令执行不到,进行缓存的刷新: void inline hook_cacheflush(unsigned int begin, unsigned

    91710

    某手游智能反外挂产品原理浅析

    0x01:反外挂系统基本架构 1.该反外挂系统主要在U3D、反调试器、代码检验方面,反静态方面做了防护,主要技术用到混淆,内联、字符串加密、SMC等技术,大致框架如图2所示。...2.反调试:主要通过svc 0指令来获取进程状态,找到所有svc指令,找到open函数,patch掉就过了,让它返回失败....解密函数指令(前32字节),解密后指令计算crc、比较crc,相同后再解密其它函数指令,代码如下: LOAD:762CB7B8 LOAD:762CB7B8 ; 指令加解密 LOAD...,反函数指令加密回去,代码如下: 解密8个函数(解密前32字节) LOAD:762CB9C8 loc_762CB9C8 LOAD:762CB9C8 55 F8 04 1F LDR.W...00 20 MOVS R0, #0 LOAD:762B4F5E 70 BD POP {R4-R6,PC} 此时将libmono.so内存

    2K40

    uboot的relocation原理详细分析「建议收藏」

    网上资料称这些函数末尾存储变量地址的内存空间为Label,(编译器自动分配) 一条条指令来分析。...这3条指令说明,ARM对于变量test_val的寻址如下: (1)将变量test_val的地址存储在函数尾端的Label(这段内存空间是由编译器自动分配的,而非人为) (2)基于PC相对寻址获取函数尾端...Label上的变量地址 (3)对test_val变量地址进行读写操作 再来看其中的几条指令 ldr r3, [pc, #28] =====> r3 = [0x80e9d3fc + 0x1c] =...在arch/arm/lib/relocate.S ENTRY(relocate_code) ldr r1, =__image_copy_start /* r1 <- SRC...ubootld使用-pie而cc没有使用-fPIC或-fPIE,目标文件中就不会生成GOT,函数寻址还是在尾部Label中直接存储变量的绝对地址,但这个Label同样存在rel.dyn,uboot

    1.5K10

    Linux内核学习(二)之head.S文件分析前期准备

    一、使用Sourc Insight 来建立一个linux工程: 1为什么要使用SourceInsight: 对于一个真正的一个项目,往往有几十几百甚至上万个c文件、h文件,代码量非常大,代码之间关联非常复杂...b、要在整个工程搜索一个函数,可以使用快捷键:ctrl+shift+f c、要跳转到一个函数或者变量定义的地方去,可以使用快捷键:按住ctrl键,然后把鼠标放到你要查的函数或者变量上,并点击一下就行,...: 1、伪指令的意义: • 伪指令不是指令,伪指令指令的根本区别是经过编译后会不会生成机器码。...: • ldr 大范围的地址加载指令 • adr 小范围的地址加载指令 • adrl 中等范围的地址加载指令 • nop 空操作 • ARM中有一个ldr指令,还有一个ldr指令 • 一般都使用ldr...伪指令而不用ldr指令 5、adr与ldr : • adr编译时会被1条sub或add指令替代,而ldr编译时会被一条mov指令替代或者文字 池方式处理。

    82330

    详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    文章目录 1. 为什么要有相对跳转和绝对跳转? 2. 在程序只有相对跳转/绝对跳转是否可以? 3. B(BL)执行过程分析 4. LDR指令执行过程分析 4....B(BL)和LDR跳转范围是如何规定的? 1. 为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的。...当这段代码被放在0x00000000空间时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,但在指令6执行时使用绝对寻址的方法0x0000014跳转到了0xC000001C,但0xC000001C...BL指令的跳转地址是按照如下方式计算:   1、将指令24位带符号的补码立即数扩展为32位(扩展其符号位)原数变成 0000 0000 0000 0000 0000 0000 0001 0111。   ...在这26位需要使用1位表示向前跳还是向后跳,那么剩下的25bits就可以表示32 MBts的范围了,225=32M因此,B(BL)指令的跳转范围为-32MBytes~+32MBytes。

    1K30

    AArch64 学习(一) 基础指令, 内存布局, 以及基础栈操作

    苹果系列 iPhone 5s 开始的 A7 芯片一直到 A15, 以及 Apple M1 系列开始都是基于 ARMv8.x-A 规范的. 那我们见到的 AArch64 是什么呢?...上面说到指令集, 指令集是做什么用的呢? 我们为什么要了解这些? 指令集本质上定义了 CPU 提供的“接口”, 软件通过这些“接口”调用 CPU 硬件的能力来实现编程....本系列的目的: 为什么要了解 ARM 汇编指令? 对我们来说熟悉 ARM 汇编指令, 我们就能知道我们平常写的代码背后的本质, 以及背后的原理, 从而写出更高效, 更可靠的代码....相当于 X0 = *X1 ldr X0, [X1] // X0 = X0 + 1 ADD X0, X0, #1 // 再把 X0 寄存器的值, 保存到 X1 地址对应的内存, 相当于 *X1 =...栈空间分配的方向是大到小的, 和 Heap 分配的方向是相对的.

    2.5K30

    某地理位置模拟APP壳流程分析到破解

    1 //定位到dex的onCreate方法在内存指令,获取dex的onCreate指令并解密。 文件偏移 2F9F8 2 debug098 75DC6000 75E2C000 R ....def_75DF5A20 ; jumptable 75DF5A20 default case 比如 下面是dexOnCreate的指令, ?...但是加壳后的指令被变成了自己定义的了,我第一次想法是想通过分析加壳前与加壳后指令对应关系,只要找到足够多的指令就能将其还原,我简单加了两个apk测试,第一个中找到了如下的指令对应关系。...,不知道是免费版的原因,还是巧合,我成功修复了第二个apk,但是当我用这个关系来尝试修复要破解的程序时根本不行,后来想了想,这种方法应当不行,都自己实现了解释器,为什么还要让指令固定呢?...(^_^) 来回顾下壳的主要流程: 壳主soà反调试à解压并解密第二个soà主so跳到第二个so执行à第二人so注册native函数à解密原始DEXà程序跑起来后到Native onCreateà

    1.4K00

    详解汇编语言B和LDR指令与相对跳转和绝对跳转的关系

    1. 为什么要有相对跳转和绝对跳转? 顺序执行:指令一条一条按照顺序往下执行,比如变量的定义和赋值都是按照顺序执行的。 跳转执行:当指令执行到当前位置后跳转到其他位置执行。...当这段程序被放在0xC000000空间时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,在指令6执行时也可以使用绝对寻址的方法0xC0000014正确跳转到指令8所在的0xC00001C位置...当这段代码被放在0x00000000空间时,开始执行指令1,然后采用相对寻址的方法就可以运行到指令6,但在指令6执行时使用绝对寻址的方法0x0000014跳转到了0xC000001C,但0xC000001C...BL指令的跳转地址是按照如下方式计算:   1、将指令24位带符号的补码立即数扩展为32位(扩展其符号位)原数变成 0000 0000 0000 0000 0000 0000 0001 0111。   ...在这26位需要使用1位表示向前跳还是向后跳,那么剩下的25bits就可以表示32 MBts的范围了,225=32M因此,B(BL)指令的跳转范围为-32MBytes~+32MBytes。

    1.2K30
    领券