C 汇编语言是否有一个子集与平台无关?
我最近在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 我的问题是: 尽管汇编是全局依赖于平台的,但是否有一个子
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在这个假设的子集内,那么无论平台如何,代码都是正确的吗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,所以请帮助我。除了特定的编译器内联汇编语言之外,还有一些特定于编译器的东西。