0%

一、糟糕的名字

函数被调用的过程中会使用寄存器,这就可能给函数的调用者造成困扰,原本在调用前的寄存器可能会被调用的函数污染。如果希望寄存器不被污染,可以将寄存器保存在栈上,在调用结束后再将栈上的值重新拷贝回对应的寄存器。

我们将寄存器分为两组,其中一组由调用者保存,被称为 caller-saved ,这是说调用者可以按照自己的需要来保存这些寄存器,如果自己使用了,那么就保存,如果没有使用,就不需要保存。另一组由被调用者保存,被称为 callee-saved ,被调用者在执行正式的功能前前需要将这些寄存器压栈,在返回前需要将这些寄存器弹栈。

不过这种标准的定义其实并不容易让人理解其中的原因。我们可以换一个角度去看这件事。当一个函数调用发生时,只有 caller-saved 的寄存器有可能被污染(在 caller 并不保存的情况下),这是因为所有的 callee-saved 寄存器都会本着“谁污染,谁治理”的策略被保护起来。所以 caller-saved register 其实核心特性是 unsafe ,也就是“调用前后并能保证寄存器中的值不发生变化”,所以这种寄存器也被称为临时寄存器。而 callee-saved register 则正好相反,是 safe 的,调用者不用担心调用一个函数后,自己的寄存器值被改写。

所以我建议使用更好的名字:

Read more »

一、主板

虽然在《计算机组成》这么课上,我大部分时间都在和 CPU 搏斗,但是并不是说 CPU 就是硬件世界的唯一或者说 Boss,主板上的其他元器件并不是 nobody。非常遗憾我最近才意识到这点。

一块结构较为完整的主板长成这个样子,可以看到处理 CPU 外,其实上面会有很多个其他的元器件

undefined

导致结构不完整的一个原因是在 Soc 技术在手机主板上的应用,具有多种功能的元器件,比如说 CPU,内存,各种控制器都会被放到一个芯片里,这样信号不再需要像以前那样通过很多外部的金属线,而是都在芯片里传输,让传输的距离变短。如图所示:

Read more »

一、基础

在 Armv8 的 A32 架构或者 Armv7 及以前的指令集中,每条指令都可以“条件执行”,也就是根据 CPSR 的条件码来确定这条指令是否真的具有执行效果。

比如说如下指令,只有在 CPSR 中 Z 位为 1 的时候,addz 这条指令才有实际效果,这依赖于前一条指令 cmp 对 CPSR 的修改(ARM 同样可以指定是否修改 CPSR,这是通过在指令位中的 S 确定的)。

cmp r4, r5
addz r1, r2, r3

MIPS 或者 RISCV 都有条件指令,不过这些条件指令一般是条件指令,这样可以实现编程思想中的分支结构。Arm 的特殊之处在于每条 32 位指令的高 4 位都是条件码,这就会导致每条指令都是条件指令。

Read more »

一、字体介绍

1.1 演变历史

  • 最早的字体是“帝国大写体”(Imperial Capitals),也被称为“罗马大写体”,古罗马时期字体,用于在石碑上记录重大事件。
  • 然后是“卡洛林小写体”(Carolingian Minuscule),这种字体在中世纪早期出现,这种字体字间距大,结构清晰简单,但是已经具有了一定的宗教色彩。
  • 中世纪后期西欧出现了“哥特体”(Gothic),是卡洛林小写体的演化体,这种字体更加复杂和华丽,字间距小,笔画厚重而末端尖锐,具有强烈的宗教色彩。
  • “人文主义体”是“文艺复兴之父”彼特拉克提倡发明的字体,受启发于卡洛林小写体字间距大,方便阅读的特点,是文艺复兴早期的字体,风格比较圆润轻松,字轴比较倾斜。
  • “意大利斜体”受启发于“人文主义体”,这种字体更加自由畅快,同时由于斜体的特点,可以兼顾辨认和节省空间的特点,是当时印刷业的新宠。
  • “印刷罗马体”是活字印刷术发明后在意大利发明的,这种字体受启发于“人文主义体”和“帝国大写体”,这种字体字轴中正,笔画圆润,书写痕迹浅,成为了“人文主义体”的淘汰者。

image-20240211214139291

1.2 具体介绍

Read more »

虽然这幅画还没有画出主角十分之一的神态,但是不得不承认,这已经是我能力的极限了。

  • 结构永远是重中之重,也就是人没有办法画出超过自己意识的画面
  • 光真的好迷人啊
  • 不要怕修改哪怕重构
  • 要保持昂扬的状态坚持住
  • 完成的原因是因为她本来就在那里
  • 奉献出最为非普世化的东西,才是真正的“闲心思”

一、起始概念

1.1 排版

应当明确,排版问题并不会因为 LaTex “内容和格式分离”的设计宗旨而消失,实际上,LaTex 就是在解决“排版问题”,它就是一个排版工具,只不过在解决思路上采用了“内容和格式分离”的思想,让用户尽可能不被繁琐的排版细节所困扰。

而当我们抛开 LaTex 的拐杖去直面排版问题时,会发现它比我们想象得都要复杂、繁琐和无聊。

比如说常见的“断字与断行”问题,在不考虑断字的情况下,一个占据近一行宽度的字很容易造成这之前的一行较为稀疏,比如下面的这种情况,左侧为较为失败的断行算法,而右侧为较为成功的:

Read more »