我真的很难过,请帮忙......
我从英特尔,软件开发人员手册中订购了一堆书,在他们内部,他们给了我所有这些操作码,如“VEX.128 ......”或“0F 5B”
并且这些书说“这适用于XMM寄存器”,但没有一本书谈论如何将单词XMM转换为十六进制?
我想要做的就是写一个hello,纯十六进制的世界,而不使用汇编程序!请帮忙!我希望这是有道理的我是装配和十六进制世界的新手
单词XMM未转换为十六进制。指令使用XMM寄存器是操作码和前缀的属性。寄存器操作数的索引主要由ModRM字节编码,前缀稍有一些,对于GPR上的某些操作,寄存器名称在操作码字节中编码。
除了复杂性之外,这里有一个简单的VEX前缀示例vpaddb xmm1, xmm4, xmm6
。它在手册中的条目(在paddb
引理下)说它编码为:VEX.NDS.128.66.0F.WIG FC /r
VEX.NDS.128.66.0F.WIG
用于VEX前缀。 NDS表示vvvv字段对源寄存器进行编码。 128
表示不设置L位,这使得寄存器使用XMM版本,否则它们将是YMM版本(因此您看到此区别由VEX前缀中的单个位编码,而不是通过写入“XMM”一词“完全以十六进制表示”66
表示pp字段的设置,它对应于遗留编码中的强制性前缀,即pp = 01. WIG = W-ignored,这在这里并不重要。
无论如何,它可以是一个2字节的VEX前缀(没有花哨的操作码映射,低寄存器号),所以从C5
开始,然后组合字段~R|~vvvv|L|pp
(其中|
是串联)。 ~vvvv是vvvv的补充,vvvv = 0100(xmm4)。 R字段是ModRM字节的reg字段的扩展,xmm1
具有小于8的索引,因此R字段为0,因此~R为1.组合,该第二前缀字节是1|1011|0|01 = D9
。
操作码字节是FC
,没有什么好笑的。
/r
意味着将其余的操作数编码为ModRM(+ SIB),所以这里使用mod = 11(两个寄存器,没有内存操作数),rm = 110(xmm6),reg = 001(xmm1)所以11001110 = CE
因此,总共vpaddb xmm1,xmm4,xmm6
成为c5 d9 fc ce
。
您可以在ISDM的附录B“指令格式和编码”中找到此信息(以及我跳过的一些细节)。