hyengine 寄存器问题之传递参数和接收返回值如何解决

简介: hyengine 寄存器问题之传递参数和接收返回值如何解决

问题一:优化前和优化后的方法调用汇编代码有哪些主要区别?


优化前和优化后的方法调用汇编代码有哪些主要区别?


参考回答:

优化前的方法调用汇编代码(如示例所示)在调用前后涉及了两次内存访问(str和ldr指令),分别用于将寄存器的值拷回栈和从栈中恢复寄存器的值。而优化后的代码则直接通过寄存器(x1作为第一个参数,x0作为返回值)进行参数传递和接收返回值,避免了这两次内存访问。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666146



问题二:在优化后的汇编代码中,如何直接通过寄存器传递参数和接收返回值?


在优化后的汇编代码中,如何直接通过寄存器传递参数和接收返回值?


参考回答:

在优化后的汇编代码中,通过mov x1, x22指令将第一个参数x22直接放入寄存器x1中,以符合arm64的调用约定。方法调用后,通过mov x22, x0指令将返回值(存储在x0中)直接放入x22寄存器中,以便后续使用。这样,整个过程无需通过栈进行中间存储,减少了内存访问。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666147



问题三:为什么优化后的代码中的寄存器编号比优化前多1?


为什么优化后的代码中的寄存器编号比优化前多1?


参考回答:

优化后的代码中的寄存器编号比优化前多1,是因为在优化过程中给栈偏移0也分配了寄存器(尽管这个信息在给出的代码片段中没有直接体现)。由于每个额外的寄存器分配都会占用一个新的寄存器编号,因此整体寄存器编号会增加。不过,这一变化对于理解寄存器参数传递的优化过程并不是关键,重要的是理解如何通过寄存器减少内存访问开销。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666148



问题四:在优化前,方法头部取参数的代码是如何工作的?


在优化前,方法头部取参数的代码是如何工作的?


参考回答:

在优化前,方法头部取参数的代码通过ldr x9, [x19]指令从栈中(假设x19是指向栈顶的寄存器)加载第一个参数到寄存器x9中,然后通过mov x20, x9指令将x9中的值移动到另一个寄存器x20中,以供后续使用。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666149



问题五:优化后的方法头部取参数代码与优化前相比有什么不同?


优化后的方法头部取参数代码与优化前相比有什么不同?


参考回答:

优化后的方法头部取参数代码与优化前的主要不同在于,它直接使用了调用者传递参数的寄存器x1(在arm64调用约定中,x1通常用于传递第一个参数)来存储参数值,而不是先从栈中加载。优化后的代码通过mov x20, x1指令直接将x1中的参数值移动到x20寄存器中。


关于本问题的更多回答可点击原文查看:https://developer.aliyun.com/ask/666150

相关文章
|
缓存 Java Spring
Spring框架(四) 三级缓存与循环依赖
首先我们需要明白什么是循环依赖 , 打个比方 , 就是说A对象在创建的过程中 , 需要依赖注入B对象 , 但是B对象没有 , 就需要去创建 , 而在创建B对象的过程中又需要注入A对象 , A对象此时还在创建中,所以就构成了一个死循环 , A,B相互依赖 这样的关系被成为循环依赖(当然 , 可能还会有其他的情况),下面我们就来看看Spring是如何让解决循环依赖的
444 0
|
10月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
NoSQL Redis 数据库
12)Redis 的游标迭代器(scan)
12)Redis 的游标迭代器(scan)
250 1
|
存储 安全 前端开发
|
存储 算法 Java
Java8 CompletableFuture:异步编程的瑞士军刀
Java8 CompletableFuture:异步编程的瑞士军刀
393 2
|
Java Spring
[AIGC] Spring Interceptor 的执行顺序是怎样的?
[AIGC] Spring Interceptor 的执行顺序是怎样的?
320 2
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之源实例无主键表校验出现报错,该怎么办
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
1071 0
|
Linux 虚拟化 C语言
Linux系列——VMware Tools的安装
Linux系列——VMware Tools的安装
Linux系列——VMware Tools的安装
|
Java
elasticsearc使用指南之ES管道聚合(Pipeline Aggregation)
本节详细介绍了ES Pipeline Aggregation 管道聚合的使用方法,重点介绍了Avg Bucket Aggregation、Percentiles Bucket Aggregation、Cumulative Sum Aggregation、Bucket Sort Aggregation、Max Bucket Aggregation、Min Bucket Aggregation、Sum Bucket Aggregation、Stats Bucket Aggregation。
3995 0
|
前端开发 数据可视化 安全
漏刻有时数据可视化大屏常见问题(8)count(): Parameter must be an array or an object that implements Countable
漏刻有时数据可视化大屏常见问题(8)count(): Parameter must be an array or an object that implements Countable
561 1