C 更改内联程序集中的数组元素
我需要在这段代码中更改两个数组元素。就像我在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
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您能建议正确的方法吗?否则我就删除答案。