Современные технологии автоматизации» («СТА») —  журнал для квалифицированных специалистов по промышленной автоматизации Форум СТА — современные технологии автоматизации Домашняя страница
Домашняя страница форума CTA Домашняя страница форума CTA > II. АСУТП и SCADA > Программное обеспечение
  Активные темы Активные темы
  FAQ FAQ  Искать в форуме   Зарегистрироваться Зарегистрироваться  Вход в систему Вход в систему

Передача данных с Ассемблера в UL

 Ответить Ответить Страница  <123
Автор
Сообщение
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Тема сообщения: Передача данных с Ассемблера в UL
    Опубликовано: 13 Март 2007 15:50

. Все перепробовал (текст программы скопировал подчистую). Програмку на Ассе-ре компилирую только TASMом. При компоновки exe-шника в опциях/Target Compiler использую 80x86 processors family compiler. Переменные все одинакового типа ( имеется в виду что в UL объявлены как глобальные и сетевые, только Со1-Integer, а DECSH1-Float) Эфект тот же. Co1 увеличивается, а DECSH1 =0 

В разделе Конфигурация:

Модель/Модель центрального процессора - IBM-PC Compatible CPU Card;

Модуль ЦПУ/Система команд 80386, Выравнивание - 16 бит, Сопроцессор - нет;

Модули УСО - ничего нет кроми Multi I/O Card;

Multi Card выбран компорт 1 (его базовый адрес и прерывание).

Вроде бы и ошибиться не где, а результата нет.

P.S.:Программка на UL, ASMe вместе с .ОBJ весят меньше 3 Кбайт

 

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 13 Март 2007 18:47

Кое что прояснилось.
Директива  GROUP  действительно влияет на формирование адресов. Ее действие заключается в задании смещений переменных внутри сегментов.
Без  GROUP  смещения переменных и меток устанавливаются обычным образом - от начала об'явленного сегмента, и чтобы обратиться к переменной надо загрузить какой-нибудь сегментный регистр адресом текущего сегмента :
...
push SEG _DATA_SEG
pop   es

mov  al,BYTE PTR es:[смещение_переменной_в_сегменте__DATA_SEG]  ; или просто имя переменной
...

Об'явление  GROUP  интересным образом перестраивает нумерацию адресов. Как-будто образуется некая общая область памяти, и смещения нумеруются непрерывно от начала этой области. Причем сами сегменты физически остаются на своих местах по сравнению с тем, когда они были не сгруппированы, только меняется как-бы система отсчета - некий прообраз локальной плоской модели памяти.
Отсчет начнется с того сегмента из перечисленных, который окажется первым при линковке (самым младшим). Если, например,  при об'явлении  DGROUP  VARLIST, DATA, STORED, раньше всех по тексту окажется  DATA, то с него и начнется отсчет. Выражение  SEG DGROUP  даст адрес начала этой области, то-есть сегмент  DSEG.
Сегменты группы совсем не обязательно должны располагаться рядом, друг за другом. Они могут чередоваться с сегментами не принадлежащими группе, например вперемежку код и данные. При этом сквозная нумерация покрывает и сегменты кода.
Интересно то, что если вызвать адрес сегмента, скажем  SEG DATA, то он и будет получен - то-есть  DATA  а не  DGROUP.

Из всего этого получается, что выражение  SEG DGROUP  совершенно корректно и даст нужный результат.
Кроме того, вовсе не нужно создавать локальную переменную и инициализировать её сегментным адресом :  Seg_DGROUP  DW  SEG DGROUP, а просто по ходу текста установить регистр  DS, и получить переменную :
...
push SEG DGROUP
pop   ds

mov  al,BYTE PTR VAR1
...

GROUP  как и другие директивы призвана повысить удобство работы. Но как всякая палка - аб двух концах, лишнее средство, в определенных случаях может может и усложнить дело, внести путаницу. Решать - по месту.

С уважением, SAN.

Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 13 Март 2007 19:12

Еще одно замечание.

Стандартный  TASM  ругается если сегментам дать имена  CONST  и  STACK  -  это зарезервированные слова.

С уважением, SAN.

 

Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Март 2007 05:18

<Стандартный  TASM  ругается если сегментам дать имена  CONST  и  STACK  -  это зарезервированные слова.>

Все правильно! Но в данной теме разговор идет о подключаемом к UL obj, поэтому Вам нет необходимости объявлять в своем модуле эти сегменты и компилируете вы TASM.

А по поводу моего примера программы для ADAM 5510 на ASM, то он компилируется MASM и проблем нет! В этом и особенность, подключаемые модули на TASM, полная программа на MASM.

И на счет ...
push SEG DGROUP
pop   ds

Не знаю почему, но я когда начинал делать программы для UL, то этот код не срабатывал и я пришел к <Seg_DGROUP  DW  SEG DGROUP>

Vel
Наверх
sanwork Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 08 Март 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 440
Свойства публикации Свойства публикации   Ответить, цитируя автора - sanwork Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 14 Март 2007 21:34

Да , MASM  компонует сегменты также как и  TASM, и сквозная нумерация смещений в группе сегментов такая же. И  MASM  вырабатывает более оптимальный по размеру файл программы.

MASM  не принимает команду  push SEG DGROUP. Но можно воспользоваться другой конструкцией, и локальную переменную заводить опять-же не обязательно :

...
mov  ax,SEG DGROUP
mov  ds,ax

mov  al, BYTE PTR DECSH1_VAR
mov  ah, BYTE PTR DECSH1_VAR+1
...

Подумаем еще.

С уважением, SAN.

 

Наверх
Vel_ Смотреть выпадающим
Действительный член
Действительный член


Присоединился: 25 Апрель 2006
Категория: Russian Federation
Online Status: Offline
Публикации: 116
Свойства публикации Свойства публикации   Ответить, цитируя автора - Vel_ Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 15 Март 2007 05:07

<RomanS>

Попробуйте поменять тип переменной. Сделайте DECSH1-Integer и перекомпилируйте программу. Возможно, из за нарушения структуры числа с плавающей запятой у вас и отображается 0. Попробуйте с типом Integer.

<sanwork>

Seg_DGROUP  DW  SEG DGROUP это не локальная переменная, это переменная объявленная в коде программы и действительна на протяжении всего периода работы программы. А локальные переменные создаются в стеке и действительны на время выполнения функции.

Vel
Наверх
RomanS Смотреть выпадающим
Новичок
Новичок
Аватар

Присоединился: 05 Март 2007
Категория: Kazakhstan
Online Status: Offline
Публикации: 14
Свойства публикации Свойства публикации   Ответить, цитируя автора - RomanS Ответить, цитируя автора -  ОтветитьОтвет Прямая ссылка на эту публикацию Опубликовано: 15 Март 2007 07:15

.........Ура!!! Заработала четко, как часы,сразу после того как переменую типа FLOAT( обрабатываемую в Ассе-ре) заменил на INTEGER в UL

Добью этот проэкт и перехожу на UL32. Там, как я видел, при выборе программы типа ext сам текст в UL писать можно, только язык выбрать нужно. И в obj компилировать не надо. Правда там могут быть свои особенности, но проблемы надо решать по мере их возникновения...

P.S.: Большое спасибо за помощь и участие...

Всё знать не возможно, но обовсем можно иметь понятие.
Наверх
 Ответить Ответить Страница  <123

Переход на форум Права доступа на форуме Смотреть выпадающим

Bulletin Board Software by Web Wiz Forums® version 9.64
Powered by Web Wiz Forums Free Express Edition
Copyright ©2001-2009 Web Wiz