所以我最近试图进入集会,并发现自己真的与NASM的工作方式混淆。据我所知,它是一种编译器'用于将(助记器)指令转换为实际机器代码的程序集。现在我想知道NASM手册(www.nasm.us/doc/nasmdocb.html)中列出的说明和我的机器所采用的操作码之间有什么区别?就像,让我们假装我的英特尔处理器有某种秘密操作码,没有人知道并且没有在手册中列出,NASM是否仍然可以组装它?或者只是返回无效指令'?并说我知道操作码的机器码格式,我能够手动插入吗?
答案 0 :(得分:6)
NASM支持NASM支持的功能。
确实可能存在“内部”指令,或者在您构建NASM版本之后引入的指令,然后它们就不会知道了。
您可以使用db
序列或类似方法手动编码那些(或实际上任何指令)。
答案 1 :(得分:0)
此old version of the nasm manual包含一些英特尔未记录但NASM支持的说明。 (该链接来自x86标记维基。)
这些是人们做知道的“秘密操作码”。我假设人们至少测试了最多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指示过于膨胀。