C 更改内联程序集中的数组元素

C 更改内联程序集中的数组元素,c,assembly,inline,C,Assembly,Inline,我需要在这段代码中更改两个数组元素。就像我在C中做的str[0]=a和str[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

我需要在这段代码中更改两个数组元素。就像我在C中做的
str[0]=a
str[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)
    : );

我知道你想做
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风格的组件。

所以我试了一下

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

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

a与str的元素不同。您希望发生什么?
(char)1
被放入字符串或
'1'
被放入字符串?还有,你的实际问题是什么?你还没有问过问题。我已经编辑过问题。如果有人给你那个模板,我会好奇为什么他们遗漏了一些重要的东西,比如
内存
缓冲块(在这种情况下这是必要的)不,我做了那个代码。我不熟悉集会。所以我必须在clober列表中添加“memory”?他想要“就像我在C中做str[0]=a和str[1]=b一样”,而不是“str[b]=a;”@Tommylee2k,我完全误解了这个问题。将修复此问题。如果要这样做,则需要
内存
缓冲,因为您在内存中创建了模板不知道的副作用。从编译器的角度来看,它可以假设
str
的内容从未更改,并假设它之前包含的内容在之后仍然存在。如果这段代码经过优化并且是更大程序的一部分,这可能会导致一些微妙的错误。这个微不足道的问题是人们不应该使用内联汇编的一个很好的理由。问题是,像这样的东西在一个简单的情况下似乎可以工作,在一个小程序中没有优化。但是,通过优化和更大程序的一部分,这可能会导致一些有趣且难以跟踪的错误。@MichaelPetch您能建议正确的方法吗?否则我就删除答案。