如何在 Linux 64 位上用 C 编写简单的内联 asm 指令?

2024-06-26

我正在编写一个简单的 C 程序,我的要求是从程序的某些函数中打印 RIP(指令指针)。我不想使用 ptrace。

我用内联汇编尝试的一件事是:asm("movl %%rip, %0;" : "=r"(val) )这应该将我的 rip 寄存器值复制到变量 val,但我收到编译错误。

如果我使用 ebp/esp(它们是 32 位机器的基指针和堆栈指针),我不会收到任何编译错误,并且我的 val 分配了一些十六进制数字。

我这里有几个问题:

1)由于我的机器是63位,上面的指令如何能够读取32位寄存器?

2)为什么我无法读取 64 位的任何寄存器,有什么问题吗?'r'?

3) 当我使用 32 位的 eip 时,出现编译错误,这是否意味着 IP 寄存器的读取受到限制?


  1. 你的机器是64位,不是 63 位 =)。您能够读取 32 位寄存器,因为您正在将程序编译并作为 32 位可执行文件运行[1]。
  2. 您无法读取 64 位寄存器,因为您正在将程序编译并作为 32 位可执行文件运行。是的,您有一个 64 位处理器,但它仍然可以运行 32 位可执行文件(如果您的操作系统支持它,您的操作系统显然支持它),并且显然您的编译器工具链默认构建 32 位。如果您正在使用gcc,尝试使用-m64标志,或阅读编译器文档以获取更多信息。
  3. Unlike rip, the eip不能直接访问寄存器。你可以获得的值eip以描述的方式Jim在他的回答中。

[1] 无论如何,您都可以从 64 位可执行文件中读取 32 位寄存器; 32 位寄存器在 64 位模式下仍然可用,就像您可以在 32 位模式下访问 16 位寄存器一样。


您的示例中仍然存在一些问题:

首先,虽然rip可在 64 位模式下访问,可作为寻址模式访问;这不是一个普通的寄存器。如果你想加载它的值,你需要使用LEA, not MOV.

其次,因为rip是一个64位寄存器,你需要使用q您的说明上的后缀而不是l。这是解决这两个问题的示例程序:

#include <stdio.h>
#include <inttypes.h>

int main(int argc, char *argv[]) {
    uint64_t ip;
    asm("leaq (%%rip), %0;": "=r"(ip));
    printf("rip is 0x%016" PRIx64 "\n", ip);
    return 0;
}

这似乎在我的机器上运行得很好。

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

