Пт, 26.04.2024, 13:06
Приветствую Вас Гость | RSS
Главная | Assembler - Форум | Регистрация | Вход
Форма входа
Логин:
Пароль:
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Форум » Технические форумы » MVS (OS/390, zOS) » Assembler
Assembler
XOpenДата: Чт, 03.09.2009, 19:19 | Сообщение # 1
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
Тут будут вопросы по сабжу. Первый мой:

Если программа вызывается из задания, то по адресу первого параметра (R1) появляется спереди еще 2 байта длины. Если вызывать из программы, то передается ровно так, как построил параметры. Есть ли общепринятый способ обработки таких различий? Как программа может определить откуда ее вызвали? (чтобы учитывать или неучитывать эти 2 байта)


Худая корова еще не газель!
 
BSVДата: Пт, 04.09.2009, 10:25 | Сообщение # 2
Рядовой
Группа: Проверенные
Сообщений: 10
Репутация: 0
Статус: Offline
Хороший вопрос.
Пока приходится анализировать первый байт параметров и если там значение какое-нибудь из ожидаемых, то делаю вывод, что вызов был из программы, если нет - то из задания.
В NATURAL-e (ADABAS), например, есть системная переменная, анализируя которую понимаешь откуда был вызов.
 
GregoryДата: Пт, 04.09.2009, 10:58 | Сообщение # 3
Генерал-майор
Группа: Доверенные
Сообщений: 479
Репутация: 22
Статус: Offline
Как именно рассматриваемая программа вызывается из другой программы? Если динамически (LINK/XCTL/ATTACH,LOAD+CALL), то определить это возможно многими способами, например, проверяя PRB (первый/не первый). Если программа совместно линкуется статически с вызывающей, 100% достоверно определить это нельзя.
Но вот только зачем вообще это делать?! У программы есть соглашения по вызову, описывающие вид и форму передаваемых параметров. Вы хотите сделать эти соглашения неоднозначными (если так - то так, а если так - то этак) , а это плохо. И вообще, программа с претензиями на "интеллектуальность" много хуже, чем программа с простыми и понятными функциями, это мое глубокое убеждение... Я не знаю ни одной стандартной программы, котороя бы реализовывала прием параметров подобным образом.
См, напрмер, SC26-7343-01 Utilities Appendix A, A.1 Building parameter lists.


Сообщение отредактировал Gregory - Пт, 04.09.2009, 12:04
 
XOpenДата: Пт, 04.09.2009, 19:09 | Сообщение # 4
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
Учитывая, что программа использует активно длину, возможно ее придется оставить. Однако народ хочет, чтобы некое сообщение в таком случае читалось не из ДД, а по параметру.

Один из вариантов был проверить если в первых 2х байтах не длина (буквы дадут большое число), то зачитать 2й парм. (JCL всегда дает только один парм)

Если оставлять длину, то как поределять? Запихнуть ключевое слово в первый параметр, а остальные сдвинуть?

или PRB почитать ?

думаю...


Худая корова еще не газель!
 
GregoryДата: Сб, 05.09.2009, 00:17 | Сообщение # 5
Генерал-майор
Группа: Доверенные
Сообщений: 479
Репутация: 22
Статус: Offline
Quote
Однако народ хочет, чтобы некое сообщение в таком случае читалось не из ДД, а по параметру.

В каком "таком"? При вызове из задания? ИЛи при вызове из программы?

Quote
Один из вариантов был проверить если в первых 2х байтах не длина (буквы дадут большое число), то зачитать 2й парм. (JCL всегда дает только один парм)

По общепринятому соглашению старший бит в списке параметров = 1 для последнего параметра, так что определить, сколько параметров передано - один или десять не составляет никакого труда...
Снова сошлюсь на SC26-7343-01 Utilities Appendix A, A.1 Building parameter lists. Все стандартные утилиты принимают режимы (options), и только их можно указать при вызове из задания, а при вызове из программы можно указать не только режимы, но и список альтернативных имен DD, управляющие операторы в памяти и начальный номер страницы, то есть один, два, три или 4 слова по адресу в R1. При вызове из REXX/CLIST можно передать список параметров в любом желаемом виде - address LINKMVS, address LINKPGM

Сообщение отредактировал Gregory - Сб, 05.09.2009, 00:29
 
XOpenДата: Ср, 16.09.2009, 20:22 | Сообщение # 6
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
Программа всю жизнь вызывалась(и будет) из JCL. Мне надо чтобы она еще + могла вызываться из программы.

JCL не ставит старший бит и не передает список ДД. Значит я не могу знать, у меня настоящий адрес в +4 или число с бодуна (получу С4 если полезу). И настоящий там старший бит или случайный...

Так что, только если через PRB. Вопрос - как узнать, что он не первый ?


Худая корова еще не газель!
 
GregoryДата: Чт, 17.09.2009, 11:55 | Сообщение # 7
Генерал-майор
Группа: Доверенные
Сообщений: 479
Репутация: 22
Статус: Offline
Программа:
IEFBR15 CSECT
USING *,15
LR 6,1
ABEND 666,DUMP
END

