gpt4 book ai didi

gcc - C 中的内联汇编

转载 作者:行者123 更新时间:2023-12-02 17:47:25 25 4
gpt4 key购买 nike

非常 self 解释的代码。为什么它不起作用!

#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

谢谢。

我有很多知识空白需要填补...gcc 手册让我对内联汇编感到困惑,就像谷歌教程的结果一样...

在英特尔 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;
}

您可以通过在输入上指定"a" 约束,让编译器将number 加载到eax 寄存器中

#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;
}

而且由于 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;
}

有关更多信息,请参阅 gcc 文档:

6.41 Assembler Instructions with C Expression Operands

关于gcc - C 中的内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13041499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com