- 论坛徽章:
- 2
|
如果把"赋值"操作限定在指令集上,则所有处理器的指令集操作都是原子的,该原子性由硬件提供。
否则,语言层面的"赋值"操作很难说是否是原子的。
比如说一个例子,a, b都放在存储区里:
- int a = 10;
- int b = 1;
- int
- main()
- {
- b = a; //赋值
- return 0;
- }
复制代码
那么在X86上的汇编(没有优化)是[gcc 3.3.3]
- movl a, %eax
- movl %eax, b
复制代码
显然,虽然两条movl是原子的,但是b = a;这样的赋值操作不是。
而同样的赋值语句b = a;在load-store型的arm上,结果是[gcc3.3.6 arm-cross]
- ldr r3, .L2 #取a的地址,放在r3
- ldr r2, [r3, #0] #[]操作取r3地址里的值,放在r2
- ldr r3, .L2+4 #取b的地址,放在r3
- str r2, [r3, #0] #赋值
- ...
- L2:
- .word a
- .word b
复制代码
这就更明显。由于a,b都是存储区变量,赋值b = a;被翻译成4条指令集语句。
[ 本帖最后由 gvim 于 2006-8-10 00:28 编辑 ] |
|