Hi,
With NASM (all versions) it won't allow operations to be performed on labels, as the labels are relative to something rather than usable (scalar) values. To convert a label into a scalar value you need to do something like:
Code:
%define codeBaseAddress 0x012345
org codeBaseAddress
dw ( ((%1-$$)+codeBaseAddress) >> 16)
This works because "(%1 - $$)" is the same as "offset_within_section - offset_within_section", which is a scalar number, and "(scalar_difference + scalar_value)" is also a scalar number. It's messy, but you end up shifting a scalar number rather than the offset within a section

.
In the NASM manual, see section "10.1.4 TIMES Doesn't Work". It's not an obvious place to look but describes the same problem and the same solution (note: the manual is talking above code where ORG=0, or where the "codeBAseAddress" above wouldn't be needed).
@rae: your macro isn't shifting the address of a label - it works because it's shifting a scalar value.
Cheers,
Brendan