Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Решение проблемы доступа к верхним половинам регистров EAX и EDX при использовании счетчика времени в Turbo Pascal 7

Delphi , ОС и Железо , 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)

program HighPerformanceCounter;
{$APEXT "flat"}
uses
  Dos;

var
  LowWord: Word;
  HighWord: Word;
  ResultLow: Longint;
  ResultHigh: Longint;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Исполнение инструкции RDTSC для получения 64-битного счетчика
  // Использование префикса 66h для доступа к 32-битным регистрам
  {$ASM
    mov  ax, 066h
    mov  dx, 0C1h  // RDTSC инструкция с префиксом 066h для 32-битного доступа
  }

  // Извлечение значений из стека
  {$ASM
    pop  dword ptr [ResultLow]
    mov  eax, dword ptr [ResultLow]
    mov  LowWord, ax
    mov  HighWord, ah  // Верхняя половина EAX
    mov  eax, dword ptr [ResultLow+4]
    mov  HighWord, ax  // Верхняя половина EDX
  }

  // Здесь код для дальнейшей обработки полученных значений
end;
end.

Этот пример демонстрирует использование префикса 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 прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:56:43/0.0034739971160889/0