откуда программа может знать где окажутся ее данные чтобы самой указать это значение?
Она не может знать до загрузки, поэтому все сегментные части адресов записаны как смещения относительно начала программы, т.е. как будто программа будет загружена по адресу 0. EXE-файл содержит таблицу релокаций, это массив смещений относительно начала программы, по которым находятся сегментные части адресов. Загрузчик EXE-файла проходит по этому массиву и прибавляет к словам в памяти фактический сегментный адрес, по которому программа загружена.