Чтобы ответить на заглавный вопрос (который едва связан с остальной частью вашего вопроса):
Куда указывает указатель SI, когда он указан для указания смещения?
В модели сегментированной памяти x86, почти указатели имеют смещения относительно базы сегмента. mov si, OFFSET symbol
устанавливает SI для смещенной части seg:off
адреса symbol
.
Если symbol
является меткой в разделе данных вашей программы, и вы используете [SI]
, тогда как DS
база сегмента = начало этого раздела, тогда [SI]
дает вам байт (ы) в symbol
как операнд памяти.
SI не указывает на смещение, оно содержит смещение после mov si, OFFSET symbol
. Этот является указателем.
В простой плоской модели памяти (например, 32- или 64-битный код) все использует base = 0, поэтому offset = linear address.
В 16-битном коде с «крошечной» моделью памяти (например, .com
) CS = DS = ES = SS, поэтому все ссылки на память используют одну и ту же базу. Опять же, только 16-битное смещение работает как полный указатель. Неважно, какова фактическая база сегмента, потому что все относительно нее.