The problem here is that you're trying to do arithmetic on a value that is only known at link time.
"int0_handler" is the address of the int0_handler function, right? And that should be constant at run-time, right? Sure; code like this:
Code:
lea eax, [int0_handler]
will assemble to:
Code:
lea eax, [0x12345678]
But it's up to the linker to do the patching.
Ordinarily you can do arithmetic on constant expressions in NASM, and that's quite useful. You can also do some arithmetic on addresses like these, but it's restricted to adding and subtracting constant offsets. Why? Because NASM can't handle the arithmetic itself -- remember, this value will be patched by the linker. And the linker can't handle arithmetic like >> and <<: it can only add and subtract.
Basically, you can't do this.