在内联汇编中访问 C++ 类成员

2023-12-02

问题:如何从非 POD 类中访问程序集中的成员变量?


详细说明:

我已经为类成员函数编写了一些内联汇编代码,但令我困惑的是如何访问类成员变量。我已经尝试过offsetof宏,但这是一个非 POD 类。

我当前使用的解决方案是将全局范围的指针分配给成员变量,但这是一个混乱的解决方案,我希望有更好的东西我不知道。

note:我正在使用 G++ 编译器。使用英特尔语法 Asm 的解决方案会很好,但我会采取任何措施。

我想做的事的例子(英特尔语法):

class SomeClass
{
  int* var_j;
  void set4(void)
  {
    asm("mov var_j, 4"); // sets pointer SomeClass::var_j to address "4"
  }
};

当前的黑客解决方案:

int* global_j;
class SomeClass
{
  int* var_j;
  void set4(void)
  {
    asm("mov global_j, 4"); // sets pointer global_j to address "4"
    var_j = global_j;       // copy it back to member variable :(
  }
};

这些都是粗略的例子,但我认为它们表达了要点。


这就是您所需要的:

__asm__ __volatile__ ("movl $4,%[v]" : [v] "+m" (var_j)) ;

编辑添加:汇编器确实接受 Intel 语法,但编译器不知道它,因此这个技巧在使用 Intel 语法时不起作用(无论如何,不​​适用于 g++ 4.4.0)。

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

在内联汇编中访问 C++ 类成员 的相关文章

  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 每个元素的 asp.net Web 表单自定义错误消息

    我创建了一个 Web 应用程序 表单 以及后端 SQL 插入和查询 目前我正在显示所有用户错误消息 div style padding 1em div
  • 在 C# 中解析 JS Date.toIsoString

    我需要将 JS 日期存储为 ISO 8601 日期 我目前正在从格式为 2019 06 22T00 00 00 000Z 的表单中获取日期 正如 JS 的 toIsoString 方法所期望的那样 当这个日期传递到我的 API 控制器时 我
  • 加载 QPixmap 数据的更好方法

    更好的方法来做到这一点 没有QImage QImage image width height QImage Format RGB888 memcpy image bits m frameRGB gt data 0 height width
  • 如何在 C 中链接目标文件?失败并显示“架构 x86_64 的未定义符号”

    因此 我尝试在我的文件 file2 c 中使用另一个 C file1 c 文件中定义的函数 为了做到这一点 我包含了 file1 file1 h 的标头 但是 每当我尝试使用 gcc 编译文件时 我都会收到以下错误 Undefined sy
  • DateTime.ParseExact - 为什么 yy 变成 2015 而不是 1915

    为什么 NET 假定以下年份是 2015 年 而不是 1915 年 var d DateTime ParseExact 20 11 15 dd MM yy new CultureInfo en GB 我想 它会尝试接近 但其背后是否有合理的
  • C# 可以为控制台应用程序部分类“程序”类吗?

    我想知道是否可以将为任何控制台应用程序创建的默认 程序 类更改为部分类 我想这样做是因为我想要更好的组织 而不是将所有方法都放在按区域分类的 1 个文件中 对我来说 将某些方法类别放在单独的文件中会更有意义 我对分部类的理解是 它是多个文件
  • main.cpp 是必需的吗?

    我试图编译一个程序cmake 我最终删除了我的main cpp文件 我刚刚将其复合到另一个包含我的项目名称的文件中 即 我刚刚将主函数剪切并粘贴到该文件中 问题是我有一个main cpp未发现错误 不确定是否在C 一个名为main cpp是
  • fgets溢出后如何清除输入缓冲区?

    当输入字符串超出其预定义限制时 我遇到了 fgets 的小问题 以下面的例子为例 for index 0 index lt max index printf Enter the d string index 1 if fgets input
  • MPI - 发送和接收列

    我需要从一个进程发送矩阵列并从另一个进程接收它 我尝试运行以下程序 但得到了一个奇怪的结果 至少我这么认为 仅复制矩阵的第一个元素 某些矩阵元素会发生意外变化 include
  • 从单应性估计 R/T

    我一直在尝试计算 2 个图像中的特征 然后将这些特征传递回CameraParams R没有运气 特征已成功计算并匹配 但是问题是将它们传递回R t 我明白你必须分解Homography为了使这一点成为可能 我已经使用如下方法完成了 http
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在一个解决方案中调用不同项目的方法

    1 个解决方案中有 3 个项目 我对第一个项目中的主文件进行的主要操作 但是我需要调用第三个项目中的方法并使用类 例如 第三个项目有 public DataClasses1DataContext base global WindowsFor
  • 查找数组中的多个索引

    假设我有一个像这样的数组 string fruits watermelon apple apple kiwi pear banana 是否有一个内置函数可以让我查询 apple 的所有索引 例如 fruits FindAllIndex ap
  • 如何防止 Lotus Notes 用户转发或复制通过 System.Net.Mail 发送的邮件?

    我想使用 SMTP 客户端 uiing microsft net 以 C 作为编程语言发送电子邮件 但是对于通过SMTP客户端发送的电子邮件 我们是否可以添加 禁止转发 或 禁止复制 等安全功能 我不希望电子邮件的收件人转发或复制电子邮件的
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 异步/等待 - 是*并发*吗?

    我一直在考虑 C 5 中新的异步内容 并且出现了一个特殊问题 据我了解 await关键字是一个简洁的编译器技巧 语法糖来实现连续传递 http en wikipedia org wiki Continuation passing style
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 如何配置 qt Creator 以显示 C++ 代码而不是反汇编程序?

    昨天我做了很多事情 比如更新 GCC Clang 和重新安装 Qt Creator 今天 在逐步调试我的代码时 调试器显示的是反汇编代码 而不是我编写的 C 代码 紧迫F10 or F11 调试器正在进入汇编代码而不是 cpp nor h我
  • 稀疏矩阵超定线性方程组c/c++库

    我需要一个库来解决 Ax b 系统 其中 A 是一个非对称稀疏矩阵 每行有 8 个条目 而且可能很大 我认为实现双共轭梯度的库应该没问题 但我找不到一个有效的库 我尝试过 iml 但 iml sparselib 包中缺少一些标头 有小费吗

随机推荐

  • 在data.table中动态创建新列

    我在 R 中有一个 data table 想要创建一个新列 假设我将日期列名称保存为变量并想要附加 year到新列中的该名称 我可以通过指定名称来完成正常的路由 但是如何使用date col多变的 这是我尝试过的 我想要的最后两个不起作用
  • Spark - 将整行传递给 udf,然后获取 udf 内的列名称

    我正在将 Spark 与 Scala 一起使用 并且希望将整行传递给 udf 并选择 side udf 中的每个列名称和列值 我怎样才能做到这一点 我正在尝试遵循 inputDataDF withColumn errorField mapC
  • 在 UCS-2 Little Endian、Java 中写入文本文件

    我正在尝试写入 txt 文件 它必须是 UCS 2 Little Endian 但是当我尝试时 writer new PrintWriter path UTF 16LE 从我读到的内容来看 它应该是相同的 但它在服务器上的特定应用程序中不起
  • 如何在 Zxing 扫描仪相机视图中添加按钮?

    我当前的 Zxing 扫描仪屏幕如下所示 我想在上面添加一个文本视图和几个按钮 我尝试了很多程序 但没有任何效果 任何人都可以指导我 我将虚心期待您的帮助 这是代码 Java文件 private ZXingScannerView mScan
  • 在 Gradle 和 Eclipse 的 Checkstyle-plugins 中使用 ${samedir}

    I use a 抑制滤波器在我的 checkstyle 配置中 文件的路径suppression xml相对于 checkstyle configuration 给出 使用 samedir http eclipse cs sourcefor
  • 从列表列表中删除 NULL 元素

    如何从 R 中的列表列表中删除 null 元素 如下所示 lll lt list list NULL list 1 list a 我想要的对象看起来像 lll lt list list 1 list a 我在这里看到了类似的答案 如何从列表
  • 将可执行文件链接到第三方依赖共享库时,C++ CMake 未定义引用

    我读了很多相关主题 例如1 2 3 但我自己没有找到答案 所以我在这里 我有一个可构建且可执行的 CMake 项目 假设为 x 我创建了一个名为 a so 的共享库 它依赖于另一个名为 b so 的共享库 我想在 x 中使用 a 这是我简化
  • 无法从 ASP 计时器滴答事件中找到 ASP Repeater 子控件

    见下图 Scenario 我有一个repeater控制轴承 ID rpt1 在 ItemTemplate 中我有一个量程控制其 ID 为 abc 当前显示的是一个数字 我也有一个ticker above the repeater in fo
  • PHP 中的远程 MySQL 连接

    我开始将软件项目从桌面应用程序迁移到 Web 应用程序 目前我正在使用与其安装的桌面关联的本地 PHP MySQL 连接 我希望解决这个问题 并尝试通过我的 1and1 帐户创建一个 MySQL 数据库 我毫不费力地创建了一个数据库并记录了
  • 如何连接多个CString

    所有函数都返回 CString 这是 MFC 代码 必须以 32 和 64 位进行编译 目前我正在使用 CString sURI GetURL sURI GetMethod sURI sURI GetParameters 存在任何方式可以执
  • 无法启动 weblogic BEA-002606

    我在我的 Mac 机器上运行 Weblogic 10 3 的托管实例 有一天 我尝试启动它 但收到此错误消息
  • SQL多次更新同一行

    我们可以考虑对同一行进行多次更新的必要性的一个示例 create table t c1 int insert into t c1 values 1 insert into t c1 values 2 insert into t c1 val
  • JetBrains Fleet:运行 Flutter 项目

    我正在尝试 JetBrains Fleet 我正在考虑在其中制作一个示例 Flutter 项目 但不知道如何配置run json对于 Flutter 项目 终端命令非常简单 flutter run debug or flutter run
  • 如何使用麻雀图在 wp8 中创建简单的区域系列

    我需要为我的 wp8 应用程序创建一个面积系列图表 所以我决定使用 Sparrow 工具包 但不幸的是 网上似乎确实有任何教程 我只是在研究如何开始它 所以如果有人可以给出基本的解释或给我指出一个像样的教程 那就太好了 如果有人知道更好的工
  • 如何获取隐藏 ID 来删除 jQuery 数据表中的记录

    我的 jQuery 数据表中有 编辑 和 删除 按钮 第一列是记录 ID 列并且是隐藏的 我有 编辑 和 删除 按钮的事件处理程序 我应该使用 DataTable click 和 tr 函数的事件处理程序来获取 id 或者如果使用按钮事件处
  • 错误:Fortran 格式字符串中的格式字符串意外结束

    尝试从 Fortran 77 程序编译复制的代码时出现此错误 code 900 FORMAT 1H0 2X ABSOLUTE GRID LIMITS FOR DATA RETENTION FOR RADAR I3 XMIN XMAX 2F8
  • 动态分配的二维数组

    我正在尝试通过动态分配来构建二维数组 我的问题是 它的第一个维度是否有可能采用 100 个值 然后第二个维度将根据我的问题采用可变数量的值 如果可能的话我将如何访问它 我怎么知道第二维度的边界 见代码中的注释 结果你会得到一个如下所示的数组
  • 使用 GetModuleHandle 获取指向 IMAGE_DOS_HEADER 的指针?

    一旦进程加载到内存中 我就试图获取它的图像库 根据我的理解 您可以调用 GetModuleHandle 来获取图像库 我的问题是 返回的句柄本质上是否指向 IMAGE DOS HEADER 结构 以便您可以执行以下操作 PIMAGE DOS
  • 为什么 Rust Closure 在被调用之前取得所有权

    我正在阅读 Rust 这本书 正在阅读描述闭包的章节 我有点困惑为什么以下示例由于闭包获取所有权而出错 fn main let x vec 1 2 3 let equal to x move z z x println can t use
  • 在内联汇编中访问 C++ 类成员

    问题 如何从非 POD 类中访问程序集中的成员变量 详细说明 我已经为类成员函数编写了一些内联汇编代码 但令我困惑的是如何访问类成员变量 我已经尝试过offsetof宏 但这是一个非 POD 类 我当前使用的解决方案是将全局范围的指针分配给