是否存在与平台无关的汇编语言子集?
Is there a subset of assembler language which is platform-independent?
我最近遇到了 C 中的 asm
保留字。我想利用它来避免某些 C 语义规则:特别是我想修改函数外的变量:
int a = 5;
asm("asm code to change a from 5 to, like, 6")
int main() {
printf("a equal to %d\n", a);
}
现在,从我的计算机科学课程中我知道程序集依赖于平台,因此它的使用应该非常有限。但是,我看到了一些循环指令,例如 MOV 或 ADD。
我的问题是:
- 尽管汇编在全球范围内依赖于平台,但是否存在所有汇编程序都能理解的子集?我的意思是,如果我要编写
asm("MOV something somethingelse")
并假设 MOV 位于这个假设的子集中,那么无论平台如何,代码都是正确的吗?
- 如果平台独立子集确实存在,有人可以link吗?
- 如果没有独立于平台的子集,最常见的汇编语法是什么?
1) Although assembly is globally platform dependent, is there a subset
of it that is understood by all assembler? I mean, if I were to write
asm("MOV something somethingelse") and assuming MOV is inside this
hypothetical subset, would the code be correct regardless of the
platform?
没有。虽然所有版本的汇编语言都可能有像 MOV 这样的命令,但语法会不同,寄存器会不同,并且当它 assembled 进入机器语言时,表示该指令的实际二进制代码可能会不同。
这样想 - 独立于平台的子集必须 assemble 完全相同的一组位,每台计算机都必须解释相同的位,(或 assemble必须为同一汇编语言的所有不同体系结构编写 rs)。如果是这样的话,平台独立性将是一项相当微不足道的任务。
2) If that platform independent subset exists indeed, can someone link
it?
没有,所以没有。
3) If there is no platform-independent subset, which are the most
common assembler syntaxes?
MASM、NASM 和 GAS(特别适用于 ARM 架构)
是否以及如何将汇编语言插入 C 语言在很大程度上是特定于编译器的,因此首先也是最重要的是,您在那里失去了任何可移植性。第二,汇编语言是由汇编器定义的,就是解析它的程序,x86对于同一个机器码有几种到几十种汇编语言。因此,没有任何跨汇编语言通用的概念。即使您使用内联汇编,linking 与它有什么关系,如果您想 link 然后创建一个对象,而不是内联。对于 x86,最流行的可能已经回答 nasm,masm 和 gnu 汇编器,只要看看 Whosebug 标签,我认为命中是按这个顺序排列的。
最后你不能用内联汇编语言改变 C 语言,那不是那样的。
我最近遇到了 C 中的 asm
保留字。我想利用它来避免某些 C 语义规则:特别是我想修改函数外的变量:
int a = 5;
asm("asm code to change a from 5 to, like, 6")
int main() {
printf("a equal to %d\n", a);
}
现在,从我的计算机科学课程中我知道程序集依赖于平台,因此它的使用应该非常有限。但是,我看到了一些循环指令,例如 MOV 或 ADD。
我的问题是:
- 尽管汇编在全球范围内依赖于平台,但是否存在所有汇编程序都能理解的子集?我的意思是,如果我要编写
asm("MOV something somethingelse")
并假设 MOV 位于这个假设的子集中,那么无论平台如何,代码都是正确的吗? - 如果平台独立子集确实存在,有人可以link吗?
- 如果没有独立于平台的子集,最常见的汇编语法是什么?
1) Although assembly is globally platform dependent, is there a subset of it that is understood by all assembler? I mean, if I were to write asm("MOV something somethingelse") and assuming MOV is inside this hypothetical subset, would the code be correct regardless of the platform?
没有。虽然所有版本的汇编语言都可能有像 MOV 这样的命令,但语法会不同,寄存器会不同,并且当它 assembled 进入机器语言时,表示该指令的实际二进制代码可能会不同。
这样想 - 独立于平台的子集必须 assemble 完全相同的一组位,每台计算机都必须解释相同的位,(或 assemble必须为同一汇编语言的所有不同体系结构编写 rs)。如果是这样的话,平台独立性将是一项相当微不足道的任务。
2) If that platform independent subset exists indeed, can someone link it?
没有,所以没有。
3) If there is no platform-independent subset, which are the most common assembler syntaxes?
MASM、NASM 和 GAS(特别适用于 ARM 架构)
是否以及如何将汇编语言插入 C 语言在很大程度上是特定于编译器的,因此首先也是最重要的是,您在那里失去了任何可移植性。第二,汇编语言是由汇编器定义的,就是解析它的程序,x86对于同一个机器码有几种到几十种汇编语言。因此,没有任何跨汇编语言通用的概念。即使您使用内联汇编,linking 与它有什么关系,如果您想 link 然后创建一个对象,而不是内联。对于 x86,最流行的可能已经回答 nasm,masm 和 gnu 汇编器,只要看看 Whosebug 标签,我认为命中是按这个顺序排列的。
最后你不能用内联汇编语言改变 C 语言,那不是那样的。