Given that the 8086/8088 was used in the IBM PC, and the Operating System on that was most often from Microsoft, Microsoft's assembler MASM was the de facto standard for many years. It followed Intel's syntax closely, but permitted some convenient but "loose" syntax that (in hindsight) only caused confusion and errors in code.
A perfect example is as follows:
MaxSize EQU 16 ; Define a constant
Symbol DW 0x1234 ; Define a 16-bit WORD called Symbol to hold 0x1234
MOV AX, 10 ; AX now holds 10
MOV BX, MaxSize ; BX now holds 16
MOV CX, Symbol ; ????
Does the last MOV
instruction put the contents of Symbol
into CX
, or the address of Symbol
into CX
? Does CX
end up with 0x1234
or 0x0102
(or whatever)? It turns out that CX
ends up with 0x1234
- if you want the address, you need to use the OFFSET
specifier
MOV AX, [Symbol] ; Contents of Symbol
MOV CX, OFFSET Symbol ; Address of Symbol