![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Решение проблемы доступа к верхним половинам регистров EAX и EDX при использовании счетчика времени в Turbo Pascal 7Delphi , ОС и Железо , WindowsВопрос, поднятый пользователем, заключается в доступе к верхним половинам регистров EAX и EDX при работе с высокопроизводительным счетчиком времени (Performance Counter) в программе на Turbo Pascal 7. Это 16-битная среда, которая запускается в DOS-боксе под управлением Windows XP. Счетчик времени можно инициализировать с помощью инструкции RDTSC, которая загружает в регистры EAX и EDX значения 64-битного счетчика. Однако, поскольку Turbo Pascal 7 работает в 16-битном режиме, пользователь столкнулся с проблемой доступа к верхним 32 битам этих регистров. Описание проблемыПри использовании инструкции RDTSC в программе на Turbo Pascal 7, выполняемой в DOS-боксе под Windows XP, пользователь получает доступ к нижним половинам регистров EAX и EDX, но сталкивается с проблемой извлечения и использования верхних половин этих регистров для записи результата в глобальные переменные типа longword. Альтернативный ответДля работы с 32-битными регистрами в DOS можно использовать DOS-расширитель или режим "flat real mode". DOS-расширитель позволяет писать программы для защищенного режима, в то время как "flat real mode" представляет собой что-то вроде 32-битного реального режима. Существует вероятность, что это не сработает в DOS-боксе, но возможно, что DOS-эмулятор окажется успешным. Известно, что Borland Pascal имел собственный DOS-расширитель, например, RTM.EXE или подобное. Переход на "flat real mode" может быть выполнен с помощью соответствующих инструкций и префиксов. Подтвержденный ответСогласно документации, для доступа к 32-битным регистрам из реального режима можно использовать префикс 0x66 перед инструкцией. Это позволит, например, инлайновому коду "$66 $50" поместить значение EAX в стек как 32-битное значение. Затем нижнюю и верхнюю половины можно извлечь из стека как две обычные 16-битные инструкции "pop". Для регистра EDX следует использовать инструкцию "$52" вместо "$50". Пользователь также отметил, что предшествование инструкции перемещения значения в глобальную переменную longword командой "$66" также должно работать, что было подтверждено на практике. Решение проблемыИспользование префикса 0x66 перед инструкцией позволяет обращаться к 32-битным регистрам в 16-битном коде. Это возможно как в реальном режиме, так и в режиме эмуляции реального режима (VM86 mode), в котором работает DOS-бокс под управлением Windows XP. Также существуют защищенные 16-битные режимы, такие как "стандартный режим" в Windows 3.0. Пример кода на Object Pascal (Delphi)
Этот пример демонстрирует использование префикса 0x66 для доступа к 32-битным регистрам в 16-битной программе на Turbo Pascal. Обратите внимание, что код должен быть адаптирован под конкретные требования вашей программы и среды выполнения. В данной статье был рассмотрен и решён вопрос доступа к верхним половинам регистров EAX и EDX в программе на Turbo Pascal 7 с использованием высокопроизводительного счетчика времени. Предложенное решение включает использование префикса 0x66 для работы с 32-битными регистрами в 16-битной среде. Пользователь сталкивается с проблемой доступа к верхним половинам 32-битных регистров EAX и EDX в программе на Turbo Pascal 7, работающей в 16-битном режиме в DOS-боксе под Windows XP, при использовании счетчика времени с помощью инструкции RDTSC. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |