反汇编 之thiscall约定

2023-10-26

        thiscall是C++中的非静态类成员函数的默认调用约定,对象的每个函数隐含接收this参数。采用thiscall约定时,函数的参数按照从右到左的顺序入栈,被调用的函数在返回前清理传送参数的栈。

#include <iostream>

class csum
{
    public:
    int add(int a, int b)     /* 实际上原型 add(this, int a, int b) */
    {
        return (a + b);
    }
};

int main()
{
    csum sum;
    sum.add(1, 2);

    return 0;
}

/*

int main()
{
    1189:    f3 0f 1e fa              endbr64
    118d:    55                       push   %rbp
    118e:    48 89 e5                 mov    %rsp,%rbp                  # rbp = rsp
    1191:    48 83 ec 10              sub    $0x10,%rsp                # 申请两个8字节栈空间
    1195:    64 48 8b 04 25 28 00     mov    %fs:0x28,%rax    # 把fs的偏移值x28放入rax
                                                                                               # 指向特定于线程或定义的结构
                                                                                              # %fs:0x28主要起金丝雀的作用,
                                                                                              # 防止overflow的,即进行安全保护
    119c:    00 00
    119e:    48 89 45 f8              mov    %rax,-0x8(%rbp)        # rbp-0x8 = rax
    11a2:    31 c0                    xor    %eax,%eax                     # eax 清零
    csum sum;
    sum.add(1, 2);
    11a4:    48 8d 45 f7              lea    -0x9(%rbp),%rax        # rbp-0x9的地址放入rax,即this指针
    11a8:    ba 02 00 00 00           mov    $0x2,%edx            # edx = 2
    11ad:    be 01 00 00 00           mov    $0x1,%esi             # esi = 1
    11b2:    48 89 c7                 mov    %rax,%rdi                 # rdi = rax = this
    11b5:    e8 82 00 00 00           callq  123c <_ZN4csum3addEii>

    return 0;
    11ba:    b8 00 00 00 00           mov    $0x0,%eax            # 返回值
}

000000000000123c <_ZN4csum3addEii>:
    int add(int a, int b)     
    123c:    f3 0f 1e fa              endbr64
    1240:    55                       push   %rbp
    1241:    48 89 e5                 mov    %rsp,%rbp
    1244:    48 89 7d f8              mov    %rdi,-0x8(%rbp)          # rbp-0x8 = rdi = this
    1248:    89 75 f4                 mov    %esi,-0xc(%rbp)           # rbp-0xc = esi = 1
    124b:    89 55 f0                 mov    %edx,-0x10(%rbp)        # rbp-0x10 = edx = 2
        return (a + b);
    124e:    8b 55 f4                 mov    -0xc(%rbp),%edx         # 1
    1251:    8b 45 f0                 mov    -0x10(%rbp),%eax      # 2
    1254:    01 d0                    add    %edx,%eax                  # edx = 1 + 2
    }
    1256:    5d                       pop    %rbp
    1257:    c3                       retq   

*/

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

反汇编 之thiscall约定 的相关文章

  • C# 中的简单获取字符串(忽略末尾的数字)

    我认为正则表达式太过杀伤力 而且它需要我一些时间来编写一些代码 我想我现在应该学习 因为我知道一些正则表达式 分隔字母数字字符串中的字符串的最简单方法是什么 它将永远是 LLLLDDDDD 我只想要字母 l 通常只有 1 或 2 个字母 T
  • DataGridView 自动完成组合框列不保留初始单元格离开时的值

    我有一个带有自动完成组合框列的绑定 dataGridView 并且自动完成功能正在工作 只是我观察到一种有点令人恼火的行为 当我第一次在自动完成单元格中键入文本并使用 tabKey 移动到下一个单元格时 我的选择不会保留 我选择的内容将被清
  • 从对象中获取类型正在返回运行时类型[重复]

    这个问题在这里已经有答案了 我有一个简单的功能 public string getType object obj Type type obj getType return type FullName 如果您在运行时创建的字符串对象上使用此函
  • 如何在 Xamarin.Forms 中强制使用浅色模式?

    我的应用程序的 UI 设计为在灯光模式下使用 但如果手机的默认主题是深色模式 我的应用程序也会切换到深色模式 并且 UI 看起来很垃圾 所以我想强制我的应用程序使用灯光模式 我怎样才能做到这一点 In my app xaml我使用的文件Us
  • 为什么 C++11/Boost `unordered_map` 在擦除时不重新散列?

    我想知道为什么 C 11 和 Boost 的 hashmap 在通过迭代擦除元素时不会调整大小 即使这在技术上不是内存泄漏 我认为这可能是应用程序中的一个严重问题 这对我来说是一个隐藏的问题 很难追踪它 并且它实际上可能会影响许多应用程序
  • 将 CryptoStream 解密为 MemoryStream

    我编写了一个过程 其中文件被加密并上传到 Azure 然后必须解密下载过程 这会失败并出现 填充无效且无法删除 错误 或 要解密的数据长度为无效的 错误 我在网上尝试了很多解决方案 包括C 使用 RijndaelManaged 和 Cryp
  • C# 中的异步方法如何工作?

    我在我的一些项目中使用异步方法 我喜欢它 因为它使我的应用程序更具可扩展性 但是 我想知道异步方法如何在后台真正工作 NET 或 Windows 如何知道调用已完成 根据我进行的异步调用的数量 我可以看到创建了新线程 但并不总是 为什么 此
  • C++ 中的静态虚函数

    我有一个基类和一个派生类 我想更改基函数 同时保持它们静态 因为它们应该作为静态传递给其他函数 我怎样才能做到这一点 ATL 框架通过将基类设为模板 然后让派生类将其类类型作为模板参数传递 从而绕过了无虚拟静态的限制 然后 基类可以在需要时
  • 如何存储生成的格式化 C 字符串

    这是一个新手问题 为了创建格式化的 C 字符串 我使用printf like int n 10 printf My number is i 10 但是 怎么样 int n 10 char msg My number is i 10 prin
  • 委托:方法名称预期错误

    我正在尝试让以下简单的委托示例正常工作 根据我从中取出的一本书 应该没问题 但我得到了Method name expected error namespace TestConsoleApp class Program private del
  • 枚举和枚举类之间的区别[重复]

    这个问题在这里已经有答案了 谁能解释一下两者之间的区别 enum Type1 type2 And enum class Type1 type2 我经常使用前者 可能太频繁而没有足够的封装 但我从未使用过第二个例子 Thanks enum A
  • 验证仅适用于数组的第一项

    给定这个模型代码 Required Display Name Name public string Name get set 以下查看代码有效 Html LabelFor model gt model Name Html TextBoxFo
  • 更改子进程中的 iostream

    现在 我正在开发一个项目 其中我需要启动一个子进程来使用 C 在 Linux 中执行一个新程序 并且我需要重定向标准输入和输出 就像在 C 中一样 它们是cin and cout 到一个文件 这意味着在子进程中 标准输入和输出都是文件 子进
  • 使用 Entity Framework Core 在运行时迁移

    我正在将 PHP Illuminate 应用程序移植到 ASP NET Core EF Core 其中一部分由类似 Wordpress 的安装过程组成 该过程要求提供数据库凭据 然后创建应用程序运行所需的表 本质上 我想在运行时运行某种迁移
  • 产量回报延迟迭代问题

    我知道yield return 利用了延迟加载 但我想知道我是否可能滥用迭代器或者很可能需要重构 我的递归迭代器方法返回给定的所有祖先PageNode包括pageNode itself public class PageNodeIterat
  • 如何使用 GCC 在 C 上编译库?

    我用这些文件创建了一个库pila h and pila c 我编译文件pila c with gcc pila c c这个库运行良好 我已经测试过了 然后我又做了一个图书馆 这个库有文件pila funciones extra h and
  • LINQ 中的左外连接

    下面的代码不断给我一个错误消息 你调用的对象是空的 var partsWithDefaults from partsList1 in p join partsList2 in d on new PartNo partsList1 PartN
  • 如何避免函数的多重定义(Linux、GCC/G++、Code::Blocks)

    我有一个代码块项目 它使用许多不同的文件 通常是由其他程序员编写的 目前我遇到的情况是 我有两个不同的子项目 其中包含以相同方式命名的函数 比方说 F int x 因此 F int x 是在两个不同位置的两个源文件中定义的 并且它们有两个不
  • Web 服务无法使用 GAC 中的类型创建类型错误

    遇到一个不寻常的问题时 我似乎喜欢做一些不常见的事情 我有一个复合控件 它检查给定的 Web 服务文件是否存在于我的应用程序的根目录中 如果不存在 它会在标记中创建带有必要指令的文件以进行滚动 如下所示 反过来 它被保存到输出中 完成此步骤
  • 我如何将 C++ 与 VALA 混合起来

    我需要用 C 编写跨平台的 GUI 应用程序 但由于 C 的大多数 GUI 库都有点乏味 而且我对 C NET 非常熟悉 我发现使用 GTK 的代码 Vala 代码非常有趣 并且与其他方式相比有点容易 那么我该如何将 VAlA 与 C 混合

