寄存器传值——函数剖析

news/2024/11/14 14:45:22/文章来源:https://www.cnblogs.com/curiositywang/p/18430897

寄存器传值——函数剖析

现象

实验环境:Ubuntu20,x86-64指令集

#include <stdio.h>int sum(int a, int b){return a+b;
}int main() {int aa = sum(5,3);printf("%d, %d\n", 9);return 0;
}

image-20240925103512436

编译器提示我们 printf()函数少一个参数,但是我们发现一个有趣的现象,最终的程序的输出是9,5,为什么第二个数不是一个随机值呢。而且这个 5 前面也出现过,会不会有什么关联呢?

实验剖析

打开 GDB,我们结合着对应的汇编代码进行查看:

image-20240925104918885

call 之后,我们可以发现sum 函数为了实现加法操作对%edx进行了赋值:

image-20240925105153288

当 sum 函数执行完成之后程序继续执行,在调用printf函数的时候,需要分别通过rdi,rsi,rdx三个寄存器传递相关参数,其中 rdi 存储的是格式化字符串地址,rsi 存储的是 9,但是由于我们并没有传入第三个参数,因此 edx中保存的是sum 函数里给 edx 赋值的 5。最终会导致 printf 使用了来自上面修改后的 edx 值。

image-20240925105746573

附录

  1. GDB 常用命令
$ g++ -g -o your_program your_program.cpp # 编译带调试信息的 code
$ gdb ./your_program  # 启动 GDB
(gdb) break main       # 在 main 函数设置断点 b main
(gdb) run              # 运行程序 
(gdb) disassemble      # 查看当前汇编代码 或者是 layout split
(gdb) stepi            # 单步执行汇编指令
(gdb) info registers   # 查看寄存器状态
(gdb) x/10x 0x400500   # 查看内存内容
(gdb) continue         # 继续运行程序

image-20240925104119447

  1. x86寄存器指令集一栏

    https://www.cnblogs.com/curiositywang/p/17681647.html

  2. 函数调用过程详解

    https://www.cnblogs.com/curiositywang/p/18223331

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/803398.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Sep 2024)

Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Sep 2024)Windows 11 version 23H2 中文版、英文版 (x64、ARM64) 下载 (updated Sep 2024) Windows 11, version 23H2,企业版 arm64 x64 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版…

【YashanDB知识库】YAS-04110 invalid variant name

本文转自YashanDB官网,具体内容请见https://www.yashandb.com/newsinfo/7369202.html?templateId=1718516 【标题】错误码处理 【问题分类】查询语句报错 【关键字】YAS-04110 【问题描述】执行特定sql时,遇到相应报错 【问题原因分析】字段中含有保留字,应使用双引号包裹字…

章14——Hashtable

键和值为NULL时会抛出空指针异常。KEY重复且无NULL时同样会替换,和HashMap是一样的。按照2倍+1的规律去扩容与HASHMAP对比PROPERTIES,也是MAP接口的实现类,是Hashtable的子类 .properties 文件通常是用于数据库的配置文件,储存数据库的用户名密码等东西 详细可见博客园博客…

mac安装allure成功后pycharm虚拟环境allure不可用

mac安装allure成功pycharm虚拟环境cmd提示zsh: command not found: allure mac查看安装成功在虚拟环境查看失败确认虚拟环境变量 如果 Allure 仍然不可用,检查虚拟环境中的 PATH 环境变量是否包含了 Allure CLI 的路径。在虚拟环境中,你可以运行以下命令来查看 PATH: echo $…

如何删除 WPS 在图片文件属性中添加的“属性修改”选项卡

近期发现 WPS 2023 这一个非常恼人的特性,在图片文件的属性窗口里面乱加第三方选项卡。同事的电脑安装了这个版本,就让同事从注册表试了一下。还好金山他们藏的不是很深,借助 GPT 很快也就找到了。这里再用鄙人自己的虚拟机演示一遍。HKEY_CLASSES_ROOT\*\shellex\PropertyS…

POST请求的艺术:如何有效使用POST方法

在HTTP协议中,POST方法是一种用于向服务器提交数据的请求方式。与GET请求不同,POST请求将数据包含在请求体(request body)中,而不是URL中。这使得POST请求更适合传输大量数据和敏感信息。本文将探讨如何有效使用POST方法,以及它在现代Web开发中的应用。POST请求的基本概念…

Springboot中动态管理定时任务

引言 基于cron表达式的定时任务实现,因为cron表达式对于每个任务不确定,所以使用线程池来动态的创建和销毁定时任务 依赖 因为使用的spring自带的调度功能,所以没有额外的依赖,我的项目版本为: 使用 首先需要定义一个线程池,使用@configuration 注解配置 import org.spr…

Leetcode 1396. 设计地铁系统

1.题目基本信息 1.1.题目描述 地铁系统跟踪不同车站之间的乘客出行时间,并使用这一数据来计算从一站到另一站的平均时间。 实现 UndergroundSystem 类:void checkIn(int id, string stationName, int t)通行卡 ID 等于 id 的乘客,在时间 t ,从 stationName 站进入乘客一次只…

C# 开源浏览器性能提升,体验Chrome级速度

前言 使用 C# 和 CefSharp 开发的全功能网页浏览器。 项目介绍 SharpBrowser 是目前最快的开源 C# 网页浏览器! 采用了轻量级的 CEF 渲染器,在呈现网页时甚至比 Google Chrome 更快。 我们对比了所有可用的.NET 浏览器引擎,最终选择了高性能的 CefSharp。 SharpBrowser 使用…

springcloud的热点数据进行流控

简单理解就是,同样请求一个接口的入参,针对该参数对应是规定值的数据请求,进行控制,比如我一个接口的一个参数为id,如果id值为1002、1003的入参进行热点控制,别的id值不控制随意请求。 采用的是sentinel进行热点数据控制 设置如下这个热点设置,需要借助@SentinelResour…

富勒WMS-产品档案导入

一、配置数据导入规则 根据自身了解,为了方便处理逻辑,一般选择临时表+个性化SP模式。该模式下导入时会先将模板导入到临时表中,然后通过存储过程“SPUDF_SKU_UDFIMP”处理相关逻辑导入到系统中。 其中,其实行号是指标题字段所在的行号。二、新建临时表 “TMP_UDFIMP_SKU”…

《鸿蒙/Harmony | 开发日志》预览文件

APP 中常有需求就是点击文件打开预览。 鸿蒙中,可以借助访问的预览文件服务来实现。 测试下来,常见的文档类型txt, doc, excel, ppt,pdf, 图片,视频等都是默认可以打开的。遇到不能打开的,界面也会按钮是否使用其他 APP 来打开。支持的文件类型 官方文档列出的支持类型,实…