为什么在 NASM 中使用 RIP 相对寻址?

2024-01-01

我有一个适用于 Mac OS X 的程序集 hello world 程序,如下所示:

global _main


section .text

_main:
    mov rax, 0x2000004
    mov rdi, 1
    lea rsi, [rel msg]
    mov rdx, msg.len
    syscall

    mov rax, 0x2000001
    mov rdi, 0
    syscall


section .data

msg:    db  "Hello, World!", 10
.len:   equ $ - msg

我想知道这条线lea rsi, [rel msg]。为什么 NASM 强迫我这样做?据我了解,msg只是指向可执行文件中某些数据的指针并执行mov rsi, msg会将该地址放入rsi。但如果我更换线路lea rsi, [rel msg]与 ,NASM 抛出此错误(注意:我正在使用命令nasm -f macho64 hello.asm):

hello.asm:9: fatal: No section for index 2 offset 0 found

为什么会发生这种情况?有什么特别之处lea that mov不能做吗?我怎么知道何时使用每一个?


有什么特别之处lea that mov不能做吗?

mov reg,imm加载一个即时常量进入其目标操作数。立即常量直接编码在操作码中,例如mov eax,someVar将被编码为B8 EF CD AB 00如果地址为someVar is 0x00ABCDEF。 IE。将这样的指令编码为imm是地址msg你需要知道的确切地址msg。在与位置无关的代码中,您事先并不知道它。

mov reg,[expression]加载位于描述的地址处的值expression。 x86指令的复杂编码方案允许有相当复杂的expression: 一般来说是这样reg1+reg2*s+displ, where s可以是 0,1,2,4,reg1 and reg2可以是通用寄存器或零,并且displ是立即位移。在 64 位模式下expression还可以有另一种形式:RIP+displ,即地址是相对于下一条指令计算的。

lea reg,[expression]使用所有这些复杂的方法来计算要加载的地址地址本身 into reg(不像mov,它取消引用计算出的地址)。因此,在编译时不可用的信息,即绝对地址,将位于RIP,可以在不知道其值的情况下编码在指令中。 nasm 表达式lea rsi,[rel msg]被翻译成类似的东西

    lea rsi,[rip+(msg-nextInsn)]
nextInsn:

它使用相对地址msg-nextInsn而不是绝对地址msg,从而允许汇编器不知道实际地址但仍然对指令进行编码。

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

为什么在 NASM 中使用 RIP 相对寻址? 的相关文章

  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • 整数溢出问题

    我不断遇到整数溢出问题 我不知道如何解决它 有人可以帮忙吗 edx 包含 181 eax 包含 174 xor eax edx mov edx 2 div edx 假设你谈论的是x86 div edx这实际上没有意义 32位div将edx
  • 英特尔的最后分支记录功能是英特尔处理器独有的吗?

    最后分支记录是指存储与最近执行的分支相关的源地址和目标地址的寄存器对 MSR 的集合 它们受英特尔酷睿 2 英特尔至强和英特尔凌动处理器系列的支持 http css csail mit edu 6 858 2012 readings ia3
  • Intel:序列化指令和分支预测

    英特尔架构开发人员手册 http www intel com content www us en architecture and technology 64 ia 32 architectures software developer v
  • 使用 Gas 生成与位置无关的代码 (-fPIC)

    我尝试在 x86 64 上创建共享库但失败 问题归结为以下代码 请不要介意 它没有多大意义 section data newline ascii n section text globl write newline type write n
  • 将 C 代码转换为 x86-64 汇编

    我正在尝试将 C 代码转换为 x86 64 我的目标是反转链表 传入的两个参数是 head ptr 和 offset to 以获取指针字段的地址 即指向列表中下一个节点的指针 据我了解 head ptr是通过rdi寄存器传入的 offset
  • IDA pro asm 指令更改

    我只是想知道我怎样才能 更改IDA视图A中的asm指令 如何编辑指令 对于 实例 jnz 到 jmp 如何插入新指令 call func1 调用 func2 插入到现有的 代码 我知道如何制作 diff 文件 我知道如何在我的 DLL 上应
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 学习 (N)ASM 的最佳资源是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想学习汇编已经有一段时间了 尽管我之前尝试过几次 但我还没有真正能够超越 Hello world 有
  • 从 DX:AX 寄存器转移到单个 32 位寄存器

    我在添加 16 位乘法的乘积时遇到问题 我想将一年 例如 2015 年 乘以 365 为此 我 mov dx 0 to clear the register mov ax cx cx holds the year such as 2015
  • ICC 中的 -O3 会扰乱内在函数,使用 -O1 或 -O2 或相应的手动汇编即可

    这是后续这个问题 http stackoverflow com questions 49791664 o2 in icc messes up assembler fine with o1 in icc and all optimizatio
  • 68000 汇编语言 - CMPI.B

    What are the contents of the CCR and D3 after the following instructions sequence executes Perform the calculation by ha
  • 比“add esp, 4”更小的指令

    又是我 我的程序中有很多 add esp 4 我正在尝试减小它的大小 是否有任何更小的指令可以替代 add esp 4 pop edx 或者您不介意破坏的任何其他整数寄存器 这就是现代编译器实际上所做的 https stackoverflo
  • 使用 ACPI 在 MS-DOS 中关闭计算机

    我在基于 Pentium 的计算机上运行 MS DOS 6 22 主板支持 ACPI 并且想知道是否有一个可以用来关闭计算机的汇编语言例程 或者它是否比那个更难 即主板 具体的 基本上 我想创建一个小程序来从命令行关闭计算机 这是专门为此编
  • 为什么 LED 保持亮起而不是闪烁?

    这是使用 pic16f676 中的 TIMER0 中断使 LED 闪烁的 MPASM 代码 端口 A 的引脚 0 RA0 未切换至关闭位置 请帮忙 我是图片组装的新手 我想掌握图片 有没有高手帮我学习一下 我需要以 1 秒的间隔眨眼 代码是
  • 如何恢复 x86-64 寄存器保存约定

    fibonacci cmpq 1 rdi ja recursive movl 1 eax ret recursive push rbp push r10 movq rdi r10 leaq 2 rdi rdi call fibonacci
  • INT 13h 无法读取超出特定扇区的数据

    我正在为我的操作系统编写内核 在将磁盘扇区加载到内存时遇到问题 以下是从磁盘加载扇区的函数代码部分 mov ax 0x3000 mov es ax mov ax 0x0201 mov bx word ptr bp 6 bx 0x000 0x
  • 如何在 AVX/AVX2 中递增向量

    我想使用内在函数来增加 SIMD 向量的元素 最简单的方法似乎是为每个元素加 1 如下所示 note vec inc之前已设置为1 vec mm256 add epi16 vec vec inc 但是是否有任何特殊指令来增加向量 类似于in
  • 将代码保存在 L1 缓存中

    我一直在阅读维基百科关于 K 编程语言的文章 http en wikipedia org wiki K programming language Performance characteristics这就是我所看到的 解释器的小尺寸和语言的
  • 为什么这个函数在额外读取内存时运行速度如此之快?

    我目前正在尝试了解 x86 64 上某些循环的性能属性 特别是我的 Intel R Core TM i3 8145U CPU 2 10GHz 处理器 具体来说 在循环体内添加一条额外的指令来读取内存几乎可以使性能提高一倍 而细节并不是特别重

随机推荐

  • 如何从不同的IP地址注册服务?

    我正在学习 Eureka 和 Spring Boot 的微服务 我已经知道如何并成功地将所有服务注册到 Eureka 中 但所有服务和 Eureka 都是在 Localhost 上创建的 我想知道 我是否可以存储其他计算机上的服务 并且仍然
  • 在 Haskell 中生成另一种语言的代码

    我想在 Haskell 中生成另一种语言的代码 但我对如何生成代码感到困惑 来解决这个问题 我正在寻找 Haskell 中语言的抽象和优雅的表示 这对于代码生成也很有用 有问题的语言是 InstallScript link http kb
  • 使用 maven 分发 spring-boot 应用程序的替代方案(spring-boot:repackage 除外)

    据我所知 spring boot maven plugin 已经提供了一种将整个应用程序分发到胖可执行 jar 文件中的方法 spring boot maven 插件 http docs spring io spring boot docs
  • 什么是标记语言? (XML、YAML、JSON)

    有人可以向我解释什么是标记语言吗 为什么 XML 是一种标记语言 而 YAML 和 JSON 不是 我读过很多文章 但没有一篇给出任何类型的例子 如果有人可以通过一些例子帮助我理解这一点 那就太好了 XML 等标记语言的目的是表示文件 而
  • 如何在重复3次后停止refetchInterval反应查询(useQuries)?

    这里我使用 React Query 来获取数据 我在 useQuries refetchInterval 中使用了 3000 毫秒 所以每 3 秒就会重新获取数据 因此 当我显示数据时 它会随着我们重新获取数据而自动更改 但就我而言 我不想
  • 通过 Bash/Shell 在 Crontab 中启用/禁用任务

    有没有办法使用 Bash Shell 启用和禁用 Crontab 任务 因此 当用户启动 Server 1 时 它将启用 Server 1 Crontab 行 依此类推 当用户停止服务器 1 时 服务器 1 Crontab 行将被禁用 这可
  • 未处理的异常:MissingPluginException(在通道 plugins.flutter.io/firebase_core 上未找到方法 Firebase#initializeCore 的实现)

    E flutter 6763 错误 flutter lib ui ui dart state cc 209 未处理的异常 MissingPluginException 在通道plugins flutter io firebase core上
  • Python桌面应用程序数据库[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions Python支持多种数据库 但我想要
  • Numpy 和 Pandas(通过 conda 安装)比通过 pip 运行得更快?

    我有两个Python环境 3 6 我通过 conda 在一个环境中安装软件包 通过 pip 在另一个环境中安装软件包 然后我发现 conda 提供的 numpy 和 pandas 比 pip 版本运行得更快 对于大多数场景 只是想知道为什么
  • 如何在 iText 中设置标题字体颜色

    HeaderFooter header new HeaderFooter new Phrase test new Font bf times false header setAlignment Element ALIGN CENTER he
  • iPhone 应用程序拾取声音

    我试图根据用户是否发出响亮的声音来执行某个操作 我不想做任何语音识别或任何事情 只需根据 iPhone 是否听到响亮的声音执行操作即可 任何建议 教程 我在苹果开发者网站上找不到任何内容 我假设我没有正确地寻找或搜索 对您来说最简单的事情就
  • Python,如何从文件中读取字节并保存? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想从文件中读取字节 然后将这些字节
  • 如何在 C# 中获取和设置环境变量?

    如何获取环境变量 如果缺少某些内容 请设置该值 Use the 系统 环境 https learn microsoft com en us dotnet api system environment class 方法 var value S
  • 在datalab中导入gcsfs报错

    当我在datalab中导入gcsfs时 import gcsfs 我遇到了与 fsspec 包相关的无效语法错误 和版本有关系吗 File usr local envs py3env lib python3 5 site packages
  • CSS3+Javascript 位置粘性可滚动内容

    我在以下工具的帮助下创建了一个侧边栏position sticky而且效果很好 请参阅下面的脚本以了解带有以下文本的颜色识别 当黑色区域向下滚动时 绿色区域会粘在相对于红色顶栏的粘性位置 但绿色区域的内容溢出了页面的视口 当滚动到达页面末尾
  • 警告:预算:初始超出最大预算

    当我运行时出现以下错误npm build prod Error budgets initial exceeded maximum budget Budget 1 00 MB was not met by 500 42 kB with a t
  • golang TCPConn.SetWriteDeadline 似乎没有按预期工作

    我试图通过检查 golang 返回的错误来检测发送失败TCPConn 写 http golang org pkg net TCPConn Write 但为零 我也尝试过使用TCPConn SetWriteDeadline http gola
  • CPU通用寄存器通常是内存映射的吗?

    我对内存映射和内存映射 I O 感到困惑 通用寄存器 例如 ARM 架构中的 r0 r1 等 通常是内存映射的吗 不 这些寄存器位于实际 CPU 或多核 CPU 的 CPU 核心 内部 您无法通过加载或存储到任何内存地址来访问它们 内存映射
  • 将 angularjs 与 Turbolink 一起使用

    我正在尝试在我的应用程序中使用 Angularjs 框架和 Turbolinks 页面更改后 它不会初始化新的事件侦听器 有什么办法让它发挥作用吗 提前致谢 AngularJS 与 Turbolinks 涡轮链接也AngularJS两者都可
  • 为什么在 NASM 中使用 RIP 相对寻址?

    我有一个适用于 Mac OS X 的程序集 hello world 程序 如下所示 global main section text main mov rax 0x2000004 mov rdi 1 lea rsi rel msg mov