随机推荐

  • Redis3.0 集群搭建

    redis3 0 部仅提供了哨兵监控 热切换 还提供了集群解决方案 接下来简单的搭建redis3 0集群 1 新建三个redis server实例 我们可以将redis conf分别copy到7001 7002 7003的文件夹中 并修改相
  • easyui-datagrid获取行和列数据

    1 获取当前行 var row dg datagrid getSelected 2 获取所有选中行 var rows dg datagrid getSelections 3 获取所有行 var rows dg datagrid getRow
  • 安卓11上的存储权限问题

    这篇文章 想来发布的有些晚了 安卓11已经发布多时了 关于安卓11上的存储权限变更的文章数不胜数 所以这篇文章只做为自己的一个简单的记录吧 在说11之前 我们先回忆以下10上存储权限的变更 每个应用会生成自己对应的沙盒文件路径 自己的应用只
  • 计算机基础相关知识面试题

    之前写过一篇面试题 但是在春招面试 笔试问了很多计算机网络 数据结构 操作系统等相关知识点记点之前总结的还是不够参考的 再来一篇 顺序有点乱 但是每一个都是参考的 已备大家复习使用吧 文章目录 UDP 传输控制协议 和TCP 用户数据报协议
  • Redis——初识Redis

    Redis简介 Redis的数据结构致力于帮助用户解决问题 而不是像关系型数据库那样 要求用户扭曲问题来适应数据库 除此之外 通过复制 持久化和客户端分片 client side sharding 等特性 用户可以很方便的将Redis扩展成
  • 基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十八)Gamma校正

    Vries的教程是我看过的最好的可编程管线OpenGL教程 没有之一 其原地址如下 https learnopengl cn github io 05 20Advanced 20Lighting 01 20Advanced 20Lighti
  • 编写一个golang websocket示例

    示例代码 创建一个websocket对象 var ws websocket Dial ws localhost 8000 echo http localhost 发送消息 if err ws Send byte hello world er
  • Latex编译中文出现的问题

    Latex编译中文出现的问题 记录一下使用latex编译中文遇到的一些问题 本文是在win11系统下使用的TexStudio MikTex组合 编译使用的是pdfLatex 编辑器的设置 首先会发现 编辑器中的中文字符全是乱码 这时 在Te
  • 应用于标签的伪类选择器(link、visited、active、hover)

    CSS3根据选择符的用途可以把选择器分为标签选择器 类选择器 ID选择器 全局选择器 组合选择器 继承选择器和伪类选择器等 伪类选择符定义的样式最常应用于 a 标签上 它表示4种不同的状态 link 未访问链接 visited 已访问链接
  • GnuWin32的安装与使用

    使用过Linux的伙计估计都会喜欢上linux各种各样强大的命令如 find vim cp mv wget curl grep ls等等 而GnuWin32使windows用户可以在命令行窗口中使用各种各样的linux命令 就跟使用普通的w
  • lighttpd不支持Expect: 100-continue的解决办法

    由于lighttpd1 4 21之前的版本不支持Expect 100 continue 所以有可能访问出现 HTTP 1 1 417 Expectation Failed 等错误提示 搜集整理了很多解决方法 如下 1 升级到 lighttp
  • Chrome:将禁用修改document.domain以放宽同源策略

    你好 我是tiantian 几天前 Chrome developer 博客发布了这么一篇文章 大致意思是 Chrome未来将禁用修改document domain 如果你的网站依赖于设置document domain 来解决跨域的问题 那么
  • ubuntu安装elasticsearch和head插件(所有可能出现的问题解决)超详细

    一 单例安装 首先去官网 elastic co 下载tar gz的压缩包 或者使用命令行下载 wget https artifacts elastic co downloads elasticsearch elasticsearch 6 7
  • 当鼠标光标放在一张图片上,如何显示另一张图片?

    我们会遇到一种情境 这种情境是当正常打开一个页面 有文字配有图片 可是当鼠标的光标移动到这张图片上时 会显示另一张图片 这种效果应该怎么做 在学习html和css阶段的程序员 我们可以使用hover来对图片进行处理 hover的基本意思为选
  • 【c语言】两个栈实现一个队列

    两个栈实现一个队列 核心思想 模拟出队列先进先出的数据结构 假设有两个栈input和output input模拟栈的数据插入 当需要模拟出队列操作时 input栈中的A B C D会按照D C B A的顺序进入栈output 只要outpu
  • TensorRT部署(图像分类)之engine生成及反序列化推理(第二讲)

    1 日志文件类创建 class TRTLogger public nvinfer1 ILogger public virtual void log Severity severity nvinfer1 AsciiChar const msg
  • adams怎么打开自带模型_少了这套Enscape专属模型库,你装的Enscapen废了一半

    文末领取此套Enscape离线资源库 真实植物 Enscape 我们一直都在用 大家也都很熟悉 而且Enscape作为渲染界的劳模 几乎可以保持月更的节奏 其操作简单 容易上手 渲染真实越来越多的被使用 虽然Enscape很好用 比Lumi
  • SAP MM学习笔记17-在库品目评价中的标准原价 S 和移动平均价格 V

    SAP中有2种价格 标准原价 S 和 移动平均价格 V 1 标准原价 S 2 移动平均价格 V 在MM03 会计1 Tab中 现行评价区域中 有原价管理区分 比如下面这个物料 100 100 它的原价管理区分是 S 它的合计额 就是 标准原
  • getch()、_sleep() 函数的正确用法

    前段时间由于需要 写了一段代码 用到了函数 getch 但是当时出错了 提示该标识符未被定义 一时无解 后来又有一个朋友 问我怎么将一个字符串中的字符以一种动态的方式进行输出 我当时告诉他的是使用 sleep 函数 也没有细想 后来发现 根
  • 反汇编 之thiscall约定

    thiscall是C 中的非静态类成员函数的默认调用约定 对象的每个函数隐含接收this参数 采用thiscall约定时 函数的参数按照从右到左的顺序入栈 被调用的函数在返回前清理传送参数的栈 include