End*_*ers 1 assembly gcc inline-assembly
非常自我解释的代码.为什么不起作用!
#include <stdio.h>
int main() {
__asm__("number dw 0"); // declare number?
printf("%d",number);
__asm__("mov %eax,number"
"inc %eax"
"mov number,%eax");
printf("%d",number);
return 0;
}
cc ex1.c -o ex1
ex1.c: In function ‘main’:
ex1.c:22:17: error: ‘number’ undeclared (first use in this function)
ex1.c:22:17: note: each undeclared identifier is reported only once for each function it appears in
make: *** [ex1] Error 1
Run Code Online (Sandbox Code Playgroud)
谢谢.
我有很多知识空白要填补... gcc手册让我对内联汇编问题感到困惑,谷歌搜索教程结果......
在intel i7处理器上工作
使用此语法,您可以访问C内联程序集中声明的变量
#include <stdio.h>
int main() {
int number = 0;
printf("%d\n",number);
asm(
"mov %[number],%%eax\n"
"inc %%eax\n"
"mov %%eax,%[number]\n"
: [number] "=m" (number) : "m" (number) : "eax", "cc" );
printf("%d\n",number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您可以通过在输入上指定约束来让编译器为您加载number到eax寄存器中"a"
#include <stdio.h>
int main() {
int number = 0;
printf("%d\n",number);
asm(
"inc %%eax\n"
"mov %%eax,%[number]\n"
: [number] "=m" (number) : "a" (number) : "cc" );
printf("%d\n",number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
由于x86 inc指令可以直接在内存上运行,因此可以将其减少到此
#include <stdio.h>
int main() {
int number = 0;
printf("%d\n",number);
asm(
"incl %[number]\n" /* incl -> "long" (32-bits) */
: [number] "=m" (number) : "m" (number) : "cc" );
printf("%d\n",number);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅gcc文档: