作者回复: 这是一个好问题,可以 watch 一下我在 01 讲的提到的 GitHub 仓库哈,我会尽快把相关资料更新在里面的。
作者回复: 这是一个很棒的问题! 如果使用 mov 指令,也是可以完成同样的功能的,只不过需要独立的两条指令,比如: - dec rax; - mov edx, rax 但使用 lea 指令,我们就可以仅通过一条机器指令来实现。相对于前者,其执行效率是不是更高呢?实际上,对于编译器来说,很多基本的四则运算都可以直接使用 lea 指令来实现,比如 lea eax, [123 + 4*ebx + esi],就是直接将 ebx 中的值乘以 4 再加上 123 和 esi 中的值。相较于使用 mov 的多条指令,lea 可以充分利用它在硬件中的电路特性,以更高的效率进行计算。
作者回复: 没错!这是一种常见的场景。举个例子: #include <stdio.h> int main() { char c; while ((c = getchar()) == ' '); printf("%c", c); }
作者回复: 没错的,你的理解是正确的。
作者回复: 达夫设备是 switch 语句和循环展开的巧妙结合,我们会在 19 讲再来深入介绍哈!
作者回复: 不跳转就会继续顺序执行,也是会执行到 .L6 位置的代码的。
作者回复: 如果这里提到的“挂起”是指阻塞当前线程的话,可以使用 poll \ select \ semaphore 等方式哈。死循环并不是一个好的方式。
作者回复: 没错的,我们在第 05 讲有介绍这些内容哈。
作者回复: 可以直接在上方的 “Compiler options” 输入框里输入对应优化等级的参数,比如:-O2 \ -O3。
作者回复: 这里实际上是跟蓝框内的第一条汇编语句做的对比。第一条的 mov 指令仅把值 1 当做 32 位值放入到 edx 中;而后续程序在使用这个值生成“token”时,实际上是直接用 rdx 来访问的,因此实际上是在进行左移时同时被“扩展”为了 64 位值。同样的,后面进行按位与时,也是直接以 64 位值进行的。