The object code doesn't contain the address in memory because that address can't be known at assembly/link time.
The memory address to be modified isn't known until the time the instruction is executed. The opcodes say, "get the address to be modified from the EDX register, rather than from the opcode bytes."
Let's look at the opcode bytes.
C6 05 xx xx xx xx FF <-- store the value at address xx xx xx xx
C6 02 FF <-- store FF at the address held in the EDX register
So instead of getting the address from the opcodes, the CPU gets the destination address from the EDX register.
Another thing to think about. This code:
mov edx, offset smallCounter
mov byte ptr [edx], 100
does the same thing as
mov byte ptr [smallCounter], 100
Well, except that the former modifies the EDX register. But both store the value 100 in memory at smallCounter
.
That help clarify things?