|
地下
发表于 2017-7-11 23:36:26
|
只看该作者
浙江省绍兴市
交换变量不是瞬间完成的,它有好几个步骤,这是你代码里“ASM_交换_变量交地址”的汇编代码
mov eax, dword ptr [ebp+08h]
mov ecx, dword ptr [ebp+0Ch]
mov edx, dword ptr [eax]
xchg dword ptr [ecx], edx
mov dword ptr [eax], edx
在执行完xchg dword ptr [ecx], edx的时候,逻辑开关已经变成假了,然而最后一步赋值还没完成。
这时候死循环那边已经满足跳出条件了,跳出后返回上层调用,重新进行一大堆赋值。现在CPU继续执行mov dword ptr [eax], edx这条赋值指令就没啥意义了,要么赋的值是错的(指针数据已经被修改),要么崩溃(循环跳出后局部变量B堆栈可能已经销毁)
测试不出问题原因是两者指令数量相差太大了,一边只要执行mov dword ptr [eax], edx这一条指令,另一边要执行上百条指令,所以每次都没出事。
但Windows下CPU时钟的分配不是按指令多少来的....这个不多说了,比较复杂。 |
|