В чем разница между% define и equ в NASM? - PullRequest
12 голосов
/ 01 января 2012

Код:

  %define x 0x03
  x equ 0x03

В чем разница между ними?

1 Ответ

15 голосов
/ 01 января 2012

%define - гораздо более мощный способ создания макросов, похожий на препроцессор Си. В вашем упрощенном случае нет большой разницы, использование 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.

...