Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 00:51   #1
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию Вопрос по дальнему переходу

Доброго времени суток,
рассматриваю один пример из книги по смене режима процессора и перехода в другой сегмент, который бы работал в защищённом режиме. Есть всего один вопрос по команде дальнего перехода.
Упрощённый код:
Код:
RM_seg segment para public "code" use16
  ...
start:
  ...
  ;Вычислить линейный адрес PM_entry
  xor eax,eax
  mov ax,PM_seg
  shl eax,4
  add offset PM_entry
  mov dword ptr pm_entry_off,eax
  ...
  ;Дальний переход в PM_entry
                   db 66h
                   db 0EAh
pm_entry_off       dd ?
                   dw SEL_flatCS
  ...
RM_return:
  ...
  ;Таблица GDT
  GDT label byte
  ...
  GDT_flatCS db 0FFh,0FFh,0,0,0,10011010b,11001111b,0
  ...
  ;Селекторы
  ...
  SEL_flatCS equ 00001000b
  ...
RM_seg ends
PM_seg segment ... use32
  ...
PM_entry:
  ...
  db 0EAh
  dd offset RM_return
  dw SEL_16bitCS
PM_seg ends
end start
Не могу понять, почему в первом дальнем переходе мы в метку для смещения заносим не смещение, как во втором случае, а линейный адрес метки PM_entry целиком?
Ang15 вне форума Ответить с цитированием
Старый 16.10.2011, 08:30   #2
haruhi
Форумчанин
 
Аватар для haruhi
 
Регистрация: 05.10.2011
Сообщений: 368
По умолчанию

после включения защищённого режима (моv cr0, eax) процессор перестанет транслировать адрес по формуле (seg shl 4) + offset, поэтому для того чтобы прыжок произошёл правильно, необходимо его вручную конвертировать в линейный.
а во втором случае, после выключения защищённого режима, при выполнении инструкции
Код:
  
  db 0EAh
  dd offset RM_return
  dw SEL_16bitCS
процессор сам конвертирует логический адрес в линейный
Не стоит будить спящего Бога! (с) Меланхолия Харухи Судзумии
haruhi вне форума Ответить с цитированием
Старый 16.10.2011, 22:52   #3
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Ну да. В принципе, если анализировать дескриптор GDT_flatCS для сегмента PM_seg, то у него база = 0, а лимит - 4 Гбайта. Т.е. 32-разрядный линейный адрес будет служить и как смещение. Или не совсем так?
Ang15 вне форума Ответить с цитированием
Старый 16.10.2011, 23:46   #4
Ang15
Пользователь
 
Регистрация: 02.07.2011
Сообщений: 38
По умолчанию

Дошло. База дескриптора GDT_flatCS не совпадает со значением PM_seg в реальном режиме. Надо значение константы PM_seg сделать у дескриптора базой и тогда можно использовать смещение.
Ang15 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос по mySQL + Вопрос по RichEdit HTL Общие вопросы Delphi 4 01.01.2010 20:22
Вопрос наверное про функции, а так точно даже не знаю про что. (Вопрос начинющего #6) Albert2008 Общие вопросы Delphi 4 21.08.2008 15:33
вопрос по сокетам и общение как в ICQ.Сложный вопрос... Руслантус Общие вопросы C/C++ 2 12.08.2008 21:10
Вопрос по с++ JOFRIF Помощь студентам 2 02.05.2008 20:01