编写汇编程序:处理 x64 REX 和 VEX 编码的干净高效的方法?

问题描述 投票:0回答:1

我正在开发一个 x64 汇编器(只有 64 位,至少目前如此),而且我已经取得了相当大的进展(我支持几乎所有指令,包括大多数扩展),但我有一些相当沉重的技术债务在 REX 和 MOD/RM 区域,我正在寻求解决这个问题。

让我们以this为例 - 这是当我需要计算VEX指令的REX前缀时调用的函数。坦率地说,这很可怕:一堆

switch
和修复
if
在开发过程中很有用,但已成为障碍。

我该如何清理它?具体来说,x64 中是否有一些行为可以用来简化这里的逻辑? (我使用 VEX 版本作为示例,但我正在寻找可以适用于其他 REX 前缀的解决方案,即 EVEX)。

在我当前的版本中,我使用的是指令编码,可以在 Intel x64 文档中看到,或者在 FC 的指令集合(已从 Intel PDF 中删除)中看到。我还按照寄存器出现的顺序对它们进行编码,并将它们编码为二进制(1 = 寄存器已扩展,0 = 未扩展),但与所有修复一起

if
,它简直丑陋。

我考虑过添加一些子集编码,旨在解决修复

if
的问题,但我不确定我是否可以涵盖所有这些。

有没有更好的方法来做到这一点?如果是的话,那是什么? (注意;我选择不在 CR 堆栈交换上发布此内容,因为我正在尝试解决与 x64 编码相关的问题,而不仅仅是我的代码。)

assembly x86-64 instruction-encoding
1个回答
0
投票

我通过将问题分成几个部分来解决它。

首先,我指定了描述指令的数据结构Ii

然后我定义了将指令的属性转换为该结构的宏,例如IiAssembleAVX。他们的名字以 Ii 开头...

最后,我使用这些先前定义的宏为每条指令准备了描述,例如VADDPD

© www.soinside.com 2019 - 2024. All rights reserved.