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

sam*_*sam 13 nasm

码:

  %define x 0x03
  x equ 0x03
Run Code Online (Sandbox Code Playgroud)

他们之间有什么区别?

pax*_*blo 16

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

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

addr   equ       $
       %define   addr $
Run Code Online (Sandbox Code Playgroud)

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

在第二种情况下,它计算到装配位置处,其中所述位置addr使用.

其中%define闪耀是这样的:

%define thricexplusy(x,y) (3 * x + y)
Run Code Online (Sandbox Code Playgroud)

要么:

%define ctrl(c) (c & 0x1F)
: :
mov     al, ctrl('z')
Run Code Online (Sandbox Code Playgroud)

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