是否有标准定义汇编语言的语法和语义?同样,语言 C 具有 ISO 标准,语言 C#具有 ECMA 标准?是否只有一个标准,或者还有更多标准?
我问,因为我noticed 汇编语言代码在 Windows 和 Linux 上看起来不同强>环境。我希望汇编语言不依赖于OS,它只是具有一些定义标准的语言,并且通过汇编程序(汇编语言的编译器)被转换为机器指令用于特定的处理器
谢谢你的回答
答案 0 :(得分:5)
与标准最接近的是创建处理器/指令集的供应商将拥有描述该语言的文档,并且该供应商通常会提供某种汇编程序(程序)。有些供应商比其他供应商更具细节和标准,因此您可以获得所需。然后像这样的英特尔/事情发生了事情。添加到那个gnu汇编程序喜欢搞乱它支持的芯片的汇编语言,所以一般来说你有混乱。
如果有一种汇编语言的用法与C或C ++相当,那么你会期望一个组织试图提出一个标准。问题的一部分仍然是像C语言这样的东西在它碰到硬件之前有一个解释,汇编程序没有很少,所以芯片供应商会因为市场因素而做出他们想做的任何事情。必须拖动标准以匹配硬件,而不是标准驱动供应商的其他方式。
opencore处理器可能是标准驱动的处理器,因为它不是供应商特定的,也许它已经是。
使用程序集假设每个汇编程序/软件/工具的每个版本在同一指令集内以及不同的指令集中都有自己的语法规则。 (这实际上是你用C / C ++得到的,但这是另一个话题)要么选择你喜欢的工具而只知道它,要么试着记住所有工具的所有变化,或者我的偏好是尽量避免使用尽可能多的工具具体的语法和细微差别,并尝试找到有效的工作或至少有机会工作或移植工具的中间地带。
答案 1 :(得分:4)
是的,有一个标准。
直到20世纪80年代,构建汇编程序的人才选择了各种各样的语法方案。
IEEE社区对标准的反应是试图避免这个问题:
694-1985 - IEEE Standard for Microprocessor Assembly Language
与软件世界中的许多事情一样,它在很大程度上被忽视了。
答案 2 :(得分:2)
不,没有标准。 甚至还有两个different types of syntax:英特尔语法在Windows平台上占主导地位,而AT& T-sytanx在* nix-world中占主导地位。 关于维基百科中不同的代码:windows示例使用Win32API,linux示例使用0x80 interrupt的系统调用。
答案 3 :(得分:1)
好吧,我不确定你是否在询问x86处理器的语法(我想是的,因为你提到的是NASM)。
但有两个共同的标准:
您提到的NASM更喜欢英特尔语法。
您可以在本文中找到一些语法差异示例:http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html。
答案 4 :(得分:1)
汇编语言因处理器而异,所以没有,没有标准。
通常,特定处理器系列的“标准”汇编语言是处理器设计者所说的。例如,x86的“标准”语法是英特尔所说的。但是,这并不妨碍其他人使用略微不同的语法或附加功能创建针对处理器的汇编语言变体(Nasm就是一个例子)。
答案 5 :(得分:1)
汇编语法/语言取决于CPU而不是OS。对于x86 CPU系列,有两种语法AT& T(默认情况下由Unix操作系统使用)和Intel(Windows和DOS等使用)。
然而,wiki上的两个程序集示例都在做不同的事情。 windows示例使用WIN32 API并显示一个消息框,因此所有函数参数都以相反的顺序被压入堆栈,然后调用函数MessageBox(),然后创建消息框。
linux示例使用write
系统调用将字符串写入stdout。这里所有'参数'都存储在寄存器中,然后int 0x80
创建一个'中断',现在操作系统进入内核域,内核将字符串打印到stdout。
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
,而后者执行与wiki上的示例完全相同的代码。
另外需要注意的是,Windows和Unix之类的操作系统在库和应用程序中使用不同的文件格式。
Unix类系统使用ELF http://en.wikipedia.org/wiki/Executable_and_Linkable_Format,Windows使用PE http://en.wikipedia.org/wiki/Portable_Executable
这就是您在维基页面上看到程序集中不同部分的原因。
答案 6 :(得分:1)
没有,因为有许多不同的CPU具有不同的指令和其他特性,这完全取决于他们的设计者使用什么语法以及如何命名。并且没有必要对其进行标准化,因为汇编代码本质上是不可移植的,无论如何都需要为不同的CPU重写。
汇编语言本身不是特定于操作系统的,它是特定于CPU的,但是对于汇编例程来说,访问看起来很标准的东西(例如,在控制台中打印文本的一些子例程)需要特定于操作系统的代码。对于MSDOS,你可以使用BIOS和DOS中断服务程序(通过int 13h,int 10h,int 21h,int 33h等指令在x86 CPU上调用),对于Windows你可以使用Windows'(可通过int 2eh和sysenter获得) / syscall指令),对于Linux,你要使用Linux'(例如int 80h)。所有这些都在不同的操作系统中以不同的方式实现,并且期望不同数量和种类的参数以及不同的位置(寄存器或存储器)。你无法标准化这部分。你可以做的唯一事情就是在操作系统功能之上构建一个兼容性/抽象层,所以从你的程序集例程来看它看起来是一样的。