Вопрос № 22631: чем отличается смещение от базы, что-то я запутался.
Что за адресация по базе со сдвигом.
Каково назначение регистра BP, чем же он отличается от SP
...
Вопрос № 22.631
чем отличается смещение от базы, что-то я запутался.
Что за адресация по базе со сдвигом.
Каково назначение регистра BP, чем же он отличается от SP
Приложение:
Отправлен: 25.06.2005, 11:21
Вопрос задал: Терсков Алексей Николаевич (статус: Посетитель)
Всего ответов отправлено: 3
Отвечает: ASMодей
Здравствуйте, Терсков Алексей Николаевич!
Посмотри здесь: http://zeroos.narod.ru/hard/cpu/intel/addr.htm
Ответ отправил: ASMодей (статус: Профессионал)
Отправлен: 25.06.2005, 12:36
Отвечает: Евгений Иванов
Здравствуйте, Терсков Алексей Николаевич!
это всё адреса. тебе нужен адрес, а он высчитывается по необходимости.
смещение, база - это всё числа. они суммируются для вычисления эффективного адреса.
ebp - обычный регистр, причём работает по умолчанию с сегментом SS, в отличии от других регистров общего назначения. ESP - указывает на вершину стека, тоже через SS.
--------- Что имеем - не храним, потерявши - плачем
Ответ отправил: Евгений Иванов (статус: Профессор)
Отправлен: 25.06.2005, 12:56 Оценка за ответ: 5 Комментарий оценки: А как конкретно использовать регистр bp и sp можете привести пример
Отвечает: Ayl
Здравствуйте, Терсков Алексей Николаевич!
Смещение - это константа, которая указывается непосредственно в команде, например:
mov ax, OFFSET label
OFFSET label - это как раз смещение метки label
База - это значение базового регистра (bx или bp). Используется при косвенной адресации. Например, mov ax, [bx] - загрузить в регистр ax содержимое памяти, адресуемое через регистр bx. Дополнительно можно указать и смещение: mov ax, [bx + 4].
Также есть еще индексные регистры di и si. Они также могут использоваться вместе с указанием смещения. Кроме этого, в строковых командах эти регистры автоматически изменяются для указания на следующее значение в строках.
Используя базовый и индексный регистры, а также смещение, можно сформировать такие варианты адресации:
mov ax, OFFSET label - только смещение
mov ax, [bx] - только база
mov ax, [bx + 4] - база + смещение
mov ax, [si] - только индекс
mov ax, [si + 4] - индекс + смещение
mov ax, [bx + si] - база + индекс
mov ax, [bx + si + 4] - база + индекс + смещение
Нельзя в одной команде использовать 2 базовых или 2 индексных регистра:
mov ax, [si + di]
mov ax, [bx + bp]
Кроме этого, в 32-разрядных режимах можно использовать комбинацию база + индекс*множитель + смещение, т.е.
mov ax, [ebx + 4*esi + 4]
Регистр BP отличается от регистра SP только тем, что регистр BP можно использовать где угодно и как угодно, а регистр SP аппаратно используется для доступа к стеку. Поэтому его использование затруднительно. Кроме того, регистр SP не может использоваться в качестве базового.
Использовать регистр BP можно, например, так:
push BP
mov BP, SP
mov AX, [BP + 6] - первый параметр в дальней процедуре
а можно просто как регистр для хранения любого значения.
Регистр SP можно использовать только для переопределения стека либо для резервирования/очистки в стеке места для локальных параметров процедуры:
push BP
mov BP, SP
sub SP, 100 - выделили в стеке 100 байт
...
add SP, 100 - восстановили
pop BP
ret
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Профессор)
Отправлен: 27.06.2005, 13:03