Gov*_*mar 5 x86 opcode instructions
如果你看看像操作文件cmp,test,add,sub,和and,你会发现,这涉及寄存器操作EAX,并作为第一个操作数的16位和8位的变体有明显的操作码是从这些指令"一般情况下"版本不同.
这个单独的操作码是否只是一种节省代码空间的方法,它是否比一般情况下的操作码更有效,或者它只是过去的一些遗物因兼容性原因而不值得甩掉?
这主要是过去的遗物,但也不完全是"过时的".
在早期(即在Intel 8088上),x86寄存器组实际上更加专业化,就像其他现代CISC处理器一样.(8088的设计本身直接来自Intel 8080和Zilog Z80处理器.)也就是说,8个寄存器并非像今天(功能上)那样具有通用性.有许多指令仅适用于硬编码寄存器.这意味着程序员经常发现自己在寄存器之间来回移动值,以便为下一条指令正确设置.
EAX是一个特别特别的注册.好吧,实际上,在那些日子里,它被称为AX,因为它只有16位而且还没有E xtended到32位.AX是A ccumulator,并且被许多不同的指令用作硬编码目的地.一个累加器是其中中间结果被存储-它"积聚"逻辑和算术运算的结果的寄存器.几乎所有早期的微处理器都有一个累加器寄存器,其中许多都强迫您以这种方式使用累加器.在许多情况下,x86架构更加灵活,但仍然受到该设计的启发.有关在x86寄存器组背后的逻辑的详细写了是在这里.
这些特殊变体的通用指令是该设计的结果.它们很短(只有1个字节),速度很快(主要是因为指令尺寸很小,但也可能在早期也有硅级别的优化)与累加器寄存器中的值进行交互的方式.
所以,是的,它正是一种节省代码空间的方法,是的,它仍然比一般情况编码更有效,因为编码指令需要更少的字节.今天的小代码大小并不像8088那样重要,当然,考虑到我们的指令缓存和更快的内存读取速度,它仍然有所不同.任何优秀的x86汇编程序员都知道尽可能使用这些基于累加器的短指令,许多编译器也会这样做.在内部循环中尤为重要,因为保持代码大小是确保一切都保留在缓存中的关键.注册用法甚至代码流经常被仔细地重新评估和重新安排,以尽可能多地保留累加器中的东西 - 即使在今天 - 精确地使得可以使用这些短而有效的操作码.
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |