作者回复: 其实对于日常开发来说,不了解汇编并不会有太大的影响,因为这也是 C 语言被创造出来的目的之一。但计算机知识其实是成体系的,如果你想要“知其然,并知其所以然”,那了解汇编是一个必要的过程。
作者回复: 没错!关于 cmove 指令的更多细节我们会在第 18 讲再深入讨论。
作者回复: 可以尝试用 `objdump -M intel -d ./foo` 这个命令哈。
作者回复: 可以参考这里哈:https://godbolt.org/
作者回复: 没错哈!
作者回复: 想想 `bool` 这个关键字?
作者回复: 是用的同一段 C 代码吗?具体使用的编译器和环境是怎样的呢?如果方便的话,也可以完整地回复一下汇编代码哈。
作者回复: 实际上就同汇编代码展示的那样,rbp-20 与 rbp-24 位置上分别存放着变量 x 与 y 的值。而对应的两行 cmp 指令执行时,会分别将这两个值与数值 0 进行比较,当其中任意一个变量的值与 0 相等时,则程序紧接着会执行标签 .L2 处的指令。
作者回复: 感谢指正!
作者回复: 因为我们不能直接假定 sil 的高位字节都是 0,所以需要用零扩展来“扩大”值的宽度。而之所以要用 esi 寄存器而不是 sil 的一个可能原因是:通常来说,机器指令在以“自然大小”为长度的寄存器(这里就是 esi)上进行相应的数据操作,效率是最高的。因此,即使少执行一条指令,也并不见得开销就一定最小。当然,这里也只是猜测,实际上只是编译器的一种实现上的选择。