如何在 Linux 64 位上用 C 编写简单的内联 asm 指令? 的相关文章

  • 汇编PC相对寻址模式

    我正在研究数据路径 并一直在尝试理解分支指令 这就是我的理解 在 MIPS 中 每条指令都是 32 位 这是 4 个字节 所以下一条指令将是四个字节之外 举个例子 我说PC地址是128 我的第一个问题是理解这个128意味着什么 我目前的信念
  • SSE:如何将 _m128i._i32[4] 减少到 _m128i._i8

    我对 SSE 编码非常陌生 我想将 int32 类型的 m128i 4 的结果存储到 int8 类型的 m128i 中 m128i j i32 k 的值均在 127 和 127 之间 我认为伪代码如下 result i8 vec1 i8 0
  • Intel 上的 gcc 中的 _mm_pause 用法

    我参考过这个网页 https software intel com en us articles benefitting power and performance sleep loops https software intel com
  • 在 OllyDbg 和 Assembler 中,EBP+8 是什么意思?

    我正在学习 OllyDbg 中的汇编和调试技巧 以便学习如何使用未记录的函数 现在我遇到以下问题 我有以下代码部分 来自 OllyDbg MOV EDI EDI PUSH EBP MOV EBP ESP MOV EAX DWORD PTR
  • 使用8086汇编语言画圆[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我试图使用 8086 汇编器画一个圆 我尝试利用中点圆算法 https en wikipedia org wiki Midpoin
  • 3 操作数 imul 指令在 ia-32 汇编中到底起什么作用?

    我正在阅读说明 imul 0xffffffd4 ebp ebx 4 eax 我对它到底在做什么感到困惑 我明白那个imul乘法 但我无法弄清楚语法 我知道并且更喜欢 Intel MASM 语法 所以我将使用它 请注意 操作数的顺序在 AT
  • 了解近调用指令编码

    通过反汇编一些二进制代码 我发现了近调用指令call 0x8ae编码为e8 97 08 00 00 查看指令集参考 我发现这些指令被编码为 call XX XX XX XX lt gt e8 XX XX XX XX being XX XX
  • 未对齐的内存访问

    我正在开发不支持未对齐内存访问的嵌入式设备 对于视频解码器 我必须处理 8x8 像素块中的像素 每个像素一个字节 该设备具有一些 SIMD 处理功能 使我能够并行处理 4 个字节 问题是 8x8 像素块不能保证从对齐的地址开始 并且函数需要
  • 为什么使用寄存器 R12 时 POP 速度很慢?

    在最新的 Intel CPU 上 POP指令通常每周期具有 2 条指令的吞吐量 但是 当使用寄存器时R12 or RSP 除了前缀之外具有相同的编码 如果指令通过传统解码器 吞吐量会下降到每个周期 1 如果微指令来自 DSB 则吞吐量保持在
  • 在Windows 64位上将mod_wsgi模块加载到apache中的问题

    我正在尝试安装 mod wsgi 模块操作说明 http code google com p modwsgi wiki InstallationOnWindows 我从以下位置下载了 mod wsgi so这个来源 http www lfd
  • 如何将 4 位十六进制转换为 7 位 ASCII?

    作业是通过编写一个可以在 4 位十六进制和 7 位 ASCII 之间转换的子程序来学习汇编编程 起初我不知道 但经过一些研究后 我可以做出努力并绘制流程图并制作程序 但它并不完全正确 所以我请求您的指导来帮助我解决这个问题 实际的作业文本是
  • JE/JNE 和 JZ/JNZ 之间的区别

    在 x86 汇编代码中 有JE and JNE完全一样JZ and JNZ JE and JZ只是完全相同的事物的不同名称 条件跳转时ZF 零 标志 等于 1 相似地 JNE and JNZ只是条件跳转的不同名称 什么时候ZF等于 0 Yo
  • 汇编器堆栈对齐(或使用 PUSH 更好的未对齐示例)

    首先我了解 或者我认为我了解 堆栈未对齐的问题 但我知道 就像定义一样 将 16 位值推入 32 位宽的堆栈可能会导致堆栈未对齐 但我不明白的是 这是怎么发生的 因为PUSH and POP检查段描述符处的 D 标志 1 递增 递减 32
  • RAM 到 RAM 的 DMA 传输

    我的一个朋友告诉我 在 x86 架构上 DMA 控制器无法在两个不同的 RAM 位置之间传输 它只能在RAM和外设 如PCI总线 之间传输 这是真的 因为 AFAIK DMA 控制器should能够在位于总线上并具有地址的任意设备之间 特别
  • 如何配置和采样英特尔进程内性能计数器

    简而言之 我试图在用户级基准测试进程中实现以下目标 伪代码 假设 x86 64 和 UNIX 系统 results for iteration 0 iteration lt num iterations iteration pctr sta
  • 32 位 x86 汇编中堆栈对齐的职责

    我试图清楚地了解谁 调用者或被调用者 负责堆栈对齐 64 位汇编的情况相当清楚 它是由caller 请参阅系统 V AMD64 ABI 第 3 2 2 节栈帧 输入参数区域的末尾应按 16 对齐 32 如果 m256 在堆栈 字节边界上传递
  • emu8086中如何使用字符串

    我需要 emu8086 中字符串的帮助 我已经初始化了一个字符串 str1 db 0neWord 我有一个空字符串 str2 db 现在我需要检查所有信件str1并复制到str2 但如果字母在str1是 0 我需要将其替换为 O 如果不是
  • x86指令“call dword ptr ds:[00923030h]”是什么意思? [复制]

    这个问题在这里已经有答案了 下面的 x86 汇编指令有什么作用 call dword ptr ds 00923030h 我怀疑这是一个间接调用 但它到底是如何计算调用的地址的 编辑 已更新 每当你看到一个看起来像这样的内存操作数时ds 0x
  • 在嵌入式设备上投射指针

    我在 32 位嵌入式系统上转换和修改指针时遇到了一个奇怪的问题 红蜂经济标签 http www redwirellc com store node 1跑步连续操作系统 http contiki os org 再具体一点 uint32 t a
  • 为什么在Java中读取易失性和写入字段成员是不可扩展的?

    观察以下用 Java 编写的程序 完整的可运行版本如下 但程序的重要部分在下面的代码片段中 import java util ArrayList A not easy to explain benchmark class MultiVola

随机推荐

  • 单击 div 时更改复选框状态(真/假)

    我有一个带有图像 标签和输入复选框的 div 当我点击 div 时 我喜欢什么 它会将复选框状态从 true 更改为 false 并且反之亦然 jQuery markerDiv click function if this find inp
  • 在循环的setTimeout中使用IIFE,但是为什么呢? [复制]

    这个问题在这里已经有答案了 我知道这是一个经典的js问题 我的问题不是如何解决这个问题 而是IIFE如何解决这个问题 感谢其他答案链接 但我没有找到我想要的答案 for var i 0 i lt 5 i setTimeout functio
  • 追踪 int[] 的分配情况

    当查看我的remote通过 JMX 在 JVisualVM 中的应用程序中 我看到空闲时内存使用呈锯齿状 进行堆转储并使用 JVisualVM 进行分析 我发现很大一部分内存位于几个大的内存中int 没有引用的数组 通过比较堆转储 我可以看
  • 打印作为参数传递的函数指针会在屏幕上打印“1”

    我一直在尝试函数指针 发现以下程序的行为相当神秘 void foo int p std cout lt lt p lt lt std endl int alwaysReturns6 return 6 int main foo alwaysR
  • Visual C++ 只有一个线程工作 (OpenMP)

    我有一个多线程应用程序的简单代码 但无论我传递多少个线程 它都只使用一个线程执行 起初 我以为是我的电脑的问题 但我又尝试了另一台电脑 但还是不行 我是不是出了什么事 我正在使用 Visual Studio 2015 如果有帮助的话 int
  • 如何在 iOS 上使用 Expo.printToFileAsync 避免从 HTML 生成的输出 PDF 中内容部分内的分页符

    我正在创建一个应用程序 它在选项卡中包含完整的列表 并且这些列表包含其数据 同样是内部列表 我们可以将它们称为子列表 我使用 expo 来构建这个应用程序 并使用 expo print API 将这些列表转换为 PDF 当用户选择共享时 这
  • WPF 用户控件;触发器和更改其他控件

    我创建了一个 WPF UserControl 其中包含一个按钮和一个组合框 我想根据鼠标的位置更改两者的样式 因此鼠标悬停的 UIElement 的颜色为黑色 另一个的颜色为红色 如果两者均未设置样式 则将应用默认样式 别担心 这个噩梦般的
  • Python:压平包含另一个生成器的生成器的函数

    我想知道如何编写 python 函数 它可以展平生成器 生成另一个生成器或可迭代对象 也可以生成另一个生成器 可迭代对象 可能是无限的 这是示例 gen gen 1 2 3 gen 4 5 6 7 8 9 gen 10 11 12 gen
  • 泡菜:为什么叫这个名字? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我很惊讶这对我来说很难找到答案 这是一个多么奇怪的名字啊 泡菜为什么叫泡菜 http en wikipedia org wiki Pickle
  • 打印 WPF 位图图像

    打印位图图像的最佳方法是什么 我有 System Drawing 背景 所以我正在考虑将其转换为位图 然后打印它 但我认为可能有更好的方法 Thanks 根据 Drew 的回答 最好测量并安排传递给 PrintVisual 方法的容器 这将
  • 服务器上保存的位置的接近警报

    我做了一些搜索 但找不到合适的答案 我的应用程序应该与多个位置进行比较以了解邻近度 这意味着我将无法将所有位置保存到我的应用程序中以使用 locationManager 确认邻近度 我希望在服务器中完成邻近确认 实现这一点的最佳方法是什么
  • AWS API Gateway 自定义授权程序未运行

    我创建了一个 Lambda 函数 已将其配置为我的一个 API 端点的方法请求上的 自定义身份验证 当我使用 AWS API Gateway 的 测试 函数时 我在日志输出中看不到 Lambda 函数的任何输出 我已经 部署 了 API 然
  • awk 在Linux终端中输出类似表格或类似Excel的列?

    我做了一个长管子 最后是 awk print 5 t t 3 t 4 在 Linux 终端中 这些列用选项卡填充 第一列条目具有不同数量的字符 因此第二列结果并不完全垂直 怎样才能让桌子看起来更完美呢 尝试将结果通过管道传输到列 t awk
  • 自定义 Django 组模型

    我正在尝试向 Django 管理中的 组 添加一个字段 例如 当您在后端创建一个组时 您定义 名称 和 权限 我想向其中添加一个字段列表 CharField 这是否需要一个新的应用程序 或者我可以在我的根 models py 中扩展 Gro
  • 在 JavaScript 中将代码作为函数参数传递?

    我正在尝试自己创建一个 javascript 框架 所以不要使用 jquery mootools 代码 并且我想让我的框架的代码只能在框架函数中访问 例如 如下所示 frameworkname framework code here 所以我
  • 将更改推送到 openshift 项目时出错

    当我尝试在开放轮班项目中推送一些更改时 我在尝试构建项目时收到此错误 remote Found pom xml attempting to build with mvn global settings var lib openshift 5
  • 将 double 转换为固定宽度的 String

    我想将双精度数转换为固定宽度的字符串 如果宽度是 10 那么我希望 double 值四舍五入到这个宽度 例如 如果 value 102 121323435345 并且宽度为 10 则该值应该是 position gt 0123456789
  • 获取 pinterest api 的域名

    目前我正在研究 pinterest api 以从我的域获取 pin 我可以通过 api 获取访问令牌 我正在使用以下方法进行 api 调用来获取域 pin https api pinterest com v3 domains
  • CSS 字体显示功能是什么?

    对于我的网站 我从 Google 的 PageSpeed Insights 获得以下反馈 利用字体显示 CSS 功能确保加载 Web 字体时文本对用户可见 这意味着什么 CSS font display允许您控制网络字体在加载时 加载后如何
  • 如何在 Linux 64 位上用 C 编写简单的内联 asm 指令?

    我正在编写一个简单的 C 程序 我的要求是从程序的某些函数中打印 RIP 指令指针 我不想使用 ptrace 我用内联汇编尝试的一件事是 asm movl rip 0 r val 这应该将我的 rip 寄存器值复制到变量 val 但我收到编