- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在深入到汇编领域,主要是从x86_64、C和System V AMD64的角度,通常以Linux为目标。
通过按顺序使用以下寄存器,整数(以及指针)值的调用约定非常简单:
RDI公司
相对强弱
黑索今
RCX公司
8兰特
R9号
XMM0-7型
较长的参数计数通过将值推送到子例程的堆栈帧上来处理。我得到了这些寄存器名。
对于更大的值(如结构和数组),约定似乎也要推入被调用方的堆栈帧。
但是,函数的浮点参数的调用约定是什么?是否使用浮点寄存器?
另一个相关的问题是:如果我有混合的参数类型呢?
void mixed(int a, float b, mystruct c) { /* ... */ }
最佳答案
参数传递的调用约定在第3.2.3节的System V Application Binary Interface for AMD64PDF文档中指定。
我不确定文件是否可以在这里合法引用,但我至少可以解释一下。
分类类型
首先,文档定义了八种不同的参数值分类:
整数:使用通用寄存器的整数类型和指针
SSE:使用向量寄存器的类型。
SSEUP:与SSE类似,但主要用于存储大(>=128位)值的高位字节
X87:浮点类型。
X87UP:大型浮点类型的高位字节。
COMPLEX_X87:complex
浮点类型的寄存器。
没有类:填充区域和空结构和联合,通常在堆栈的内存中。
内存:以独占方式在主内存堆栈上传递的类型。
分类规则
接下来定义了C类型如何适应这些分类:_Bool
、char
、short
、int
、long
、long long
、float
和指针被分类为整数,并将使用这些寄存器。double
、_Decimal32
、_Decimal64
、__m64
和__float128
被归类为SSE并将使用这些寄存器。_Decimal128
、__m128
和__m256
分成两半,在SSE中存储最低有效字节/位,在SSEUP中存储最高有效字节/位。__m512
被分成四个64位(8字节)值,其中最低有效字节存储为SSE,其余字节存储为SSEUPlong double
类似地被分成64位(8字节)块,最低有效字节存储为SSE,其他所有字节存储为SSEUP__int128
值将其64位尾数存储为X87,16位指数填充到64位(8字节)并存储在X87以上。long
基本上是以整数形式存储为两个complex double
值,前半部分是低位/字节,后半部分是高位/字节。可以将它们理解为一个结构:
typedef struct {
long low_bits, high_bits;
} __int128;
complex float
和
complex long double
类型被分成两半,其中前一半是实组件,后一半是虚组件,并存储在SSE中。它们可以被理解为一个类似这样的结构:
typedef struct {
double real, imaginary;
} complex_double;
struct
值被分类为复数。
union
s、
struct
s和数组的逻辑相当复杂,有关详细信息,请参阅上面链接的文档。简而言之,有一个递归算法定义了如何传递聚合类型,决定如何传递值。
union
s,
%rdi
s和数组的分类系统和递归算法,我们将此系统和算法应用于函数的参数,每个参数包括以下步骤:
%rsi
、
%rdx
、
%rcx
、
%r8
、
%r9
、
%xmm0
和
%xmm7
中的下一个可用寄存器。
%xmm
到
关于c - System V中x86_64的C中浮点值的调用约定是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57859857/
我有一个带有帮助页面的 Web API 2 项目,该项目在本地运行良好,但当我将其推送到 Azure 时抛出此错误: Method not found: 'System.String System.S
我有两台服务器,但通常运行相同的设置 - IIS、SQL Server 等。一台给我这个错误,另一台没有。我从 Visual Studio 向两者发布相同的代码。 它们都在运行 .NET CLR Ve
System.out声明为 public static final PrintStream out。 但是你可以调用System.setOut()重新分配它。 嗯?如果它是 final,这怎么可能?
System.out被声明为 public static final PrintStream out。 但是您可以调用System.setOut()重新分配它。 嗯?如果是 final,这怎么可能?
我有这个 linq 查询: private void GetReceivedInvoiceTasks(User user, List tasks) { var areaIds = user.A
我有一个 MonoTouch 应用程序,当我为设备编译它时,出现以下错误: Error MT2002: Can not resolve reference: System.Boolean System
您好,我有一个名为 DailyVisitReport 的 View 。在该 View 中,我有两个名为 FromDate 和 toDate 的字段。如果我选择 FromDate 和 ToDate 取决
是否可以从 ObjectContext 对象中读取元组列表? 我在存储过程中有类似这样的数据库查询 SELECT T.Id as Item1, -- this is guid T.Wo
我正在尝试创建 Odata 端点,但每当我尝试执行任何涉及日期的查询时都会收到此错误。 我在下面的非常简单示例中重新创建了它。 数据库表 EDMX(片段)
我正在尝试创建 Odata 端点,但每当我尝试执行任何涉及日期的查询时都会收到此错误。 我在下面的非常简单示例中重新创建了它。 数据库表 EDMX(片段)
我有一个方法可以从数据读取器的数据中生成类类型列表。 if (datareader != null && datareader .HasRows) { Dictionary pDict= GetP
我有一些旧的 C++ 代码,它们使用 stdio 进行输入和输出。该代码还通过 fork 生成新进程。它将 stdio 重新映射到每个新进程,以便每个 session 获取其各自的数据。 我正在考虑使
我的应用程序可以很好地构建/链接/部署到模拟器,但我只是第一次尝试将应用程序构建/部署到真实设备,并且链接器失败。 我不使用 System.Console或 ConsoleColor在我的应用程序的任
主要是我很好奇。 我们有一个名为 Unit 的对象在我们的代码库中 - 代表桥梁或道路的组件。在我们的例子中,看到带有 Unit 的 ReactiveUI 命令可能会模棱两可。作为声明中的泛型之一。
我试图将Object变量转换为StreamWriter。但是,它不起作用。有什么错? StreamWriter file = (StreamWriter) myObject; 最佳答案 myObjec
为什么以下不编译? using System; using System.Linq; using System.Linq.Expressions; public static class Extens
我正在使用 Visual Studio Community 2015 开发面向 .NET 4.5 的 Visual Basic 应用程序.我没有编写应用程序,所以我使用 NuGet 添加了所有缺失的依
我刚刚开始使用 powershell,我正在制作一个非常简单的加密功能。我想获取字符串中的每个字符,将其转换为 int 并添加一个选定的数字,然后将其转换回一个字符。 这工作正常: function
一些使用我的应用程序的人似乎变得越来越 System.MissingMethodException: Method not found: 'System.Object System.Windows.T
我是 C# 和实体的新手 我想知道是否有人在这里帮助我。我选择了哪个返回我的 customerid,所以我想将它作为参数传递给我的构造函数,我的构造函数参数类型是 guid 但我的选择类型不同,我不知
我是一名优秀的程序员,十分优秀!