Вопрос № 146472: Здравствуйте! Вопрос о прыжке с другой сегмент. Каким образом меняется cs? Вобщем вот программа (написана по книге Калашникова на FASM: <div style="margin:15px; margin-top:10px"><div><b><font color="gray">Код:</font></b></div><pre style="..."Вопрос № 146579: Доброго времени суток, уважаемые эксперты. Помогите пожалуйста с такой задачей на MASM32: Задана произвольная последовательность
латинских букв из 18 символов. Выполнить сортировку по алфавиту. Благодарен Вам за помощь....
Вопрос № 146.472
Здравствуйте! Вопрос о прыжке с другой сегмент. Каким образом меняется cs? Вобщем вот программа (написана по книге Калашникова на FASM:
Lab_return: push cs push cs pop ds pop es mov
ah, 1Ah mov dx, 80h int 21h ret
Finish: ; или ; Finish = $ ; т.к. у FASM'а синтаксис чуть отличается от MASM/TASM
программа работает нормально, но я никак не могу понять... в строке jmp dword [cs:Off_move] мы прыгаем в другой сегмент на адрес, указываемый Off_move (это понятно)., но ведь cs на на момент выполнения этой инструкции прежний (в моём случае 10FEh), а никак не 0BF00h (т.е. 7-я страница видеопамяти).
Из
книги: Нам осталось прыгнуть на адрес 0BF00:IP. Как известно, CS:IP всегда показывают текущее операцию (адрес текущей операции). Обратите внимание, как мы прыгаем:
jmp dword ptr cs:[Off_move]
Посмотрите, что содержит переменная Off_move, а также посмотрите в отладчике, что будет происходить с регистрами CS:IP. Все станет на свои места... Подсказка: начиная с метки Lab_jmp мы работаем в области 7-ой видеостраницы...
как мы прыгаем
я вижу, что происходит с регистрами CS:IP я тоже вижу, CS меняется на 0BF00h, а IP на смещение Lab_jmp. Объясните дураку, пожалуйста, почему меняется CS?
ЗЫ сначала я думал, что меняется оттого, что в es вы загрузили Off_move, т.е. 0BF00h, попытка вида:
Код:
push
cs pop es
т.е. чтобы оба регистра указывали на текущее смещение, не увенчалась успехом( jmp dword ptr cs:[Off_move] всёрано прыгает в другой сигмент, хоть убейте, не пойму почему((
ЗЫЫ если можно, по-подробнее объясните..
Зарание огромное спасибо!
Отправлен: 08.10.2008, 17:21
Вопрос задал: Alexeyk (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 2)
Отвечает: Зенченко Константин Николаевич
Здравствуйте, Alexeyk!
Выполняя команду дальнего перехода jmp dword ptr cs:[Off_move] процессор считывает двойное слово по адресу Off_move. Поэтому адресу в памяти хранится два слова по 16-ть бит.
Код:
Off_move dw Lab_jmp Seg_move dw 0BF00h
Первое
слово указывает адрес смещения в сегменте, а второе - указывает на адрес сегмента. Именно поэтому у Вас изменяется регистр CS, т.к. во втором слове прописано 0BF00h.
Удачи!
--------- Итерация от человека, рекурсия — от Бога (Питер Дойч)
Ответ отправил: Зенченко Константин Николаевич (статус: Профессор) Украина, Киев Тел.: +380979536619 Адрес: Украина г.Киев ---- Ответ отправлен: 08.10.2008, 17:51 Оценка за ответ: 5
Вопрос № 146.579
Доброго времени суток, уважаемые эксперты. Помогите пожалуйста с такой задачей на MASM32: Задана произвольная последовательность латинских букв из 18 символов. Выполнить сортировку по алфавиту. Благодарен Вам за помощь.