Передача данных с Ассемблера в UL |
Ответить | Страница <123> |
Автор | |
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
Опубликовано: 08 Март 2007 02:14 |
Немного добавлю. Чуть-чуть исправлюсь _DATA SEGMENT WORD PUBLIC 'DATA' USE16 Насчет множества сегментов данных - это для одного модуля. Все сказанное относится и к сегменту кода : _TEXT SEGMENT BYTE PUBLIC 'CODE' USE16 Если указан класс сегмента 'КЛАСС' , то линковщик в первую очередь располагает сегменты одного класса рядом, друг за другом. Если класс отсутствует, то сегменты с одинаковым именем _ИМЯ об'единяются в один сегмент. Ну а можно и вообще переписать ассемблерный код с упрощенными директивами сегментации, и об'явить 'большую' модель памяти LARGE, чтобы сформировать дальние адреса : .MODEL LARGE .DATA ; Сегмент данных .CODE ; Сегмент кода Упрощенные директивы возможно использовать потому, что как видно в исходнике на UL - применены стандартные для 16-ти разрядных DOS-программ имена сегментов. Ну если не прокатит - значит использовать стандартное об'явление сегментов. С переходом на 32-х разрядную среду надобность во всех этих сегментах отпадет - там одна плоская модель памяти FLAT. С уважением, SAN.
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|
Интересно, а Вы с программами UL разбирались? Откуда такие измышления: .CODE ; Сегмент кода <С переходом на 32-х разрядную среду надобность во всех этих сегментах отпадет - там одна плоская модель памяти FLAT.> Какая может быть модель памяти FLAT в 16 разрядной среде исполнения? Почитайте для начала раздел справки "Системные соглашения UltraLogik" из файла помощи UL. Привожу пример минимальной программы для ADAM 5510 на чистом ASM. Единственно, я использовал библиотеку собственного написания ADAM5510.LIb в которой реализован протокол обмена PlcNet (взамен стандартной из 80x86.LIB) ; ======================================= DGROUP group CONST,VARLIST,DATA,STORED ; ====================================== extrn $_InitDivErr:near ; ; ============================== SYSTEM segment byte public 'CODE' use16
STATUS_P1_0:
call STimer_disable ; Отключение сторожевого таймера (near) SYSTEM ends ; ========================================== CONST segment byte public 'DATA' use16 public $_CompileTime public $_NetNode CONST ends ; ===================================== ; Segment type: Pure data public ERR_SEG_NAME public INTEGER_TYPE public ERR_OFS_NAME public VX1_NAME public BOOLEAN_TYPE public UP_NAME public VIX1_NAME public VX2_NAME public VIX2_NAME public VIX3_NAME public VX3_NAME public $_CntNetworkVar ; ==================================== ; Сегмент 'DATA' public ERR_SEG_VAR ; ============================== ; Сегмент "Сохраняемые переменные" ; ========================== ; Сегмент "Стек" end Такую же программу и генерирует UL 16. |
|
Vel
|
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Понятно. В любом случае надо внимательно следить чтобы имена переменных и функций, тип доступа - NEAR или FAR, а так-же принадлежность к сегментам или группе - совпадали в разных модулях, чтобы при сборке (линковке) все срослось между собой. Одна из основных причин неработоспособности может быть в этом. С уважением, SAN.
|
|
Новичок Присоединился: 05 Март 2007 Категория: Kazakhstan Online Status: Offline Публикации: 14 |
|
Дело сдвинулось с мертвой точки..., только вместо статуса start, ставлю Stop (программа вызывается другой программой). В поле Public Name видно только имя процедуры, которая объявлена как Public (остальных, которые объявлены как EXTRN, не видно, так и должно быть?). Проэкт получился, но переменая, extrn DECSH1_VAR:far, своего значения не меняет.(Смотрю через PLCNET OPC Server). Проверю текст программы на АССАМе. Может там ошибка... |
|
Всё знать не возможно, но обовсем можно иметь понятие.
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|
<В поле Public Name видно только имя процедуры, которая объявлена как Public (остальных, которые объявлены как EXTRN, не видно, так и должно быть?)> Да, не Public процедуры и функции не видны в поле Public Name, Вы ведь вызываете какието основные функции (Public), а остальные (EXTRN) использует ваша процедура. При записи в переменную, у Вас должен быть обязательно установлен регистр ds на DGROUP. Здесь нюанс, если вы напрямую его установите: mov ds, seg DGROUP, то ничего не получится (для присоеденяемого obj). Поэтому в Вашем модуле необходимо в сегменте SYSTEM (перед кодом) объявить: SYSTEM segment byte public 'CODE' use16 А затем установить регист ds на DGROUP перед записью (считыванием) переменной: mov ds, word ptr cs:Seg_DGROUP ; устанавливаем ds:DGROUP И не забывайте, что ваша переменная (DECSH1) должна быть объявлена в UL, в таблице переменных, как глобальная (+ сетевая и т.д.). Это поместит переменную в сегмент DATA и Вы получите к ней доступ (см. пример программы выше). |
|
Vel
|
|
Новичок Присоединился: 05 Март 2007 Категория: Kazakhstan Online Status: Offline Публикации: 14 |
|
Учитывая весь выше изложеный материал, была написана програмка для получения данных с Ассе-ра в UL. Для проверки работоспособности програмки (зависает ли она или нет) в UL я создал простенькую програмку-счетчик. При каждом выполнение ( проходе) UL-пороги переменная (допустим Cо1) увеличивает своё значение на 1, дойдя до 100 сбрасывается в 1 и увеличивается занова. После каждого увеличения переменной запускается програмка для получение данных из Ассе-ра. Компилирую, запускаю, смотрю..., а результат 0. Т.е. переменая (DECSH1), которая должна получить данные из Асма, равна 0, а Со1 своё значение меняет исправно ( но быстро,хотя не в этом суть). Я урезал программку, оставив самое нужно ( отбросив работу с шифраторами) - результат тот же. Вот эта программка: DGROUP group _DATA, _BSS Что не так? И зачем сегменты _DATA и _BSS (они же вроде бы не используются?). Что это за сегмент nothing в строке assume ds:nothing?
|
|
Всё знать не возможно, но обовсем можно иметь понятие.
|
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Тут вот какое дело. gruppa GROUP _SEG1, SEG2, BUBU, _KUKU Здесь в операции SEG gruppa будет получен адрес сегмента _KUKU. Ну так конечно не делается, что если нужен адрес сегмента BUBU ? Директива ASSUME - еще одно средство работы с сегментами, и используется совместно с SEG, SEGMENT, NOTHING, GROUP. Сама ASSUME прямо ничего не делает, а указывает компилятору, так сказать, границы дозволенного, сообщая что в текущем сегменте тот или иной регистр будет связан с определенным сегментом. Вставляя её в определенном месте кода, можно сделать чтобы компилятор позволил то или иное обращение к области памяти через сегментные регистры, или же наоборот ужесточил контроль над доступом. Но об'явления ничего не делают, и в регистр надо явно загрузить сегмент. И тогда инструкция Можно применить и другие способы, сохраняя общий смысл. Разумеется, настройка регистра DS должна быть сделана и в UL ! Я пробовал исполнить Ваш код, практически в неизменном виде. Вместо UL, был имитирован некий головной модуль вызывающий процедуру SHIF. Сперва не сходилось, но после описанных изменений - заработало. С уважением, SAN. |
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|
Я не согласен с <sanwork> Адресс переменной в памяти приложения (20 бит) вычисляется на основании ds + offset <Переменная>. Поэтому ds должен указывать на начало сегмента данных (у нас это группа VARLIST,DATA,STORED) и тогда ds:DECSH1_var (ds + "смещение DECSH1_var в сегменте данных") укажет на адресс переменной в памяти! Уберите инструкцию assume ds:nothing после установки ds на сегмент данных (слово «NOTHING», означает отмену действия предыдущей assume для данного регистра). Если Вы не используете obj написанные на СИ, то используйте опцию "80x86 processors family compiler" в UL и тогда сегмент будет DATA (а не _DATA) и не надо объявлять _BSS (он для совместимости с СИ obj) DGROUP group VARLIST,DATA,STORED VARLIST segment byte public 'DATA' use16 end
Пример модуля для UL: |
|
Vel
|
|
Действительный член Присоединился: 08 Март 2006 Категория: Russian Federation Online Status: Offline Публикации: 440 |
|
Попробуем c реальным UL модулем, который Вы выложили. ASSUME DS:DGROUP - разрешает далее по коду загружать в DS адреса входящие в группу DGROUP, и особо ни к чему не обязывает. Может как-то случайно совпали адреса сегмнта данных и значение полученное SEG DGROUP ? А кстати, в каком же сегменте находится DECSH1_VAR ? Комбинации с сегментами - дело довольно сложное и тонкое, особенно при смешанных операциях с 16-ти и 32-х разрадными операндами. Хотелось бы прояснить этот вопрос на будущее. С уважением, SAN.
|
|
Профили участников
Послать частное письмо
Поиск публикаций участников
Посетить домашнюю страницу участника
Добавить в список приятелей
Действительный член Присоединился: 25 Апрель 2006 Категория: Russian Federation Online Status: Offline Публикации: 116 |
|
DECSH1_VAR находится в сегменте DATA (как и все глобальные переменные, посмотрите пример минимальной программы для ADAM 5510 на чистом ASM, выше в этом разделе) В VARLIST находятся имена сетевых переменных и их таблица смещений. В STORED находятся переменные с атрибутом "сохраняемые". И еще, реакция на ASSUME у TASM и MASM несколько различается, примеры obj написаны под TASM. |
|
Vel
|
|
Ответить | Страница <123> |
Переход на форум | Права доступа на форуме Вы не можете публиковать новые темы в этом форуме Вы не можете отвечать на сообщения в этом форуме Вы не можете удалять Ваши сообщения на этом форуме Вы не можете редактировать Ваши сообщения на этом форуме Вы не можете создавать голосования на этом форуме Вы не можете выражать своё мнение в голосованиях на этом форуме |