免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 0521
打印 上一主题 下一主题

a++, 是不是从理论上就不可能是一条汇编语句? [复制链接]

论坛徽章:
0
41 [报告]
发表于 2007-08-14 12:32 |只看该作者
看编译器怎么做了,在SMP上加锁做,或者设memory barrier。
单处理器上,如果a的值已经由于前面的运算放到寄存器里了,a++只需要inc。
这样是否中断都应该没影响

论坛徽章:
0
42 [报告]
发表于 2007-08-14 12:46 |只看该作者
原帖由 bluster 于 2007-8-14 12:27 发表

就是个比方,不能asm也可以加锁,反正另外处理呗。
BTW 486+的cpu有xadd指令不知道能不能满足要求


我的意思特指, 单条汇编, 做一个命令, 完成++a或者a++的语义.

刚才又说用xchg的...

假设if (a++ > 10) /*do sth*/ 怎么来一条对a++的语义完成呢??

我不熟悉汇编哈...

论坛徽章:
0
43 [报告]
发表于 2007-08-14 12:47 |只看该作者
incl %(eax)

论坛徽章:
0
44 [报告]
发表于 2007-08-14 12:51 |只看该作者
我猜一个

存储器是不会执行++功能的,CPU需要取到寄存器,然后++,然后存回去,只是这个过程需要不需要原子的进行,以及对程序员是不是透明的。

论坛徽章:
0
45 [报告]
发表于 2007-08-14 13:21 |只看该作者
原帖由 Edengundam 于 2007-8-14 12:46 发表


我的意思特指, 单条汇编, 做一个命令, 完成++a或者a++的语义.

刚才又说用xchg的...

假设if (a++ > 10) /*do sth*/ 怎么来一条对a++的语义完成呢??

我不熟悉汇编哈...

这是另一回事,有时候需要原子的做 a++有时候需要根据a的值做判断,两回事。

论坛徽章:
0
46 [报告]
发表于 2007-08-14 13:35 |只看该作者
[me@ ~/tmp]$ cat add.c
int a;

void inc()
{
        a++;
}

[me@ ~/tmp]$ cat add.s
        .file   "add.c"
        .text
.globl _inc
        .def    _inc;   .scl    2;      .type   32;     .endef
_inc:
        pushl   %ebp
        movl    %esp, %ebp
        incl    _a
        popl    %ebp
        ret
        .comm   _a, 16   # 4


=======================
限定平台: 386, winNT + cygwin
结论,对全局变量执行++操作,一定是一条指令。

论坛徽章:
0
47 [报告]
发表于 2007-08-14 13:47 |只看该作者
原帖由 nully 于 2007-8-14 13:35 发表
[me@ ~/tmp]$ cat add.c
int a;

void inc()
{
        a++;
}

[me@ ~/tmp]$ cat add.s
        .file   "add.c"
        .text
.globl _inc
        .def    _inc;   .scl    2;      .type   32 ...



编译器聪明, 所以知道使用a++语义只是执行了自增, 丢弃返回值吧???

我主观推测LZ是需要如下语义:

stack[a++]或stack[++a]

^^除了需要更新, 还要访问...

论坛徽章:
0
48 [报告]
发表于 2007-08-14 13:55 |只看该作者
讨论并没有说a++后值要用到上下文中
所以理所当然,a自加就是
incl _a

呵呵

论坛徽章:
0
49 [报告]
发表于 2007-08-14 14:04 |只看该作者
原帖由 nully 于 2007-8-14 13:55 发表
讨论并没有说a++后值要用到上下文中
所以理所当然,a自加就是
incl _a

呵呵


等于丢弃返回值了.

我再引申两个case:

1. 如果机器字长4字节,
sizeof(long) 为 8 (总之, 找到一个整数数据类型大于机器字长的)
此时,
long a;
a++;

应该不可以吧??


2. 如果允许非对齐情况, 对结构体中对象没有对齐...那么访问可能会产生多条汇编指令吧??

论坛徽章:
0
50 [报告]
发表于 2007-08-14 14:10 |只看该作者
原帖由 Edengundam 于 2007-8-14 14:04 发表


等于丢弃返回值了.

我再引申两个case:

1. 如果机器字长4字节,
sizeof(long) 为 8 (总之, 找到一个整数数据类型大于机器字长的)
此时,
long a;
a++;

应该不可以吧??


2. 如果允许非对齐 ...

嗯,那是

这属于前提说明不严格
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP