破坏描述符memory应用举例

    其实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是起到作用的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值