了解 intel 汇编中的 %rip 寄存器

2024-03-28

关于以下小代码,在另一篇关于结构大小和正确对齐数据的可能性的文章中对此进行了说明:

struct
{
 char Data1;
 short Data2;
 int Data3;
 char Data4;
} x;

unsigned fun ( void )
{
    x.Data1=1;
    x.Data2=2;
    x.Data3=3;
    x.Data4=4;
    return(sizeof(x));
}

我得到了相应的反汇编(64位)

0000000000000000 <fun>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   c6 05 00 00 00 00 01    movb   $0x1,0x0(%rip)        # b <fun+0xb>
   b:   66 c7 05 00 00 00 00    movw   $0x2,0x0(%rip)        # 14 <fun+0x14>
  12:   02 00 
  14:   c7 05 00 00 00 00 03    movl   $0x3,0x0(%rip)        # 1e <fun+0x1e>
  1b:   00 00 00 
  1e:   c6 05 00 00 00 00 04    movb   $0x4,0x0(%rip)        # 25 <fun+0x25>
  25:   b8 0c 00 00 00          mov    $0xc,%eax
  2a:   5d                      pop    %rbp
  2b:   c3                      retq   

我不知道如何计算右侧的项,这似乎是address of local variables用过的。此外,我不知道如何计算%rip register

您能否举一个例子来显示之间的联系%rip and %rsp or %rbp,即特别是在我使用时的地址计算中move指示。


RIP 寻址始终与 RIP(64 位指令指针)寄存器相关。所以它只能用于全局变量。 0 偏移量等于 RIP 寻址指令之后的下一条指令的地址。例如:

   mov  al,[rip+2]                     al=53
   jmp  short next   (length=2 bytes)   
db 53
next:
   mov  bl,[rip-7]   (length=6 bytes)  bl=53

通常,您不会将数据直接与代码混合,除非立即混合,但这显示了如果您实际运行具有非常小的偏移量的代码时会发生什么。

在您的代码中,您无法查看和检查偏移量(您会看到四个零),因为您反汇编了.o. Use objdump -drwC反汇编时显示符号名称/重定位。当您将此对象链接到可执行文件时,它们将由链接器填充。


访问相对于 `rbp 的局部变量的示例:

push rbp      ;save rbp
mov rbp,rsp   ;rbp = pointer to return address (8 bytes)
sub rsp,64    ;reserve 64 bytes for local variables
mov rax,[rbp+8];  rax = the last stack-passed qword parameter (if any)
mov rdx,[rbp];    rdx = return address
mov rcx,[rbp-8];  rcx = first qword local variable (this is undefined now)
mov r8, [rbp-16];  r8  = second qword local variable (this is undefined now)
.
.
mov rsp,rbp
pop rbp
ret
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 intel 汇编中的 %rip 寄存器 的相关文章

  • 如何查看JVM中JIT编译的代码?

    有什么方法可以查看 JVM 中 JIT 生成的本机代码吗 一般用法 正如其他答案所解释的 您可以使用以下 JVM 选项运行 XX UnlockDiagnosticVMOptions XX PrintAssembly 根据特定方法进行过滤 您
  • 分配内存空间的宏

    我需要让一个汇编程序员来计算帕斯卡三角形 https en wikipedia org wiki Pascal 27s triangle 这样帕斯卡三角形的每一行都与其他行分开存储在内存中 我想做一个 但我不知道如何使用宏在汇编中做到这一点
  • 英特尔® 事务同步扩展新指令 (TSX-NI) 与英特尔 TSX 有何不同?

    我在Intel的页面上找到了 https ark intel com products 97123 Intel Core i5 7500 Processor 6M Cache up to 3 80 GHz https ark intel c
  • x86-64 Linux 中不再允许使用 32 位绝对地址?

    64 位 Linux 默认使用小内存模型 将所有代码和静态数据置于 2GB 地址限制以下 这确保您可以使用 32 位绝对地址 旧版本的 gcc 对静态数组使用 32 位绝对地址 以便节省相对地址计算的额外指令 然而 这不再有效 如果我尝试在
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 左/右旋转进位的实际用途

    循环左进位和循环右进位指令有哪些实际用途 在我的汇编课上 我们无法想出一个有用的好例子 如果要将位从一个操作数移出并移入另一个操作数 SHL EAX 1 move sign bit of EAX RCL EDX into LSB of ED
  • 一条指令可以同时处于两种寻址模式吗?

    我在书中读到了以下内容从头开始编程 处理器有多种不同的访问数据的方式 称为 寻址模式 最简单的模式是立即模式 其中 要访问的数据嵌入在指令本身中 例如 如果我们想将寄存器初始化为 0 而不是给出 计算机要从中读取 0 的地址 我们将指定立即
  • 遍历内存编辑每个字节

    我正在编写汇编代码 提示用户输入一串小写字符 然后输出包含所有大写字符的相同字符串 我的想法是迭代从特定地址开始的字节 并从每个字节中减去 20H 将小写变为大写 直到到达具有特定值的字节 我对 Assembly 相当缺乏经验 所以我不确定
  • 汇编-符号标志和奇偶校验标志

    我不明白什么时候设置标志标志 什么时候设置奇偶校验 据我所知 符号标志表示运算结果的符号 0表示正数 1表示负数 那么为什么在下一个代码中 mov al 5 sub al 124 SF为零 结果是负数 关于PF 为什么a和b中设置了PF a
  • 为什么不能执行 mov [eax], [ebx] [重复]

    这个问题在这里已经有答案了 我可以做这个 mov eax ebx 和这个 mov eax ebx 甚至这个 mov eax ebx 但不是这个 错误C2415 mov eax ebx 只是wtf 为什么 它与 ptr1 ptr2 相同 为什
  • 如何在汇编语言中换行打印多个字符串

    我试图在汇编中的不同行上打印多个字符串 但使用我的代码 它只打印最后一个字符串 我对汇编语言非常陌生 所以请耐心等待 section text global start start mov edx len mov edx len1 mov
  • Visual Studio 2017 上的简单装配程序

    386 model flat c stack 100h printf PROTO arg1 Ptr Byte data msg1 byte Hello World 0Ah 0 code main proc INVOKE printf ADD
  • 为什么 Visual Studio 使用 xchg ax,ax

    我正在查看程序的反汇编 因为它崩溃了 并注意到很多 xchg ax ax 我用谷歌搜索了一下 发现它本质上是一个 nop 但是为什么 Visual Studio 会执行 xchg 而不是 noop 该应用程序是一个C NET3 5 64位应
  • 减法进位标志

    我正在使用 MASM32 有了这个代码 mov eax 5 sub eax 10 CF 状态标志将被设置 但使用我的铅笔和纸 我实际上看到 MSB 没有任何进位 是的 我知道从较少的数字中减去大的数字集CF 但我想知道为什么 因为使用这段代
  • 为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

    我正在读一本书 计算机组织与设计RISC V版 我遇到了 S B 和 U J 指令类型的编码 我上面提到的那些类型有奇怪的编码立即字段 S B 类型将直接字段分为两部分 这是有道理的 因为所有指令编码都必须相似 但我无法理解为什么立即字段以
  • 在 x86-64 CPU 上通过交叉修改代码重现意外行为

    Question 对于可能在 x86 或 x86 x64 系统上触发意外行为的交叉修改代码有哪些想法 在这些系统中 交叉修改代码中的所有操作均已正确完成 但在执行处理器之前执行序列化指令除外修改代码 如下所述 我有一个 Core 2 Duo
  • 为什么在强度降低乘法和循环进位加法之后,这段代码的执行速度会变慢?

    我正在读书阿格纳 雾 https en wikipedia org wiki Agner Fog s 优化手册 https en wikipedia org wiki Agner Fog Optimization 我遇到了这个例子 doub
  • 68HC11计算sin(x)的汇编代码

    68HC11 使用泰勒级数或查找表计算正弦值的汇编代码是什么 显示值只能是整数 查找表如何工作 在这种情况下 如何使用它来实现泰勒级数 http en wikipedia org wiki Taylor series 如果您正在寻找浮点解决
  • “rep stos”x86 汇编指令序列有什么作用?

    我最近偶然发现了以下汇编指令序列 rep stos dword ptr edi For ecx重复 存储内容eax到哪里edi指向 递增或递减edi 取决于方向标志 每次 4 个字节 通常 这用于memset型操作 通常 该指令简单地写成r
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情

随机推荐

  • 为什么音频可视化直播无法在移动设备/Safari 上运行?

    我正在尝试基于 Three js 示例制作音频直播可视化工具 https trijs org examples q visua webaudio visualizer https threejs org examples q visua w
  • JSON回发到c# webmethod添加文字控制

    我正在学习 webmethods 并使用 JSON 发回给它们 我在下面得到了以下内容 但它说找不到 webmethod 404 不知道我哪里出错了 谢谢 在页面 JavaScript 中
  • 根据两列的值选择 pandas 数据框行

    我希望根据两列值选择一些特定行 例如 d user 1 2 3 4 item 5 6 7 8 f1 9 16 17 18 f2 4 5 6 5 f3 4 5 5 8 df pd DataFrame d print df Out f1 f2
  • 多个ViewModel之间的数据共享

    进一步我的问题如何绑定多个型号的 Bing 图钉 https stackoverflow com questions 7305582 how can i bind bing pushpins from multiple models 这对我
  • 如何获取组件中的列表值?

    例如 我导入了一个名为
  • PHP 7 - 不支持声明“strict_types”

    我在一个小项目中使用 PHP 7 也在我的本地和生产服务器中使用相同的配置 一切都在我的本地服务器上工作 但在完成 LAMP 设置后在生产服务器上我无法在 etc php 7 0 apache 下找到 apache 文件夹 所以我遇到了内部
  • 方括号多列 R

    我很困惑 我试图根据两列中的值隔离 df 的某些行 一如既往 我首先在实践数据中尝试这一点 我的代码工作正常 data1 lt df2 df2 fruit kiwi df2 fruit orange df2 fruit apple df2
  • 使用额外的命令从命令行启动 Android 活动 [重复]

    这个问题在这里已经有答案了 我创建了一个简单的活动 我想从命令行启动并从命令行传递一些值 但是 如果我尝试这样做 adb shell am start com example mike app SimpleActivity es Messa
  • android 画廊点击时没有滚动

    默认情况下 当单击图库项目时 图库会自动滚动到所单击的项目的中心 我怎样才能覆盖这种行为 我不希望图库在单击时滚动到中心 我希望它保持在原来的位置 我认为这是一个正确的解决方案 Override public boolean onSingl
  • 页面加载完成时打开 css 弹出窗口

    I have 纯CSS弹出窗口这个弹出窗口适用于单击按钮 但我需要在页面加载完成时弹出这个 div div class wrap a href modal one class btn btn big Modal a div div clas
  • 无法选择输入框中的文本

    我在表单上有以下用于浮动标签的 HTML CSS 抱歉 如果它有点混乱 box sizing border box html font 14px 1 4 Sans Serif form width 320px float left marg
  • C# 多线程:需要获取读锁吗?

    从多个线程读取变量之前是否需要获取变量的锁 简短的回答是 这取决于 长答案是 如果它不是共享值 即只有一个线程可以看到它 或使用它 则不需要任何同步 如果它是一个不可变的值 即您只设置一次 然后只读取一次 那么在没有同步的情况下这样做是安全
  • 如何排除嵌套复合聚合中的术语

    我在 elasticsearch 中的嵌套字段上使用复合聚合 但我想从结果中排除一些术语 此聚合正在运行 size 0 geo communication nested path geo aggs table composite size
  • 如何修复“android.os.NetworkOnMainThreadException”?

    我在运行 RssReader 的 Android 项目时遇到错误 Code URL url new URL urlToRssFeed SAXParserFactory factory SAXParserFactory newInstance
  • 如何让 jQuery Mobile 停止破坏 Ember.js 网站?

    我有一个用 Ember js 编写的网站 导航基于带有 符号的 url 我已经包含了 jQuery Mobile 我也有 jQuery 标准 jQuery 还可以 但是当我包含 jQuery Mobile 时 奇怪的事情发生了 符号从 UR
  • qtcreator - 未定义符号:sqlite3_column_table_name16

    我刚刚升级到 xubuntu 18 10 qt 不再为我工作 我已经删除并重新安装它 但没有帮助 我在终端上收到以下错误消息 显然某些 sqlite 依赖关系不正确 qtcreator qtcreator symbol lookup err
  • ASP.net MasterPage.master 不存在

    我在 IIS 服务器上发布我的网站时遇到问题 我无法直接访问它 因此我必须依靠其他人在 IIS 上配置我的网站 但是 当我上传我的网站时 出现此错误 Line 1 Line 2
  • Maven 程序集创建带有依赖项和类路径的 jar

    我有一个 Maven 项目 有很多依赖项 我想使用程序集插件将所有依赖项打包到一个 jar 中 但我不会将所有依赖项 jar 解压得一团糟 我希望它们全部进入 lib 文件夹 但我不知道如何添加类路径 我的pom
  • Orchard CMS - 配置基本 URL

    我使用 localhost frankgiotto 的基本 URL 在我的开发计算机上安装了最新版本的 Orchard 然后我将网站移至 www frankgiotto com 并在设置中更新了我的基本 URL 网站运行完美 我喜欢它的一切
  • 了解 intel 汇编中的 %rip 寄存器

    关于以下小代码 在另一篇关于结构大小和正确对齐数据的可能性的文章中对此进行了说明 struct char Data1 short Data2 int Data3 char Data4 x unsigned fun void x Data1