DS - регистр сегмента данных - как и все регистры сегментов, его значение, умноженное на 16, представляет собой базовый адрес фрагмента памяти 64 КБ.
При выполнении инструкций адреса памяти рассчитываются путем взятия базового адреса, представленного регистром сегмента (по умолчанию регистр DS используется для данных), и добавления значения смещения, заданного константой или регистром.
Итак, mov ax, [si]
эквивалентно mov ax, [ds:si]
, которое (с вашими значениями регистра) представляет mov ax, [3000:200]
. Внутри процессор вычислит абсолютный адрес памяти (3000 * 16) +200 и скопирует данные из этой ячейки памяти в ax
. Аналогичная процедура используется для доступа к памяти при добавлении и сохранении результата.
Причина, по которой вы не можете это сделать mov ds, 3000
, заключается в том, что Intel решила не поддерживать перемещение постоянных значений в сегментные регистры - для этого нет кодируемой инструкции. вместо этого вы должны передать значение через другой регистр (в вашем коде используется ax
).
Ваше (оригинальное) описание не совсем верно - код добавляет значения в [3000: 200] и [3000: 202], но результат будет сохранен в [3000: 204] (не [3000: 202]).
Не забывайте: значения, хранящиеся в сегментных регистрах, таких как DS (и CS, ES, FS и GS), не указывают базовый адрес напрямую - их всегда нужно умножить на 16, чтобы получить реальный базовый адрес.