Assembly 汇编-操作码与nasm指令

Assembly 汇编-操作码与nasm指令,assembly,nasm,opcode,x86,Assembly,Nasm,Opcode,X86,所以我最近试着进入大会,发现自己真的对NASM的工作方式感到困惑。据我所知,它是一种用于将(助记符)指令转换为实际机器代码的汇编的“编译器”。现在我想知道NASM手册(www.NASM.us/doc/nasmdocb.html)中列出的说明和我的机器使用的操作码之间的区别是什么?比如,让我们假设我的英特尔处理器有某种没有人知道、也没有在手册中列出的秘密操作码,NASM还能组装它吗?还是只返回“无效指令”?如果我知道操作码的机器码格式,我能手动插入吗?NASM支持NASM支持的功能 确实可能存在“

所以我最近试着进入大会,发现自己真的对NASM的工作方式感到困惑。据我所知,它是一种用于将(助记符)指令转换为实际机器代码的汇编的“编译器”。现在我想知道NASM手册(www.NASM.us/doc/nasmdocb.html)中列出的说明和我的机器使用的操作码之间的区别是什么?比如,让我们假设我的英特尔处理器有某种没有人知道、也没有在手册中列出的秘密操作码,NASM还能组装它吗?还是只返回“无效指令”?如果我知道操作码的机器码格式,我能手动插入吗?

NASM支持NASM支持的功能

确实可能存在“内部”指令,或者在构建您的NASM版本后引入的指令,而它当时并不知道这些指令

这些指令(或任何指令)可以使用
db
序列或类似序列手动编码。

这包括一些英特尔没有记录但NASM支持的指令。(该链接来自标记wiki。)

这些是人们确实知道的“秘密操作码”。我假设人们已经测试了至少3或4个字节的所有可能序列,以找到像这样的未记录的操作码。当然,您不需要NASM来知道如何对它们进行编码,因为您可以使用
db
将您想要的任何字节组合到对象文件中

这并不是对你实际提出的问题的回答,但可能更符合你想知道的内容。比如@500。。。他说,NASM只是一个从已知助记符表中查找字节序列的程序。它甚至不必在x86CPU上运行,也没有一个接口来查询CPU中的指令名

你可能想把你的问题编辑成一个答案更有趣的问题


例如:

SALC;D6[8086,UNDOC]

SALC是早期未记录的指令,其概念类似于SETcc(第A.150节)。其功能是,如果进位标志清除,则将AL设置为零;如果设置,则将AL设置为0xFF

它实际上在我的Core2 CPU上以32位模式工作。(NASM和YASM在汇编64位代码时都拒绝它)

如果它不明显,请不要在可移植代码中使用它。它可能会在将来某个CPU上被破坏,该CPU使用D6作为其他指令编码的第一个字节。英特尔insn ref手册附录A操作码映射中的
D6
条目为空

操作码映射中的所有空格都是保留的,不得使用。不要依赖于设备的运行 未定义或空白操作码



不会列出描述,但仍会列出所有助记符,包括标记为
UNDOC
的助记符。大概是附录中的SSE指令太多了。

您的第一段是正确的(NASM只有一个助记符表),但它确实知道一些英特尔在ISA中没有记录的指令。看看我的答案。