相同 cpu 的不同汇编语法?
Different assembly syntaxes for same cpu?
我决定通过在线教程学习汇编程序。
我遇到过这个使用 NASM 编译器的教程,大多数其他教程似乎也是如此:
http://www.tutorialspoint.com/assembly_programming/index.htm
我也看过这个 youtube 系列 "Assembly primer for hackers"
https://www.youtube.com/watch?v=K0g-twyhmQ4&list=PLue5IPmkmZ-P1pDbF3vSQtuNquX0SZHpB
这个使用了那个人描述为 'generic linux compiler' (owtte) 的东西。
编译命令是这样的:
as -o file.o file.s
其中file.s是汇编源代码。紧随其后:
ld -o file file.o
然后文件就是可执行文件。
每个教程都使用不同的语法(例如,后一个教程中的寄存器总是以 % 开头。注意。语法上的表面差异似乎也比这少)。这些语法是由各个编译器决定的吗?
当我尝试使用后一种方法编译 NASM 教程中的代码时,我最初也感到困惑。我一直认为指令集必须依赖于 CPU,因此我使用哪个编译器无关紧要。我刚刚得出结论,这只是语法上的差异,但这是正确的吗?
我是 运行 一台 Linux 计算机,顺便说一句,内核是 4.1.6。
我的主要问题是我真正使用哪种语法?这只是一个选择问题吗?一种比另一种使用更广泛吗?感谢您的帮助。
Each of the tutorials uses a different syntax (e.g. a register in the
latter tutorial is always preceded by %. NB. There do appear to be
less superficial differences in the syntax than this as well). Are
these syntaxes decided by the individual compiler?
是的,不同的汇编器(= 汇编语言编译器)可能使用不同的汇编语言语法,尽管它们为相同的处理器和平台提供代码。
My main question is really which syntax do I use? Is it just a matter
of choice? Is one more widely used than the other?
一个汇编程序,如 NASM,可能适用于范围广泛的处理器和平台,在这种情况下,当您需要使用多个处理器或平台时,学习其语法会有所帮助。
在其他情况下,坚持使用一些著名供应商的汇编器可能会更好,因为它被广泛使用,您可以在网上找到更多示例代码,这可能有助于您的开发。
最后同样重要的是,您可能只是喜欢某个特定的汇编器,因为您喜欢它的特性或语法。
如果您使用的是 Windows 系统,Microsoft 的 MASM(ML.EXE 或 ML64.exe 用于 64 位)语法实际上与 Intel 的语法相同。 MASM(ML.EXE 和 ML64.EXE)包含在免费的 Visual Studio 速成版中,尽管您通常必须创建自定义构建步骤才能在 VS 项目中调用汇编程序。 VS Express 包含一个很好的源代码级调试器。
如果您使用的是 Linux 类型系统,那么您可能会使用 AT&T 语法,我认为它最终会以这种方式结束,因为它是一些通用汇编程序的转换。我不知道为 Linux.
推荐哪个汇编程序
我决定通过在线教程学习汇编程序。
我遇到过这个使用 NASM 编译器的教程,大多数其他教程似乎也是如此: http://www.tutorialspoint.com/assembly_programming/index.htm
我也看过这个 youtube 系列 "Assembly primer for hackers" https://www.youtube.com/watch?v=K0g-twyhmQ4&list=PLue5IPmkmZ-P1pDbF3vSQtuNquX0SZHpB 这个使用了那个人描述为 'generic linux compiler' (owtte) 的东西。 编译命令是这样的:
as -o file.o file.s
其中file.s是汇编源代码。紧随其后:
ld -o file file.o
然后文件就是可执行文件。
每个教程都使用不同的语法(例如,后一个教程中的寄存器总是以 % 开头。注意。语法上的表面差异似乎也比这少)。这些语法是由各个编译器决定的吗?
当我尝试使用后一种方法编译 NASM 教程中的代码时,我最初也感到困惑。我一直认为指令集必须依赖于 CPU,因此我使用哪个编译器无关紧要。我刚刚得出结论,这只是语法上的差异,但这是正确的吗?
我是 运行 一台 Linux 计算机,顺便说一句,内核是 4.1.6。
我的主要问题是我真正使用哪种语法?这只是一个选择问题吗?一种比另一种使用更广泛吗?感谢您的帮助。
Each of the tutorials uses a different syntax (e.g. a register in the latter tutorial is always preceded by %. NB. There do appear to be less superficial differences in the syntax than this as well). Are these syntaxes decided by the individual compiler?
是的,不同的汇编器(= 汇编语言编译器)可能使用不同的汇编语言语法,尽管它们为相同的处理器和平台提供代码。
My main question is really which syntax do I use? Is it just a matter of choice? Is one more widely used than the other?
一个汇编程序,如 NASM,可能适用于范围广泛的处理器和平台,在这种情况下,当您需要使用多个处理器或平台时,学习其语法会有所帮助。
在其他情况下,坚持使用一些著名供应商的汇编器可能会更好,因为它被广泛使用,您可以在网上找到更多示例代码,这可能有助于您的开发。
最后同样重要的是,您可能只是喜欢某个特定的汇编器,因为您喜欢它的特性或语法。
如果您使用的是 Windows 系统,Microsoft 的 MASM(ML.EXE 或 ML64.exe 用于 64 位)语法实际上与 Intel 的语法相同。 MASM(ML.EXE 和 ML64.EXE)包含在免费的 Visual Studio 速成版中,尽管您通常必须创建自定义构建步骤才能在 VS 项目中调用汇编程序。 VS Express 包含一个很好的源代码级调试器。
如果您使用的是 Linux 类型系统,那么您可能会使用 AT&T 语法,我认为它最终会以这种方式结束,因为它是一些通用汇编程序的转换。我不知道为 Linux.
推荐哪个汇编程序