%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
.