CSAPP第三章关于条件传送的问题,谁能指教一下

cmovne src, dst所作的操作并不是先检查src的值是不是非0,而是检查标志寄存器的zero标志位。换句话说在cmovne是根据在它之前的cmp/test/add/sub等等会修改标志寄存器的指令的结果来判断是不是“NE”,而不是根据src来判断。另外,无论zero标志位判断结果如何,cmovne都要执行取源操作数这一阶段的动作,只是根据标志位决定是否要写到目的地址/寄存器的操作,所以如何,对(%edx)这一间接引用的读取还是会发生。退一步讲,我们抛开标志寄存器,假设cmovne就是按src的值来判断,你也还是混淆了(%edx)和%edx的区别——要检查是不是非零的值是(%edx)而不是%edx,这一读取还是会发生。
■网友
就拿CSAPP中文第二版P141页的一句话来解释吧:
“与条件跳转不同,处理器可以执行条件传送,而无需预测测试的结果。处理器只是读源值(可能是从存储器中),检查条件码,然后要么更新目的寄存器,要么保持不变。”

■网友
这个问题学完了csapp第四章《处理器体系结构》就可以理解了。
对于"cmovne (%edx),%eax"这条机器指令,它被分成了六个顺序执行的部分:取值,译码,执行,访存,写回,更新PC。题主问得问题涉及到的是访存和写回阶段的内容。
"cmovne (%edx),%eax"在访存阶段会根据%edx的地址值访问内存,得到目标地址的数据val;在接下来的写回阶段,会判断条件码寄存器中的条件是否满足条件传送的条件,如果满足,就将val写入到%eax中。然而问题是,假如%edx的地址是非法的(比如本例中是空地址),即使传送条件不满足也会先进行访存,因为判断条件是否满足这一过程,是在访存后的写回阶段再进行的,故在本例中会导致一个引用空指针错误。
【CSAPP第三章关于条件传送的问题,谁能指教一下】 简单理解为一句话,条件传送指令是先取值(访问内存),再看条件是否满足,故可能会引起内存错误。


    推荐阅读