increment 和 add in assembly 的区别
Difference between increment and add in assembly
下面两组指令在汇编中有什么区别吗?我什么时候应该使用第一种情况,什么时候应该使用第二种情况?
案例 1:
INC SI
INC SI
案例 2:
ADD SI, 02
第一个 (inc) 不需要明确的增加量(总是 1),因此编码效率更高。
在某些(非常旧的)处理器上,这可能意味着可以更有效地安排它。但由于两者都是相对简单的操作,因此在没有特制代码的情况下,现代 x86 CPU 上的差异不会很明显。
第二个可能需要额外的存储空间,并且可能需要额外的时间才能将其从存储空间中取出。一些机器指令有 space 用于指令中包含的小常量值。如果是这样,那么第一对指令可能比第二种情况的单个指令花费更多时间。
所以这取决于汇编语言所针对的机器。
inc
保留进位标志不变,这偶尔有用(例如长加法)。但它有时也会产生有趣的效果。在某些处理器(Core2 和 Nehalem)上,读取 any 部分标志后 "partially updated" 会导致最多 7 个周期的停顿。在 inc
之后同时使用进位和其他一些标志(但这通常没有意义)对几乎所有处理器都有惩罚,即使是那些巧妙地 "split" 标志在几个部分的处理器。在 P4 上,inc
受到惩罚(而不是读取其标志的指令),其形式为对先前标志的错误依赖,因此这几乎是不可避免的,除非不使用 inc
。
由于这些是 16 位指令,它们可能会导致更多问题(部分寄存器写入、长度更改前缀取决于模式)
下面两组指令在汇编中有什么区别吗?我什么时候应该使用第一种情况,什么时候应该使用第二种情况?
案例 1:
INC SI
INC SI
案例 2:
ADD SI, 02
第一个 (inc) 不需要明确的增加量(总是 1),因此编码效率更高。
在某些(非常旧的)处理器上,这可能意味着可以更有效地安排它。但由于两者都是相对简单的操作,因此在没有特制代码的情况下,现代 x86 CPU 上的差异不会很明显。
第二个可能需要额外的存储空间,并且可能需要额外的时间才能将其从存储空间中取出。一些机器指令有 space 用于指令中包含的小常量值。如果是这样,那么第一对指令可能比第二种情况的单个指令花费更多时间。
所以这取决于汇编语言所针对的机器。
inc
保留进位标志不变,这偶尔有用(例如长加法)。但它有时也会产生有趣的效果。在某些处理器(Core2 和 Nehalem)上,读取 any 部分标志后 "partially updated" 会导致最多 7 个周期的停顿。在 inc
之后同时使用进位和其他一些标志(但这通常没有意义)对几乎所有处理器都有惩罚,即使是那些巧妙地 "split" 标志在几个部分的处理器。在 P4 上,inc
受到惩罚(而不是读取其标志的指令),其形式为对先前标志的错误依赖,因此这几乎是不可避免的,除非不使用 inc
。
由于这些是 16 位指令,它们可能会导致更多问题(部分寄存器写入、长度更改前缀取决于模式)