Почти наверняка компилятор распознает _DS
как особую "переменную" и вместо извлечения содержимого этой переменной из того места, где хранятся переменные, он просто использует содержимое регистра сегмента данных напрямую.
Другими словами, a = b
может быть скомпилировано как:
mov ax, [0x12341234] // assuming b is at this location.
mov [0x56785678], ax // assuming a is at this location.
, тогда как a = _DS
может быть:
push ds // or, if available: mov ax, ds
pop ax
mov [0x56785678], ax // assuming a is at this location.