OberonCore
https://forum.oberoncore.ru/

местоположение команды в исходнике
https://forum.oberoncore.ru/viewtopic.php?f=2&t=4179
Страница 1 из 1

Автор:  ___ [ Четверг, 06 Декабрь, 2012 22:49 ]
Заголовок сообщения:  местоположение команды в исходнике

добрый день.

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

т.е. где-то хранится информация, соответствие скомпилированной команды и ее расположении в исходнике?
как можно добраться?
нужно для такого эксперимента:
у исполнителя есть команды, если показываем в замедленном режиме анимацию робота(через Services.DoLater), то хотелось бы еще и команду, вызванную в этот момент подсвечивать в исходнике.

Автор:  Илья Ермаков [ Четверг, 06 Декабрь, 2012 23:28 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

Копните по направлению Kernel.SourcePos.

Автор:  Пётр Кушнир [ Пятница, 07 Декабрь, 2012 00:19 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

Вот реализуете, и уже никто не скажет, что у нас нет пошагового отладчика :twisted:

Автор:  ___ [ Пятница, 07 Декабрь, 2012 10:04 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

Илья Ермаков писал(а):
Копните по направлению Kernel.SourcePos.

c Kenel сложно разбираться тк не документирован...

PROCEDURE SourcePos (mod: Module; codePos: INTEGER): INTEGER;
видимо возвращает позицию в исходнике модуля по позиции в кодовом файле?

кернел.модуль можем получить по имени модуля процедурой:
PROCEDURE ThisMod (IN name: ARRAY OF CHAR): Module;

а откуда получить codePos?

Автор:  Alexander Shiryaev [ Пятница, 07 Декабрь, 2012 12:24 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

Код:
MODULE TmpSourcePos;

   IMPORT SYSTEM, Log, Kernel;

   CONST
      modName = "TmpSourcePos";

   PROCEDURE P;
   BEGIN
      Log.Int(934); Log.Ln
   END P;

   PROCEDURE Do*;
      VAR pc: INTEGER;
         mod: Kernel.Module;
   BEGIN
      pc := SYSTEM.ADR(Do);

      mod := Kernel.ThisMod(modName);

      Log.Int(Kernel.SourcePos(mod, pc - mod.code)); Log.Ln
   END Do;

END TmpSourcePos.

Автор:  Иван Кузьмицкий [ Пятница, 07 Декабрь, 2012 12:45 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

___ писал(а):
c Kenel сложно разбираться тк не документирован...
Посмотрите в http://oberoncore.ru/wiki/blackbox/kernel , может быть там есть всё необходимое?

Автор:  ___ [ Пятница, 07 Декабрь, 2012 14:27 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

Alexander Shiryaev писал(а):
Код:
MODULE TmpSourcePos;

   IMPORT SYSTEM, Log, Kernel;

   CONST
      modName = "TmpSourcePos";

   PROCEDURE P;
   BEGIN
      Log.Int(934); Log.Ln
   END P;

   PROCEDURE Do*;
      VAR pc: INTEGER;
         mod: Kernel.Module;
   BEGIN
      pc := SYSTEM.ADR(Do);

      mod := Kernel.ThisMod(modName);

      Log.Int(Kernel.SourcePos(mod, pc - mod.code)); Log.Ln
   END Do;

END TmpSourcePos.


модуль выдает число близкое к началу процедуры, но все равно не понятно, как работает:
почему если подставить pc := SYSTEM.ADR(Do); вместо Do -> P то будет выдавать нули?
почему "pc - mod.code" если "Возвращает позицию в исходном коде для машинной инструкции. mod - модуль, codePos - смещение от начала секции кода модуля (mod.code). "

Иван Кузьмицкий
спасибо за ссылку, всяко лучше, чем просто исходник. но пока не понятно%)

"Секция кода содержит исполняемый код процедур модуля."
"csize-: INTEGER - Размеры секции кода"
"code-: INTEGER - Указатели на начало секции кода"
указатель(адрес) в памяти если модуль загружен? или адрес(позиция) в кодовом файле модуля(если в начале кодового файла др инфа еще лежит)?
для чего:
"procBase-, varBase-: INTEGER
Базовые адреса для вычисления смещений процедур и переменных соответственно. "?

Автор:  ___ [ Пятница, 07 Декабрь, 2012 17:13 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

___ писал(а):
почему "pc - mod.code" если "Возвращает позицию в исходном коде для машинной инструкции. mod - модуль, codePos - смещение от начала секции кода модуля (mod.code). "


видимо mod.code - адрес начала кодовой части модуля в памяти
SYSTEM.ADR(P) - адрес процедуры (которая лежит в кодовой части, т.е. дальше начального адреса)
процедуре же требуется смещение (от начала кодовой части), поэтому "pc - mod.code"

Автор:  ___ [ Пятница, 07 Декабрь, 2012 17:25 ]
Заголовок сообщения:  Re: местоположение команды в исходнике

попробовал такой модуль:
Код:
MODULE TmpSourcePos;
IMPORT SYSTEM, Log, Kernel;
CONST
modName = "TmpSourcePos";
PROCEDURE P;
BEGIN
Log.Int(934); Log.Ln;
END P;
PROCEDURE Do*;
VAR pc: INTEGER;
mod: Kernel.Module;
i:INTEGER;
BEGIN
P;
pc := SYSTEM.ADR(P);
mod := Kernel.ThisMod(modName);
FOR i :=0  TO 150 DO
Log.Int(Kernel.SourcePos(mod,i)); Log.Ln   
END;
END Do;

выдал адреса:
"TmpSetPos.SetCaret(100)"
"TmpSetPos.SetCaret(114)"
"TmpSetPos.SetCaret(122)"
"TmpSetPos.SetCaret(198)"
"TmpSetPos.SetCaret(201)"
"TmpSetPos.SetCaret(222)"
"TmpSetPos.SetCaret(258)"
"TmpSetPos.SetCaret(275)"
"TmpSetPos.SetCaret(309)"
"TmpSetPos.SetCaret(317)"
"TmpSetPos.SetCaret(272)"
:

MODULE TmpSourcePos;
IMPORT SYSTEM, Log, Kernel;
CONST
modName = "TmpSourcePos";
PROCEDURE P;
BEGIN
Log.Int(934); Log.Ln;
END P; ------------------------------------тут скрытый ретурн?
PROCEDURE Do*;
VAR pc: INTEGER;
mod: Kernel.Module;
i:INTEGER;
BEGIN
P;
pc := SYSTEM.ADR(P);
mod := Kernel.ThisMod(modName);
FOR i :=0 TO 150 DO------------------------------присваивание переменной(258) и скрытая проверка(272)?
Log.Int(Kernel.SourcePos(mod,i)); Log.Ln
END;--------------------------------------------------------------goto на начало цикла?
END Do; -------------------------------------------------------------нету ретурна как в процедуре P?

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/