NASM中%define和equ之间的区别是什么?

时间:2012-01-01 04:13:32

标签: nasm

代码:

  %define x 0x03
  x equ 0x03

它们之间的区别是什么?

1 个答案:

答案 0 :(得分:15)

%define是一种更强大的宏方式,类似于C预处理器。在您的简单情况下,没有太大区别,在源代码中使用x将导致常量3被替换。 equ语句在首次读取时被评估,并且在源中遇到%define宏时会对它们进行评估,这有一个细微差别。

您可以看到两个语句片段之间存在差异:

addr   equ       $
       %define   addr $

在这种情况下,addr在代码中遇到时会有不同的值。在第一种情况下,$将是equ所在地的装配位置。换句话说,它是定义的地方。

在第二种情况下,它会评估使用addr

的地方的装配位置。

%define闪耀的地方是:

%define thricexplusy(x,y) (3 * x + y)

或:

%define ctrl(c) (c & 0x1F)
: :
mov     al, ctrl('z')

(甚至更复杂的事情)允许您将参数传递给宏,这是简单的equ无法实现的。