【发布时间】:2013-08-05 08:23:26
【问题描述】:
警告 1:我对现实生活中的实用 CPU 设计一无所知。
警告 2: 我不知道“CPU 指令”、“CPU 操作”和“CPU 功能”等术语之间的区别。也许有一个,也许没有,但我把它们当作同义词一样使用。如果我错了,请纠正我。
背景:假设您有一个带有两个寄存器的 4 位 CPU。现在您需要加载一个常量值到寄存器 1!可能有几种方法可以做到这一点:
- 类似 0SXX 的指令,其中 0 表示它是“将寄存器设置为 X”类型的指令,而 S 表示应该将 XX 加载到寄存器 1 的哪一侧。
- 优点:寄存器 1 易于操作。仅使用两个字节的程序存储器即可设置一个常数值。
- 缺点:消耗一半可能的 CPU 指令。对于我的 4 位小设备来说,这是一个悲剧,但对于 >=8 位计算机来说,这可能不是什么大问题。
- 纯算术/按位系列 CPU 函数(如 AND、OR、NOT、XOR、RoR、RoL、INC 等...)
- 优点:无需额外的 CPU 实现。
- 缺点:需要更多指令,常量加载速度较慢,当然,在汇编中加载常量之前需要考虑更多。
- 介于两者之间吗?比如清空寄存器,加载??XX,然后逻辑运算?
- 还有什么我没想到的?
一般情况:
- 有没有一种方法可以让所有普通的现代 CPU 将寄存器设置为常数值?
- 如果不是,最常用的方法是什么?
- 旧的 4/8 位计算机是否有不同的方法来做到这一点?
我认为任何接触过汇编的人都会知道答案。非常感谢您的帮助!提前致谢。
【问题讨论】:
-
清除寄存器很容易:
xor它本身的编码通常比立即移动到寄存器指令更短,后者将寄存器设置为指令中包含的值。乱序执行 CPU 需要识别依赖链,以便它们可以并行执行所有独立的事情。他们总是将xor eax, eax识别为独立于先前的值,因此它以与mov eax, 0相同的方式破坏依赖链。
标签: assembly cpu cpu-registers cpu-architecture