为什么函数调用会将其第一个参数放入 CPU 寄存器 RDX?

如何解决为什么函数调用会将其第一个参数放入 CPU 寄存器 RDX?

当我逐步浏览我的一个库中的一些新代码时,我注意到第一个参数似乎进入 RDX 寄存器而不是记录的 RCX 寄存器。虽然不是世界末日的灾难,但我很好奇;为什么会这样,除非 RCX 被搁置以传递对 this 的引用,就像在 C++ 中发生的那样。同样,被调用的例程是实例上的静态方法可能也很重要。

以下是对整个函数的反汇编,这是一个非常基础的语法糖函数。

        /// </summary>
        /// <param name="pastrAdditionalMessages">
        /// Pass in the optional list of additonal messages if needed. Status
        /// codes zero and one are covered by stanard messages that are pulled
        /// from the resource strings stored in WizardWrx.Common.dll.
        /// </param>
        /// <returns>
        /// The total number of messages is as described under <paramref name="pastrAdditionalMessages"/>.
        /// </returns>
        private static int ComputeMessageCount ( string [ ] pastrAdditionalMessages )
        {
00007FFED9688940  push        rbp  
00007FFED9688941  push        rdi  
00007FFED9688942  push        rsi  
00007FFED9688943  sub         rsp,30h  
00007FFED9688947  mov         rbp,rsp  
00007FFED968894A  mov         rsi,rcx  
00007FFED968894D  lea         rdi,[rbp+20h]  
00007FFED9688951  mov         ecx,4  
00007FFED9688956  xor         eax,eax  
00007FFED9688958  rep stos    dword ptr [rdi]  
00007FFED968895A  mov         rcx,rsi  
00007FFED968895D  mov         qword ptr [rbp+50h],rcx  
00007FFED9688961  cmp         dword ptr [7FFED95791F8h],0  
00007FFED9688968  je          WizardWrx.ConsoleAppAids3.ConsoleAppStateManager.ComputeMessageCount(System.String[])+02Fh (07FFED968896Fh)  
00007FFED968896A  call        00007FFF390CCBA0  
00007FFED968896F  nop  
            return pastrAdditionalMessages == null ? STANDARD_MESSAGE_COUNT : pastrAdditionalMessages.Length + STANDARD_MESSAGE_COUNT;
00007FFED9688970  cmp         qword ptr [rbp+50h],0  
00007FFED9688975  je          WizardWrx.ConsoleAppAids3.ConsoleAppStateManager.ComputeMessageCount(System.String[])+046h (07FFED9688986h)  
00007FFED9688977  mov         rax,qword ptr [rbp+50h]  
00007FFED968897B  mov         eax,dword ptr [rax+8]  
00007FFED968897E  add         eax,2  
00007FFED9688981  mov         dword ptr [rbp+20h],eax  
00007FFED9688984  jmp         WizardWrx.ConsoleAppAids3.ConsoleAppStateManager.ComputeMessageCount(System.String[])+04Dh (07FFED968898Dh)  
00007FFED9688986  mov         dword ptr [rbp+20h],2  
00007FFED968898D  mov         eax,dword ptr [rbp+20h]  
00007FFED9688990  mov         dword ptr [rbp+24h],eax  
00007FFED9688993  nop  
00007FFED9688994  jmp         WizardWrx.ConsoleAppAids3.ConsoleAppStateManager.ComputeMessageCount(System.String[])+056h (07FFED9688996h)  
        }   // private static int ComputeMessageCount
00007FFED9688996  mov         eax,dword ptr [rbp+24h]  
00007FFED9688999  lea         rsp,[rbp+30h]  
00007FFED968899D  pop         rsi  
00007FFED968899E  pop         rdi  
00007FFED968899F  pop         rbp  
00007FFED96889A0  ret  

解决方法

这不是你想的那样 - 在序言中:

00007FFED9688940  push        rbp       // SAVE RBP
00007FFED9688941  push        rdi       // SAVE RDI
00007FFED9688942  push        rsi       // SAVING RSI
00007FFED9688943  sub         rsp,30h   // ADD STACK SPACE
00007FFED9688947  mov         rbp,rsp   // SAVE STACK POINTER
00007FFED968894A  mov         rsi,rcx   // SAVING RCX - (Already contains your string[] argument)
00007FFED968894D  lea         rdi,[rbp+20h]  
00007FFED9688951  mov         ecx,4  
00007FFED9688956  xor         eax,eax  
00007FFED9688958  rep stos    dword ptr [rdi]  // STACK OPS ^^^
00007FFED968895A  mov         rcx,rsi  // *****  HERE Moving string[] back to RCX in preparation for the call
00007FFED968895D  mov         qword ptr [rbp+50h],rcx  
00007FFED9688961  cmp         dword ptr [7FFED95791F8h],0  
00007FFED9688968  je          WizardWrx.ConsoleAppAids3.ConsoleAppStateManager.ComputeMessageCount(System.String[])+02Fh (07FFED968896Fh)  
00007FFED968896A  call        00007FFF390CCBA0  

在调用该函数之前,您的字符串数组似乎已经存在于 RCX 中。在方法调用之前,调用者保存 RBP、RDI 和 RSI,然后添加堆栈空间并将其当前 RCX 指针保存到 RSI(函数返回后会弹出)。

接下来是一些堆栈操作,然后为调用设置参数 - 只有一个,所以 mov rcx,rsi - 正如预期的那样,您的数组指针将进入 RCX。 RDX 在这个反汇编中没有出现。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res