PC寄存器上的ARM LDR指令

2023-12-26

我是这样理解这个故事的:

  • PC寄存器保存指向下一条指令的指针
  • LDR指令正在将第二个操作数的值加载到第一个操作数中 (例如)
    
    LDR r0, [pc, 0x5678]  
    相当于这个“C代码”
    
    
    r0 = *(pc + 0x5678)
      
    它是带有基址偏移量的指针解引用。

我的问题是:

我找到了这段代码



LDR PC, [PC,-4]
  

它的评论就像猴子补丁等等。

我如何理解这段代码


pc = *(pc - 4)  

在这种情况下,“pc”寄存器将取消引用前一条指令的地址,并将包含指令的“机器代码”(不是指令的地址), 并且程序将跳转到该无效地址继续执行,并且可能我们会得到“分段错误”。 那么我缺少或不理解什么?



让我思考的是LDR指令中第二个操作数的括号。 据我所知,在 x86 架构上括号已经取消引用指针,但我无法理解 ARM 架构中的含义。



mov r1, 0x5678
add r1, pc
mov r0, [r1]
  

这段代码相当于吗?



LDR r0, [pc, 0x5678]
  

引自第 4.9.4 节ARM指令集文档(ARM DDI 0029E):

使用时R15作为基址寄存器,您必须记住它包含一个 8 字节的地址 从当前指令的地址开始。

这样该指令将加载位于 4 个字节的字after当前指令,希望包含有效地址。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PC寄存器上的ARM LDR指令 的相关文章

随机推荐

  • 为什么我会看到“Nodetool 状态连接被拒绝”?

    我已经通过运行 Ubuntu 16 的 EC2 实例上的服务安装了 Cassandra 但我一生都无法理解为什么我无法使 nodetool 状态正常工作 我听说我应该更改 cassanda env sh 以包含主机名 我已经在这里完成了 a
  • 在 MATLAB 中使用 Levenberg-Marquardt (lsqcurvefit) 获取协方差矩阵

    我正在使用 Matlab 中的 lsqcurvefit 函数对一些实验数据进行建模 数据采用特定的形状 因此算法只是调整该形状的系数来改变其幅度等 该模型运行良好并且拟合良好 我已经计算了卡方 Levenberg Marquardt 算法的
  • 为什么要使用开始活动?

    我一直在浏览 API 文档 并注意到从 API 级别 16 开始Context http developer android com reference android content Context html类包含以下方法 public
  • 使用房间时“无法合并 dex”

    我正在尝试向我的项目添加一个 房间 当我尝试构建项目时 出现错误 错误 任务 app transformDexArchiveWithExternalLibsDexMergerForDebug 执行失败 java lang RuntimeEx
  • 将 IDataErrorInfo 与嵌套对象结合使用

    我正在使用 MVVM 我想使用 IDataErrorInfo 来验证我的视图 我当前的实现包括嵌套对象和不同的 ViewModel 例如业务实体 客户 包含业务实体 地址 我在我的视图中直接访问地址 例如 Customer Address
  • 如何使 Protobuf 3 字段成为必填字段?

    我正在使用 GRPC proto buffers 在 GoLang 中编写我的第一个 API 端点 我对 Go 还很陌生 以下是我为测试用例编写的文件 package my package import context testing gi
  • 未找到 Mysqli 类。使用percona、php5-fpm、nginx、phalcon

    Fatal error Class TKStdlib mysqli not found in var www tk browser app application library tk stdlib DbAbstract php on li
  • 如何在rails中自定义bulma变量

    我正在使用 bulmarails gem 我想自定义它使用的一些变量 特别是字体颜色 根据布尔玛文档http bulma io documentation overview customize http bulma io documenta
  • Kubernetes 服务到底是什么以及它们与部署有何不同

    在阅读了这样的 Kubernetes 文档后 部署 https kubernetes io docs concepts workloads controllers deployment service https kubernetes io
  • 检查渲染方法

    我正在使用react redux 和react redux router 当我运行应用程序时 出现错误 我不明白它与我的 App js 中的 React 渲染函数有什么关系 在我看来 问题出在代码的其他地方 错误如下 Warning Rea
  • 如何在“map”对象中编写 OpenAPI 3 (Swagger) 规范的属性名称?

    我试图描述的 API 具有一个结构 其中根对象可以包含任意数量的子对象 属性本身就是对象 根对象中的 键 或属性是子对象的唯一标识符 值是子对象的其余数据 child1 bunch of stuff child2 bunch of stuf
  • Oracle 的 C# 参数化查询 - 严重且危险的错误!

    这绝对是一个嚎叫 我不敢相信自己的眼睛 而且我不敢相信 如果这是 C 中的一个真正的错误 那么在我之前没有人会发现这一点 所以我将其发布给开发人员社区的其他成员 让他们告诉我我做错了什么 我确信这个问题会让我说 DOH 然后用手掌用力拍打我
  • 将列中的任意字符串替换为 1

    我正在和熊猫一起工作 我的目标是将数据帧中包含 NaN 或字符串数 据的几列转换为或多或少的虚拟变量 0 代表 NaN 1 代表任何字符串 我想在不使用完整的字符串列表并替换它们的情况下执行此操作 因为存在拼写错误 这会导致错误 我已经能够
  • 通过 api.linkedin.com/v2/shares 检索共享时排序不正确

    根据文档 https learn microsoft com en us linkedin marketing integrations community management shares share api retrieve shar
  • DPDK RX/TX 回调示例应用程序中没有流量出现

    我是DPDK领域的新生 我从 DPDK 主页给出的示例应用程序开始 我被这个例子困住了 DPDK RX TX 回调示例应用程序 https doc dpdk org guides sample app ug rxtx callbacks h
  • Android检测webview URL变化

    我的 android 应用程序中有一个 webview 希望检测 url 何时发生变化 我想用它来当用户位于 info php 页面上时隐藏顶部栏中的信息按钮 并在用户不在 info php 页面上时再次显示该按钮 我用谷歌搜索但找不到任何
  • 如何将数组数据从javascript发送到flask

    如何将数组从 javascript 发送到 python Flask ajax 没有将数组 值 返回到 Flask 路由 任何人都可以帮助解决这些错误 flask route app route admin methods POST GET
  • 将 PHP 5.3 匿名函数转换为 5.2 兼容函数

    我在另一个函数中有这个匿名函数 build tree 它在 PHP 5 3 中运行良好 function nest list list index array index nodes list index build tree functi
  • Git Stash 的新分支会影响其他存储吗?

    我在主分支上存储了多个更改 现在我想从位于 0 的存储更改创建一个新分支 但我怀疑新分支的创建不会影响我的其他存储 因为git创建新分支后会丢弃我的藏品 将要git只删除 0 索引处的存储 还是会删除所有存储 隐藏的更改对我来说太重要了 简
  • PC寄存器上的ARM LDR指令

    我是这样理解这个故事的 PC寄存器保存指向下一条指令的指针 LDR指令正在将第二个操作数的值加载到第一个操作数中 例如 LDR r0 pc 0x5678 相当于这个 C代码 r0 pc 0x5678 它是带有基址偏移量的指针解引用 我的问题