Вызов:
//LINK EXEC PGM=IEFBR15,PARM='AAA,BBB,CCC'
//STEPLIB DD DSN=xxxxx,DISP=SHR
//SYSUDUMP DD SYSOUT=*

Дамп:
REGISTERS AT ENTRY TO ABEND
GPR VALUES
0-3 80000000 8000029A 00000040 008D89D4
4-7 008D89B0 008FF358 00006FE8 FD000000

00006FE0 00000000 00000000 80006FEE 0000000B C1C1C16B C2C2C26B C3C3C300 00000000 *..........?.....AAA,BBB,CCC.....*
00007000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 *................................*

как видно из приведенного дампа, старший бит списка параметров установлен в 1 (80006FEE). Еще вопросы есть? smile

Сообщение отредактировал Gregory - Чт, 17.09.2009, 12:28
 
XOpenДата: Чт, 17.09.2009, 13:20 | Сообщение # 8
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
Да! Почему я такой тупой ? sad Я кажеться посмотрел на самый первый адрес (типа 00006FE8)

Худая корова еще не газель!
 
GregoryДата: Чт, 17.09.2009, 15:57 | Сообщение # 9
Генерал-майор
Группа: Доверенные
Сообщений: 479
Репутация: 22
Статус: Offline
smile ну и для уж совсем полной ясности:
Программа та же;

Вызов:
/* REXX */
PARM='AAA,BBB,CCC'
DD='SYSIN SYSPRINT'
address linkmvs 'IEFBR15 PARM DD'

GPR VALUES
0-3 80000000 8000029A 00000000 24507F5C
4-7 24507C90 05CE2F78 000068C8 000068C8

000068C0 00000000 00000000 000068D0 80006AC6 000BC1C1 C16BC2C2 C26BC3C3 C3000000 *...........}...F..AAA,BBB,CCC...*
000068E0 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 *................................*

00006AC0 00000000 00000010 E2E8E2C9 D5404040 E2E8E2D7 D9C9D5E3 00000000 00000000 *........SYSIN SYSPRINT........*

 
XOpenДата: Чт, 17.09.2009, 16:26 | Сообщение # 10
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
а вот если я вызываю

LINK EP=PROG2,PARAM=(PARM1,PARM2)

То вижу
R0 00000000 0000FFB8 E7C4C3C3 C1D3D340 *........XDCCALL *

+10 8f 0000FFD8 0000FFE5
+18 8f 45F0B02C 0000FFCC 00000000 C5D9D9F2

бита нет sad


Худая корова еще не газель!
 
GregoryДата: Чт, 17.09.2009, 16:44 | Сообщение # 11
Генерал-майор
Группа: Доверенные
Сообщений: 479
Репутация: 22
Статус: Offline
не стреляет, потому что не заряжено: smile
LINK EP=PROG2,PARAM=(PARM1,PARM2),VL=1
Specify VL=1 if the called program can be passed a variable number of parameters. VL=1 causes the macro to set the high-order of the last address parameter to 1.


Сообщение отредактировал Gregory - Чт, 17.09.2009, 16:49
 
XOpenДата: Пн, 21.09.2009, 15:42 | Сообщение # 12
Генерал-майор
Группа: Администраторы
Сообщений: 325
Репутация: 4
Статус: Offline
Шайтан !! surprised

Добавлено (21.09.2009, 15:42)
---------------------------------------------
Где почитать, сколько тактов занимает какая команда ? А то, кроме общих фраз, что RR быстре RX, как то и нет ничего. dry


Худая корова еще не газель!
 
Sha_LunДата: Ср, 03.08.2011, 13:54 | Сообщение # 13
Рядовой
Группа: Проверенные
Сообщений: 12
Репутация: 0
Статус: Offline
Подскажите, как читать из текстового файла с записями переменной длины строчки? Построчно.
 
AlexVДата: Чт, 04.08.2011, 10:15 | Сообщение # 14
Лейтенант
Группа: Проверенные
Сообщений: 58
Репутация: 0
Статус: Offline
Quote (Sha_Lun)
Подскажите, как читать из текстового файла с записями переменной длины строчки? Построчно.


Лучше всего использовать макросы (для чтения записи GET). Описание можно найти например здесь:
http://publibz.boulder.ibm.com/cgi-bin/bookmgr_OS390/Shelves/DGT2BK61
в книге z/OS V1R8 DFSMS Macro Instructions for Data Sets. Можно эту книгу поискать для других версий, но вряд ли там будут значительные изменения для твоего случая.
Примеры использования можно поискать на CBTTAPE (вообще хороший ресурс для обучения).
Мне навскидку попалась утилита ALEXCMDS, IEBLIST.
 
akostДата: Чт, 04.08.2011, 11:36 | Сообщение # 15
Admin
Группа: Администраторы
Сообщений: 617
Репутация: 5
Статус: Offline
Sha_Lun,
есть на русском языке книга Хусаинова древняя, по методам доступа ассемблерным. Она на 80% актуальна, ее можно у букинистов найти. Вечный источник знаний.
 
Форум » Технические форумы » MVS (OS/390, zOS) » Assembler
  • Страница 1 из 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • »
Поиск: