Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 汇编语言是否有一个子集与平台无关?_C_Assembly_Inline Assembly - Fatal编程技术网

C 汇编语言是否有一个子集与平台无关?

C 汇编语言是否有一个子集与平台无关?,c,assembly,inline-assembly,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 我的问题是: 尽管汇编是全局依赖于平台的,但是否有一个子

我最近在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 somethingelse”)
    并假设MOV在这个假设的子集内,那么无论平台如何,代码都是正确的吗
  • 如果确实存在与平台无关的子集,有人可以链接它吗
  • 如果没有独立于平台的子集,最常见的汇编语法是什么
  • 1) 尽管程序集全局依赖于平台,但是否存在子集 所有的汇编程序都能理解的是什么?我是说,如果我要写 asm(“MOV somethingelse”),假设MOV在这里面 假设子集,不管是什么类型,代码都是正确的吗 站台

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

    这样想一想——一个独立于平台的子集必须组装成完全相同的比特集,每台计算机都必须解释相同的比特集(或者必须为同一汇编语言的所有不同体系结构编写汇编程序)。如果是这样的话,平台独立性将是一项相当琐碎的任务

    2) 如果确实存在与平台无关的子集,有人可以链接吗 是吗

    没有,所以没有

    3) 如果没有独立于平台的子集,哪些是最重要的 通用汇编语法


    MASM、NASM和GAS(特别是对于ARM架构)

    如果将汇编语言插入到C中以及如何插入到C中是非常特定于编译器的,那么首先也是最重要的是,您将失去在C中的任何可移植性。第二,汇编语言是由汇编程序定义的,汇编程序是解析汇编语言的程序。对于同一机器代码,x86有几种到几十种汇编语言。因此,汇编语言中没有任何通用的概念。即使在使用内联程序集时,链接与它有什么关系,如果要链接,则创建一个对象,而不是内联对象。对于x86来说,最流行的可能是nasm、masm和gnu汇编程序,只要看看stackoverflow标记,我想点击的顺序就是这样


    最后,你不能用内联汇编语言更改C语言,这不是它的工作原理。

    1)第3)个问题没有意义。PS:您的示例不起作用,因为如果asm不是控制流的一部分,它将永远不会被执行。“我想利用它来避免一些C语义规则”-这是不可能的!如果使用汇编,则没有C语义规则。在C语言中,你必须注意它们!你所尝试的看起来像是一个XY问题和一个非常老练的方法。注意:这不是恭维!这些片段根本没有任何意义。不能在块之外有语句,而asm是语句。现在你应该问真正的问题。在某种程度上,
    C
    是可移植的汇编语言。指针是用来修改变量内容的,就像你想做的那样。为什么不用C语言来做呢<代码>asm是非标准的btw1)所有程序集都没有通用关键字。甚至连
    MOV
    都没有。3) 我认为,今天ARM甚至比X86更为常见。在“独立于平台的子集必须组合到完全相同的位集,每台计算机必须解释相同的位集”中,我认为您混淆了指令集和助记符。您可以编写一组共享助记符的汇编程序,但按照惯例,许多处理器的汇编程序没有您引用的
    MOV
    指令。您没有!因此,“哪台计算机必须解释相同的”我想它可以更明确地说明两种体系结构的指令不能被解释为相同的。ARM不再是x86或mips的语法。GAS在那里更有意义。GAS支持比arm更多的目标,但也许我认为arm处理器比x86处理器多得多,gnu被大量使用,而gnu assembler for arm在这些处理器中所占比例很高,如果可以测量的话。有可能让您的自己的汇编程序,支持多个目标,并在目标之间创建至少几个通用语法指令,是的,绝对如此,而不仅仅是nop,它非常接近现在的通用语法指令。我曾考虑过
    asm
    :即使荒谬地说,我本可以编写一个独立于平台的汇编代码,该代码应该在什么时候执行?就像你和其他人所说的,这不是它的工作原理。再次感谢您的澄清。内联汇编对于C编译器的工作方式来说是特定的,通常这些指令会插入到您放置它们的位置,但是有一些规则,您可以使用这些规则,并且会占用编译器正在使用的资源,因此除了使用汇编语言外,您还必须告诉编译器,我正在使用寄存器r5和r3,并且希望变量xyz来自C,所以请帮助我。除了特定的编译器内联汇编语言之外,还有一些特定于编译器的东西。