汇编语言的子集是否与平台无关?

时间:2017-06-15 15:38:56

标签: c assembly inline-assembly

我最近遇到了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。

我的问题是:

  1. 虽然程序集是全局平台依赖的,但所有汇编程序都能理解它的子集吗?我的意思是,如果我写asm("MOV something somethingelse")并假设MOV在这个假设的子集中,那么无论平台如何,代码都是正确的吗?
  2. 如果确实存在该平台独立子集,有人可以将其链接吗?
  3. 如果没有与平台无关的子集,这是最常见的汇编语法?

2 个答案:

答案 0 :(得分:7)

  

1)虽然程序集是全局平台依赖的,但是有一个子集   所有汇编程序都能理解它吗?我的意思是,如果我要写   asm(" MOV,somethingelse")并且假设MOV在这里面   假设的子集,代码是否正确无论如何   平台?

不。虽然所有版本的汇编语言都可能有像MOV这样的命令,但语法会有所不同,寄存器会有所不同,当汇编成机器语言时,表示该指令的实际二进制代码可能会有所不同。

以这种方式思考 - 一个独立于平台的子集必须汇编到完全相同的位集,每个计算机必须解释相同的位(或者必须为所有不同的体系结构编写汇编程序)相同的汇编语言)。如果是这种情况,平台独立性将是一项相当简单的任务。

  

2)如果确实存在该平台独立子集,则可以有人链接   它?

它没有,所以没有。

  

3)如果没有与平台无关的子集,则最多   常见的汇编语法?

MASM,NASM和GAS(特别是ARM架构)

答案 1 :(得分:2)

如果以及如何将汇编语言插入到C中,则特定于编译器,因此首先要丢失任何可移植性。其次,汇编语言是由汇编程序定义的,解析它的程序,x86对于相同的机器代码有几种到几十种汇编语言。并且没有任何这样的概念,因此在汇编语言中没有任何共同点。即使你使用内联汇编,链接与它有什么关系,如果你想链接然后创建一个对象,而不是内联。对于x86,最受欢迎的可能是已经回答过nasm,masm和gnu汇编程序,只需查看stackoverflow标记,我认为命中就是按顺序排列。

最后,您无法使用内联汇编语言更改C语言,这不是如何工作的。