gas vs. nasm:哪个汇编程序产生最佳代码?

10 assembly gnu-assembler nasm

这两个工具都将汇编指令直接转换为机器代码,但是有可能确定哪一个生成最快,最干净的代码?

Meh*_*ari 27

当您使用汇编程序编写时,您正在精确地描述要生成的指令,因此它不依赖于汇编程序.这取决于你.您编写的助记符与机器代码中的实际指令之间存在一对一的对应关系.

  • 从技术上讲,这不是真的; 对于寻址模式之类的东西,可以有多种方法对同一位置进行编码.还有其他我曾经忘记的同构; 当天晚些时候的x86共享软件汇编程序使用这些同构词来组装"指纹"代码,以便捕获作弊. (14认同)
  • 即使在汇编程序中也存在一些优化空间.许多体系结构允许短模式进行加法,例如使用字节值进行相对位移而不是长位.由于此优化会更改目标代码的大小,因此可能会以简短形式使用某些位移,因此需要进行多遍优化.AFAIK亚斯姆可以做到这一点. (5认同)
  • @Pinael:NASM允许您指定"优化级别",它实际上表示要对代码进行多少次传递.随着更多地址被解析,长地址可以用短地址替换,依此类推. (3认同)
  • 如果我没记错的话,NASM特别是"你所写的就是你得到的"说服力,并且会精确地生成你要求的操作码; 如果在任何地方存在歧义,则必须明确消除歧义. (2认同)

Nat*_*man 8

我不知道这两个特定的工具,但有一些指令可以编码不同:

  • ADD AX,105 0181 c0 01fe c0
  • INT 3cc或者cd 03
  • 扩展双字节SSE指令的新AVX指令将具有2字节或3字节前缀.所有2字节前缀也可以编码为3字节前缀.

这些只是我脑海里的几个例子,汇编者可以用不同的方式编码相同的指令,所以这个问题确实有意义.


Roa*_*Fre 5

作为语法问题的旁注.通过将以下行放在源文件的顶部,您可以使用英特尔语法完美地使用GAS:

.intel_syntax noprefix
Run Code Online (Sandbox Code Playgroud)

我也使用英特尔语法来满足我的所有需求.它似乎比AT&T语法更自然.它节省了一些击键:-).