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