【问题标题】:How to access C variable for inline assembly manipulation?如何访问 C 变量以进行内联汇编操作?
【发布时间】:2013-01-15 02:12:48
【问题描述】:

鉴于此代码:

#include <stdio.h>

int main(int argc, char **argv)
{
    int x = 1;
    printf("Hello x = %d\n", x);
}

我想访问和操作内联汇编中的变量 x。理想情况下,我想使用内联汇编来改变它的值。 GNU 汇编器,并使用 AT&T 语法。

【问题讨论】:

  • 内联汇编的哪个变体? GCC 风格是唯一的好方法,但如果您正在寻找 MSVC,那么回答将是浪费时间..
  • 哪个编译器?哪个处理器?您尝试了哪些方法,但没有成功?

标签: c gcc assembly inline-assembly


【解决方案1】:

在 GNU C 内联汇编中,使用 x86 AT&T 语法:
(但https://gcc.gnu.org/wiki/DontUseInlineAsm 如果可以避免的话)。

// this example doesn't really need volatile: the result is the same every time
asm volatile("movl $0, %[some]"
    : [some] "=r" (x)
);

在这之后,x 包含 0。

请注意,您通常应避免将mov 作为 asm 语句的第一条或最后一条指令。不要从%[some] 复制到像%%eax 这样的硬编码寄存器,只需使用%[some] 作为寄存器,让编译器进行寄存器分配。

有关更多文档和指南,请参阅 https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html 和 https://stackoverflow.com/tags/inline-assembly/info。


并非所有编译器都支持 GNU 语法。 例如,对于 MSVC,您可以这样做:

__asm mov x, 0 和 x 在此语句之后将具有 0 的值。

请指定您要使用的编译器。

另请注意,这样做会限制您的程序仅使用特定的编译器-汇编器组合进行编译,并且仅针对特定架构。

在大多数情况下,使用纯 C 和内在函数(而不是内联 asm)可以获得同样好的或更好的结果。

【讨论】:

  • GNU 汇编器,使用 AT&T 语法
  • 期待您的帮助。假设我想给 X 赋值 10,我该怎么做?
  • @user1888502 你需要先学习 x86 汇编才能做到这一点。虽然movl $10 ... 会在这里做
  • @user1888502 在我的回答中,将 0 替换为 10 即可:-)
  • %[some] 的敌人是什么意思?
【解决方案2】:

asm("mov $0, %1":"=r" (x):"r" (x):"cc");
-- 这可能会让你走上正轨。尽可能指定寄存器的使用以提高性能和效率。然而,正如 Aniket 指出的那样,高度依赖架构并且需要 gcc。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多