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第三章关于条件传送的问题,谁能指教一下】 简单理解为一句话,条件传送指令是先取值(访问内存),再看条件是否满足,故可能会引起内存错误。
推荐阅读
- 过节■江苏省委省政府办公厅下发关于做好2021年元旦春节期间有关工作的通知
- |徐州市出台《关于优化创新创业生态系统 提升区域科技创新活力的实施意见》及实施细则
- 雨下|全球关于禁售燃油车只是理论上可行吗
- 关于用phpfsocket 写Post, 模拟http 报文怎样写入要传输的处理数据
- 智叔|很多家长还在整箱买:谈谈关于牛奶的17个真相警惕这些列入黑名单的“假牛奶”
- 关于微信小程序的思考:运营者该何去何从
- 关于人工智能虚拟人的一些问题
- 知乎上关于人生经验的介绍是否可能对青少年造成潜在危害
- 写下我关于做数据分析专员的困惑和各位的建议是
- 非物质文化遗产|市北文体中心一场关于“非遗”的盛会…
