我正在学习汇编语言。我从使用NASM(The Netwide Assembler)的Paul A. Carter的PC Assembly Language
开始。然后在中间我切换并开始阅读使用MASM的Introduction to 80×86 Assembly Language and Computer Architecture
。
在NASM我曾经写过,用于初始化一个字节
db 110101b
在MASM我正在使用
BYTE 110101b
我正在读书。由于这些是汇编程序指令,因此每个汇编程序的指令都不同。对? 这些汇编程序开发人员是否遵循这些指令的标准?因为,他们知道助记符是CPU特有的。所以,它在学习和汇编语言编码方面的痛苦。
现在如果他们遵循不同的指令,如果你更改汇编程序或者你切换操作系统会更加痛苦(MASM开发人员如果进入linux就会陷入困境)。
我的困惑是我应该熟悉NASM还是MASM?我很喜欢Windows,但我可能还需要在Linux上工作(将来)。
每本书都应标题为“_________汇编语言使用__________汇编程序”
答案 0 :(得分:4)
不幸的是,从未有过汇编语言的标准。您只需学习汇编程序支持的指令即可。幸运的是,大多数指令虽然名称不同,但在语义上与db和BYTE类似。
但是等等!它变得更糟,特别是对于x86。您(至少)有两种形式的代码,汇编程序可以接受这些代码:Intel和AT& T格式。 AT& T格式将大多数操作数的顺序反转为指令(反之亦然; - )。
NASM可能是更好的便携性选择,但你也可以看看GNU 汇编..
答案 1 :(得分:2)
特别是x86,第一批汇编程序来自英特尔,然后来自微软的大部分兼容汇编程序组成了一个分支。
这些汇编器从右到左组织源和目标操作数,并且有一个不寻常的(对我而言,有点古怪)抽象层,它使用单个助记符进行8,16和32位操作,然后派生出实际的机器基于操作数属性使用的操作码。存在修饰符(在操作数上)以强制特定大小。
但Unix也很重要,它有一个完全不同的汇编行,具有不同的传统和惯例。
最初的Unix供应商是AT& T,它拥有贝尔实验室开发的知识产权。一系列BSD项目和Linux继续这一传统。这些汇编器历史上从左到右处理操作数,具有针对速度优化的备用设计,并且当人类使用时,它们通常使用cpp用于宏和条件,即使汇编器也具有并行特征。
这些天你可能在Linux或Mac上使用MS on MS或Gnu,但这就是为什么我们仍然说AT& T vs Intel。 GNU汇编程序可以选择组合两种方式,尽管它仍然在AT& T阵营中。
答案 2 :(得分:1)
一般是的。它们大多与功能兼容,因此如果你们两个都知道,那么从一种汇编语法转换到另一种汇编语法通常并不是非常困难。
答案 3 :(得分:1)
处理器都记录在制造商提供的参考手册中。这通常发展为特定平台上的汇编程序的规范语法(以及供应商提供的汇编程序)。因此,来自单个供应商的许多处理器具有相似的语法。
随着处理器的第二次采购以及多目标组装商的最终发展,情况变得更加复杂,由于历史原因,这些组装商在所有平台上使用大多数一致的语法。在跨平台移植代码时,这也提供了一些可论证的优势。
您最好的选择是:选择您感觉舒适的乐谱并接受不同语法的书籍,看看您是否可以找到跨系统宏库或翻译工具,或者咬紧牙关并学习多种方言。第三种情况通常是可以忍受的,尽管它使私人图书馆的建设成为劳动密集型的。