Almost certainly, the compiler recognises _DS as a special "variable" and, instead of extracting the contents of that variable from wherever variables are stored, it just uses the contents of the data segment register directly.
In other words, a = b might be compiled as:
mov ax, [0x12341234] // assuming b is at this location.
mov [0x56785678], ax // assuming a is at this location.
whereas a = _DS may be:
push ds // or, if available: mov ax, ds
pop ax
mov [0x56785678], ax // assuming a is at this location.
0
Mario
On
It's a compiler defined macro (I assume this due to the upper case only name). The leading _ usually tells you it being compiler specific. So once the preprocessor runs it will insert its own code that will essentially return the current value of DS.
Almost certainly, the compiler recognises
_DS
as a special "variable" and, instead of extracting the contents of that variable from wherever variables are stored, it just uses the contents of the data segment register directly.In other words,
a = b
might be compiled as:whereas
a = _DS
may be: