Вот очень простое решение, которое было лучшим в моем случае:
private String getParent(String resourcePath) {
int index = resourcePath.lastIndexOf('/');
if (index > 0) {
return resourcePath.substring(0, index);
}
return "/";
}
Я создал простую функцию, меня вдохновил код File::getParent
. В моем коде нет проблем с обратными косыми чертами в Windows. Я предполагаю, что resourcePath
является ресурсной частью URL, без протокола, домена и номера порта. (например, /articles/sport/atricle_nr_1234
)
Я знаю, что jnc указывает, что мы выйдем из этого цикла, когда не будет переполнения переноса, т.е. CF = 0.
blockquote>Это не правильно.
JNC
будет прыгать, если CF = 0, что означает, что он будет прыгать, если нет беззнакового переполнения .Поскольку si должен указывать на индекс первого элемента списка, не будет ли это 80h? И затем, если si увеличивается, оно должно указывать на 70h. После их сложения ответ должен быть F0, верно?
blockquote>Пока да.
Однако, когда я запускаю кусок кода, я получаю значение AL равным 50. Как это возможно?
blockquote>
Чего мне не хватает?Возвращаемое значение 50h равно
80h + 70h + 60h = 50h + CARRY flag (unsigned overflow).
Пошагово это
80h + 70h = F0h (CF = 0 = JUMP) F0h + 60h = 50h (CF = 1 = NO JUMP = EXIT LOOP)
Таким образом, последнее добавление устанавливает флаг CARRY в
1
из-за переполнения без знака с FFh до 00h (F0h + 0Fh до F0h + 10h (и, наконец, 60h - 10h = 50h)). Поскольку флаг CARRY установлен, условный переходJNC
проходит, иAL
содержит значение «переполнения», равное 50h.
Чтобы ответить на заглавный вопрос (который едва связан с остальной частью вашего вопроса):
Куда указывает указатель 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-битное смещение работает как полный указатель. Неважно, какова фактическая база сегмента, потому что все относительно нее.