汇编 - 操作码与nasm指令

时间:2016-04-11 17:59:42

标签: assembly nasm opcode

所以我最近试图进入集会,并发现自己真的与NASM的工作方式混淆。据我所知,它是一种编译器'用于将(助记器)指令转换为实际机器代码的程序集。现在我想知道NASM手册(www.nasm.us/doc/nasmdocb.html)中列出的说明和我的机器所采用的操作码之间有什么区别?就像,让我们假装我的英特尔处理器有某种秘密操作码,没有人知道并且没有在手册中列出,NASM是否仍然可以组装它?或者只是返回无效指令'?并说我知道操作码的机器码格式,我能够手动插入吗?

2 个答案:

答案 0 :(得分:6)

NASM支持NASM支持的功能。

确实可能存在“内部”指令,或者在您构建NASM版本之后引入的指令,然后它们就不会知道了。

您可以使用db序列或类似方法手动编码那些(或实际上任何指令)。

答案 1 :(得分:0)

old version of the nasm manual包含一些英特尔未记录但NASM支持的说明。 (该链接来自标记维基。)

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

这不是你实际要求的答案,但可能更符合你想要知道的内容。就像@ 500 ...所说,NASM只是一个从已知助记符表中查找字节序列的程序。它甚至不必在x86 CPU上运行,也没有用于向CPU查询指令名称的接口。

您可能希望将问题编辑成一个更有趣的答案。

例如:

SALC ; D6 [8086,UNDOC]

  

SALC是一种早期的无证教学,与SETcc概念相似(A.150部分)。其功能是如果进位标志清零则将AL设置为零,如果设置为清空则设置为0xFF。

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

如果不明显请勿在便携式代码中使用。它会受到未来某些CPU的破坏,这些CPU使用D6作为其他指令编码的第一个字节。英特尔insn参考手册附录A中操作码映射中的D6条目为空。

  

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

current version of the NASM manual未列出说明,但仍会列出所有助记符,包括标记为UNDOC的助记符。据推测,阑尾因SSE指示过于膨胀。