Standards 汇编语言标准

Standards 汇编语言标准,standards,assembly,Standards,Assembly,是否有一个标准定义了汇编语言的语法和语义?与语言C具有ISO标准和语言C具有ECMA标准类似?是只有一个标准,还是更多 我这样问是因为我发现在Windows和Linux环境下,汇编语言的代码看起来不同。我希望汇编语言不依赖于操作系统,它是唯一具有某种定义标准的语言,并且通过汇编程序(汇编语言的编译器)被翻译成机器指令,特别是针对处理器 谢谢您的回答,我不确定您是否询问x86处理器的语法(我想是的,因为您提到的是NASM) 但有两个共同标准: 最初用于x86平台文档的英特尔语法 AT&T语法在L

是否有一个标准定义了汇编语言的语法和语义?与语言C具有ISO标准和语言C具有ECMA标准类似?是只有一个标准,还是更多

我这样问是因为我发现在WindowsLinux环境下,汇编语言的代码看起来不同。我希望汇编语言不依赖于操作系统,它是唯一具有某种定义标准的语言,并且通过汇编程序(汇编语言的编译器)被翻译成机器指令,特别是针对处理器


谢谢您的回答,我不确定您是否询问x86处理器的语法(我想是的,因为您提到的是NASM)

但有两个共同标准:

  • 最初用于x86平台文档的英特尔语法
  • AT&T语法在Linux/Unix世界中很常见
您提到的NASM更喜欢英特尔语法


您可以在本文中找到一些语法差异的示例:。

汇编语言因处理器而异,所以没有标准

一般来说,特定处理器系列的“标准”汇编语言是处理器设计者所说的任何语言。例如,x86的“标准”语法就是英特尔所说的。但是,这并不妨碍其他人创建一种汇编语言变体,该变体以语法或附加功能稍有不同的处理器为目标(Nasm就是一个例子)。

不,没有标准。 甚至有两种:在Windows平台上占主导地位的intel语法和在*nix世界中占主导地位的AT&T-sytanx。
关于wikipedia中外观不同的代码:windows示例使用Win32API,linux示例使用系统调用。

汇编语法/语言取决于CPU,而不是操作系统。但是,对于x86CPU系列,有两种语法:AT&T(默认情况下用于类Unix操作系统)和Intel(用于Windows和DOS等)

然而,wiki上的两个程序集示例都在做不同的事情。windows示例使用WIN32 API和来显示消息框,因此所有函数参数都以相反的顺序推送到堆栈上,然后调用函数MessageBox(),该函数将创建MessageBox

linux示例使用
write
syscall将字符串写入stdout。这里所有的“参数”都存储在寄存器中,然后
int0x80
创建一个“中断”,此时操作系统正在进入内核区域,内核将字符串打印到标准输出

linux组件可以重写为:

section .data
msg:   db     "Hello, world!", 10
.len: equ    $ - msg

section .text

extern write
extern exit

global _start
_start:
        push msg.len
        push msg
        push dword 1
        call write

        push dword 0
        call exit
上面的程序集必须与libc链接,然后这将调用libc中的
write
,而libc会执行与wiki上的示例完全相同的代码

另外需要注意的是,Windows和类Unix操作系统在这些库和应用程序中使用不同的文件格式

类Unix系统使用ELF,windows使用PE


这就是为什么您在wiki页面上的程序集中会看到不同的部分。

没有,因为有许多不同的CPU具有不同的指令和其他特性,完全取决于它们的设计者使用什么语法以及如何命名。而且几乎不需要标准化,因为汇编代码本质上是不可移植的,并且无论如何都需要为不同的CPU重写


汇编语言本身并不是特定于操作系统的,它是特定于CPU的,但是对于一个汇编例程来说,要访问对您来说是标准的东西(例如,一些在控制台中打印文本的子程序),需要特定于操作系统的代码。对于MSDO,您将使用BIOS和DOS中断服务例程(可通过int 13h、int 10h、int 21h、int 33h等指令在x86 CPU上调用),对于Windows,您将使用Windows(通过int 2eh和sysenter/syscall指令提供),对于Linux,您将使用Linux(例如int 80h)。所有这些都在不同的操作系统中以不同的方式实现,并且在不同的位置(寄存器或内存)需要不同数量和种类的参数。你不能标准化这个部分。对此,您唯一能做的就是在操作系统功能的基础上构建一个兼容性/抽象层,以便从汇编例程的角度来看,它看起来是一样的。

最接近标准的事情是,创建处理器/指令集的供应商将有一个描述该语言的文档,并且通常该供应商将提供该文档提供某种汇编程序(程序)。有些供应商比其他供应商更注重细节和标准,所以你可以得到你想要的。然后像intel/at&t这样的事情碰巧把事情搞砸了。此外,gnu汇编器也喜欢把它支持的芯片的汇编语言搞得一团糟,所以一般来说你会感到混乱

<>如果有一个汇编语言的使用与C或C++相比较,那么你会期望一个组织尝试提出一个标准。问题的一部分仍然是,对于C语言这样的东西,在它进入硬件之前有一个解释,对于汇编语言,没有或很少有解释,因此芯片供应商将根据市场因素制造他们想要制造的任何产品,而标准将不得不被拖拽以匹配硬件,而不是标准驱动供应商的另一种方式

opencore处理器可能是一个标准驱动的处理器,因为它不是特定于供应商的,也许它已经是了

使用汇编时,假设每个汇编程序/软件/工具的每个版本在同一指令集中以及在不同指令集中都有自己的语法规则