在 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?

没有。这会使您的代码更大并且可能更慢。