【问题标题】:Change array element in inline assembly更改内联汇编中的数组元素
【发布时间】:2017-08-30 22:39:12
【问题描述】:

我需要更改这段代码中的两个数组元素。就像我会在 C 中做 str[0] = astr[1] = b 一样。它是 C 代码中的内联汇编程序,Linux。

char str[] = "9999\n"; 
int a = 1;
inb b = 1;
asm volatile (
    //replace 1st element of str with a here
    //replace 2st element of str with b here
    : "=r" (str)
    : "r" (a), "r" (b), "r" (str)
    : );

【问题讨论】:

  • a 与 str 的元素不同。你想发生什么?将(char)1 放入字符串中还是将'1' 放入字符串中?
  • 另外,您的实际问题是什么?你还没有问过问题。
  • 我已经编辑了问题。
  • 如果有人把那个模板给了你,我会很好奇他们为什么遗漏了一些重要的东西,比如memory clobber(在这种情况下是必要的)
  • 不,我编写了那个代码。我是组装新手。所以我必须将“内存”添加到clober列表中?

标签: c assembly inline


【解决方案1】:

我知道你想做str[0] = a; std[1] = b;

你可以的

__asm__ ("movb %0, (%1)\n\tmovb %2, 1(%1)" : : "r" ((char)a), "r" (str), "r" ((char)b) : "m"(*str));

这当然是 AT&T 风格的程序集。

【讨论】:

  • 他想要“像我在 C 中做 str[0] = a 和 str[1] = b”,而不是“str[b]=a;”
  • @Tommylee2k,我完全误读了这个问题。会解决这个问题。
  • 如果你打算这样做,你将需要memory clobber,因为你在内存中创建了模板不知道的副作用。从编译器的角度来看,它可以假设str 的内容从未改变,并假设之前在其中的内容在之后仍然存在。如果此代码经过优化并且是更大程序的一部分,这可能会导致细微的错误。
  • 不,不是。这个微不足道的问题是人们不应该使用内联汇编的一个很好的理由。事情是这样的东西似乎在一个简单的情况下工作,在一个小程序中没有优化。但随着优化和更大程序的一部分,这可能会导致一些有趣且难以跟踪的错误。
  • @MichaelPetch 你能建议正确的方法吗?否则,我将删除答案。
【解决方案2】:

所以我尝试了

        char str[] = "9999\n"; 
        char a = '1';
        asm volatile (
           "movb %0,%1;"
           :
           : "r" (a), "m" (str[0])
           : );

它工作得很好,但我需要在这个程序中使用 a 作为整数。那么我可以在程序集中转换类型(从 int 到 char)吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多