通过内联汇编操作c变量[重复]
Posted
技术标签:
【中文标题】通过内联汇编操作c变量[重复]【英文标题】:manipulating c variable via inline assembly [duplicate] 【发布时间】:2013-01-31 15:07:32 【问题描述】:可能重复:How to access c variable for inline assembly manipulation
鉴于此代码:
#include <stdio.h>
int main(int argc, char **argv)
int x = 1;
printf("Hello x = %d\n", x);
我想访问和操作内联汇编中的变量 x。理想情况下,我想使用内联汇编来改变它的值。 GNU 汇编器,并使用 AT&T 语法。假设我想在 printf 语句之后将 x 的值更改为 11,我该怎么做?
【问题讨论】:
见***.com/tags/inline-assembly/info,以及其他相关问答:Why can't local variable be used in GNU C basic inline asm statements? / Code blocks Ver.16.01 crashing during run cycle of programme 【参考方案1】:asm()
函数遵循以下顺序:
asm ( "assembly code"
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
并通过您的 c 代码将 11 放到 x 中:
int main()
int x = 1;
asm ("movl %1, %%eax;"
"movl %%eax, %0;"
:"=r"(x) /* x is output operand and it's related to %0 */
:"r"(11) /* 11 is input operand and it's related to %1 */
:"%eax"); /* %eax is clobbered register */
printf("Hello x = %d\n", x);
您可以通过避免破坏寄存器来简化上述 asm 代码
asm ("movl %1, %0;"
:"=r"(x) /* related to %0*/
:"r"(11) /* related to %1*/
:);
您可以通过避免输入操作数并使用 asm 中的局部常量值而不是 c 中的值来简化更多:
asm ("movl $11, %0;" /* $11 is the value 11 to assign to %0 (related to x)*/
:"=r"(x) /* %0 is related x */
:
:);
另一个例子:compare 2 numbers with assembly
【讨论】:
另请参阅***.com/tags/inline-assembly/info 以获取指南,官方文档比发布此答案时更好:gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html。 (以及手册中有关通用和特定于机器的约束的相邻页面。)另请参阅gcc.gnu.org/wiki/DontUseInlineAsm - 当您可以让编译器从 C 内在函数中生成您想要的 asm 时避免它:错误的可能性要小得多(比如破坏一个寄存器或内存位置而不告诉编译器)创建未定义的行为。以上是关于通过内联汇编操作c变量[重复]的主要内容,如果未能解决你的问题,请参考以下文章