Куда указывает указатель SI, когда он указан для указания смещения?

Вот очень простое решение, которое было лучшим в моем случае:

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)

0
задан Peter Cordes 17 March 2019 в 23:44
поделиться

2 ответа

Я знаю, что jnc указывает, что мы выйдем из этого цикла, когда не будет переполнения переноса, т.е. CF = 0.

Это не правильно. JNC будет прыгать, если CF = 0, что означает, что он будет прыгать, если нет беззнакового переполнения .

Поскольку si должен указывать на индекс первого элемента списка, не будет ли это 80h? И затем, если si увеличивается, оно должно указывать на 70h. После их сложения ответ должен быть F0, верно?

Пока да.

Однако, когда я запускаю кусок кода, я получаю значение AL равным 50. Как это возможно?
Чего мне не хватает?

Возвращаемое значение 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.

0
ответ дан zx485 17 March 2019 в 23:44
поделиться

Чтобы ответить на заглавный вопрос (который едва связан с остальной частью вашего вопроса):

Куда указывает указатель SI, когда он указан для указания смещения?

В модели сегментированной памяти 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-битное смещение работает как полный указатель. Неважно, какова фактическая база сегмента, потому что все относительно нее.

0
ответ дан Peter Cordes 17 March 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: