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