我最近遇到了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在这个假设的子集中,那么无论平台如何,代码都是正确的吗?答案 0 :(得分:7)
1)虽然程序集是全局平台依赖的,但是有一个子集 所有汇编程序都能理解它吗?我的意思是,如果我要写 asm(" MOV,somethingelse")并且假设MOV在这里面 假设的子集,代码是否正确无论如何 平台?
不。虽然所有版本的汇编语言都可能有像MOV这样的命令,但语法会有所不同,寄存器会有所不同,当汇编成机器语言时,表示该指令的实际二进制代码可能会有所不同。
以这种方式思考 - 一个独立于平台的子集必须汇编到完全相同的位集,每个计算机必须解释相同的位(或者必须为所有不同的体系结构编写汇编程序)相同的汇编语言)。如果是这种情况,平台独立性将是一项相当简单的任务。
2)如果确实存在该平台独立子集,则可以有人链接 它?
它没有,所以没有。
3)如果没有与平台无关的子集,则最多 常见的汇编语法?
MASM,NASM和GAS(特别是ARM架构)
答案 1 :(得分:2)
如果以及如何将汇编语言插入到C中,则特定于编译器,因此首先要丢失任何可移植性。其次,汇编语言是由汇编程序定义的,解析它的程序,x86对于相同的机器代码有几种到几十种汇编语言。并且没有任何这样的概念,因此在汇编语言中没有任何共同点。即使你使用内联汇编,链接与它有什么关系,如果你想链接然后创建一个对象,而不是内联。对于x86,最受欢迎的可能是已经回答过nasm,masm和gnu汇编程序,只需查看stackoverflow标记,我认为命中就是按顺序排列。
最后,您无法使用内联汇编语言更改C语言,这不是如何工作的。