其实memory这个破坏描述符也不是那么好用,就是中内存改动了,也不会发生变化,具体原因不是太清楚,先把例子先贴出来
#include <stdio.h>
int main()
{
int s[10]={1, 2, 3,4 ,5,6,7,8,9,0};
int p;
asm("movl $12, 20(%%esp)\n\t"
:
:"a"(s[0])
:"memory"
);
p = s[0];
printf("[%d]\n", p);
return 0;
}
这里文件 1.c 编译命令: gcc -o 11 -O 1.c ./11 之后的值为1,我很费解
最后找到了解决方案!
你试试将“asm("movl $12, 20(%%esp)\n\t" //这句话我是先把 .c文件编译.s 然后看的s[0]的位置 : : :"memory" );” 改为: asm ("movl $12, (%0)"::"r"(s):"memory"); 在试试将红色部分去掉 猜测:你的这句“movl $12, 20(%%esp)”编译器压根儿就不知道是在干啥,所以直接优化掉了。 |
但是又的情况'"memory"就派上用场了
#include <stdio.h>
int main()
{
int s[10]={1,2,3,4,5,6,7,8,9,0};
int a;
asm("cld\n\t"
"rep\n\t"
"stosb\n\t"
:
: "a"(0), "D"(s), "c"(10)
: "memory");
a = s[0];
printf("[%d]\n", a);
return 0;
}
这里不加memory a的值为1,加了就为0,说明memory是起到作用的