【你问我答】汇编下call和ret指令是否有内存屏障的作用?

问题描述:

汇编下call和ret指令是否有内存屏障的作用?

回答有奖:

选取一位认真回答问题的牛友,赠送200牛币!
▶回答尽量有自己的思考,不要单纯的只是复制粘贴定理定义,或者他人blog哦~

你问我答问题汇总:点击进入
关注你问我答栏目:点击关注

你问我答 - 答问题,成大佬,拿牛币!
你问我答是牛客新栏目,每周1期几个问题,
牛友在问题贴下留下自己的知识,经验与见解,
帮助更多牛友了解更多技术相关知识!
#悬赏##C/C++#
全部评论
没有 call指令是计算机转移到调用的子程序。 ret指令是子程序的返回指令执行本指令时: call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址。ret指令用栈中的数据,修改偏移地址,从而实现近转移。call可以通过位移和目的地址进行转移。 call和ret应该是没有的,也不应该强制这两个指令去同步CPU的***,毕竟内存屏障还是要付出代价的,且内存屏障的应用场景也比较少。 你可以告诉编译器在某处提供一个编译屏障,但你不能指望你不告诉他的时候他能提供这个保证,并且编译屏障和内存屏障也是两码事,有时候你需要同时提供这两个屏障才足够安全 但存取单个内存对齐的64位数在x64下是原子操作,我就亲眼看到我之前项目组用的ringbuffer没有加任何屏障都工作的好好的。。虽然要我自己实现我肯定会加的,安全起见。但你要是同时存取多个变量,并对修改顺序有依赖的话,那一定要加内存屏障,因为不加无法保证这多个变量按顺序是可见的。 综上,这两个指令明显没有内存屏障的作用
5 回复
分享
发布于 2019-11-13 18:01
call和ret指令没有 内存屏障用mfence,lock
1 回复
分享
发布于 2019-11-12 16:12
阅文集团
校招火热招聘中
官网直投
首先什么是内存屏障: 内存屏障,也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,是CPU或编译器在对内存随机访问的操作中的一个同步点,使得此点之前的所有读写操作都执行后才可以开始执行此点之后的操作。大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。 有些操作可以隐含memory barrier的功能,主要有两种类型的操作:一是加锁操作,另外一个是释放锁的操作。 call指令分为两步: (1) 将当前的IP或者CS和IP压入栈中。 (2) 转移。 ret指令:用栈中的数据,修改IP的内容,实现近转移。 这两个指令明显没有内存屏障的作用
点赞 回复
分享
发布于 2019-11-13 16:37

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务