The other day a friend of mine asked me to code a decimal-to-hex-converter in MASM using DOS ISRs (Interrupt Service Routine) for I/O. Well, I just gave her the equivalent C code since I am not into proprietary software. But, anyway I googled for some materials related to MASM syntax and DOS ISRs for I/O . Upon reading some examples of using DOS ISR 21h, I stumbled upon the use of
LEA dx, var and
MOV dx, OFFSET var. So, I decide to have a look into them and come up with the following conclusion.
First, the keyword OFFSET is not an x86 instruction. It is a keyword in MASM to take the address of a variable . In C, the OFFSET keyword of MASM is the equivalent of
& in, for example,
Second, for the simplest case of moving an address into a register, the following instructions have the same effect :
mov dx, offset var
lea dx, var
Finally, in addition to its original purpose of doing pointer arithmetic, however, LEA can be harnessed to perform integer addition and multiplication in a way that is faster than using ADD and MUL  and in a way that allows the result to be stored in a register other than the source register .