在 IA32 Linux 汇编中将一个变量递增
Incrementing one to a variable in IA32 Linux Assembly
我试图在 Linux
的 IA32 程序集中将 1 递增到一个变量
section .data
num: dd 0x1
section .text
global _start
_start:
add dword [num], 1
mov edx, 1
mov ecx, [num]
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
不确定是否可行。
在另一篇文献中看到如下代码:
mov eax, num
inc eax
mov num, eax
是否可以在不移动到寄存器的情况下将值递增到 var?
如果是这样,将值移至寄存器是否有任何优势?
Is it possible to increment a value to a var without moving to a register?
当然:inc dword [num]
.
与几乎所有 x86 指令一样,inc 可以采用寄存器或内存操作数。请参阅 http://felixcloutier.com/x86/inc; 处的指令说明,形式 inc r/m32
表示您可以给出一个操作数,该操作数可以是 32 位 register 或 32 位 m内存操作数(有效地址).
如果您对微优化感兴趣,事实证明 add dword [num], 1
在某些 CPU 上可能仍然更快,尽管多了一个字节。具体细节相当复杂,您可以在 找到非常广泛的讨论。这部分与两者在效果上的细微差别有关,即add
会根据是否发生进位来设置或清除进位标志,而inc
始终保持进位标志不变。
If so, do I have any advantage moving the value to a register?
没有。这会使您的代码更大并且可能更慢。
我试图在 Linux
的 IA32 程序集中将 1 递增到一个变量section .data
num: dd 0x1
section .text
global _start
_start:
add dword [num], 1
mov edx, 1
mov ecx, [num]
mov ebx,1
mov eax,4
int 0x80
mov eax,1
int 0x80
不确定是否可行。
在另一篇文献中看到如下代码:
mov eax, num
inc eax
mov num, eax
是否可以在不移动到寄存器的情况下将值递增到 var?
如果是这样,将值移至寄存器是否有任何优势?
Is it possible to increment a value to a var without moving to a register?
当然:inc dword [num]
.
与几乎所有 x86 指令一样,inc 可以采用寄存器或内存操作数。请参阅 http://felixcloutier.com/x86/inc; 处的指令说明,形式 inc r/m32
表示您可以给出一个操作数,该操作数可以是 32 位 register 或 32 位 m内存操作数(有效地址).
如果您对微优化感兴趣,事实证明 add dword [num], 1
在某些 CPU 上可能仍然更快,尽管多了一个字节。具体细节相当复杂,您可以在 add
会根据是否发生进位来设置或清除进位标志,而inc
始终保持进位标志不变。
If so, do I have any advantage moving the value to a register?
没有。这会使您的代码更大并且可能更慢。