如何将操作码转换为十六进制代码

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

我真的很难过,请帮忙......

我从英特尔,软件开发人员手册中订购了一堆书,在他们内部,他们给了我所有这些操作码,如“VEX.128 ......”或“0F 5B”

并且这些书说“这适用于XMM寄存器”,但没有一本书谈论如何将单词XMM转换为十六进制?

我想要做的就是写一个hello,纯十六进制的世界,而不使用汇编程序!请帮忙!我希望这是有道理的我是装配和十六进制世界的新手

assembly x86 machine-code
1个回答
3
投票

单词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“指令格式和编码”中找到此信息(以及我跳过的一些细节)。

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