Вопрос № 48645: RETF достает со стека 2 слова (4 байта): смещение и сегмент для возврата в то место, откуда дальняя процедура вызывалась. Мы же имитируем вызов процедуры.
При вызове дальней процедуры в стек кладется сперва смещение, а затем - сегмент для в...
Вопрос № 48.645
RETF достает со стека 2 слова (4 байта): смещение и сегмент для возврата в то место, откуда дальняя процедура вызывалась. Мы же имитируем вызов процедуры.
При вызове дальней процедуры в стек кладется сперва смещение, а затем - сегмент для возврата
Почему мы вначале заносим сегмент (CS), а затем смещение (BX)?
Приложение:
Отправлен: 09.07.2006, 21:12
Вопрос задал: Platon (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Ayl
Здравствуйте, Platon!
Все правильно задается. В организации хранения многобайтных чисел в архитектуре процессоров x86 используется принцип "младшее слово по младшему адресу". Т.е. для хранения дальнего адреса в памяти сначала должно идти смещение (2 байта), потом - сегмент (тоже 2 байта).
Теперь вспомним, как устроен стек. Указатель стека после выполнения операции PUSH УМЕНЬШАЕТСЯ на 2! Т.е. стек "растет" от старших адресов к младшим. Т.е. для того, чтобы поместить в стек правильный дальний адрес надо сначала туда записать сегмент и только после этого - смещение.
Вторая строка твоего вопроса неверна: сначала помещается сегмент, потом смещение.
Кстати, если в COM-программе ты опишешь дальнюю процедуру, то компилятор будет ее вызывать следующим образом:
push cs
call My_Proc
Т.е. он просто помещает в стек адрес сегмента кода и потом вызывает процедуру как ближнюю.
--------- Трудное - то, что можно сделать немедленно. Невозможное - то, для выполнения чего требуется немного больше времени
Ответ отправил: Ayl (статус: Академик) Россия, Санкт-Петербург ICQ: 5163321 ---- Ответ отправлен: 10.07.2006, 12:47