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: местоположение команды в исходнике |
Вот реализуете, и уже никто не скажет, что у нас нет пошагового отладчика |
Автор: | ___ [ Пятница, 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/ |